Mengembalikan repositori Git jarak jauh

111

Saya memiliki repositori Git jarak jauh, dan saya perlu mengembalikan nkomitmen terakhir hingga terlupakan.

Jake
sumber

Jawaban:

135

Kamu bisa memakai git revert <commit>… untuk semua n komit, lalu mendorong seperti biasa, menjaga riwayat tidak berubah.

Atau Anda dapat "memutar kembali" dengan git reset --hard HEAD~n. Jika Anda mendorong dalam repositori publik atau bersama, Anda mungkin menyimpang dan merusak pekerjaan lain berdasarkan cabang asli Anda. Git akan mencegah Anda melakukannya, tetapi Anda dapat menggunakannya git push -funtuk memaksa pembaruan.

elmarco
sumber
5
Anda dapat melakukan rollback ke komit tertentu dengan menggunakan: di git reset --hard [sha1]mana sha1 adalah pengenal hash komit.
pisaruk
7
Anda tidak dapat menggunakan get reset --hard di repositori jarak jauh karena tidak ada direktori yang berfungsi. Pertanyaan awal hanya menyatakan ada remote repo, tidak ada local repo disebutkan.
Hazok
2
hanya sebuah catatan, git push -f akan memaksa mendorong semua cabang lokal ke remote mereka
cowlinator
Harap diingat, bahwa penggunaan revertakan menyebabkan cabang fitur Anda diperlakukan sebagai "sudah" digabungkan. Itu karena cabang-cabang ini sebenarnya sedang digabungkan. Tapi perubahan itu dikembalikan. Solusi: Pilih ceri atau kembalikan komit pengembalian .
Benedikt
@Benedikt apakah reset --hardjuga menyebabkan cabang fitur diperlakukan sebagai sudah digabungkan? Asumsi saya adalah tidak akan (kemana revert).
Marcus Leon
37

elmarco benar ... sarannya adalah yang terbaik untuk repositori bersama / publik (atau, setidaknya cabang publik). Jika tidak dibagikan (atau Anda bersedia mengganggu orang lain), Anda juga dapat mendorong ref tertentu:

git push origin old_master:master

Atau, jika ada commit SHA1 tertentu (katakanlah 1e4f99e dalam bentuk singkat) Anda ingin kembali ke:

git push origin 1e4f99e:master
Pat Notz
sumber
9

Untungnya saya berada dalam posisi untuk menggunakan solusi Pat Notz yang sepenuhnya menghapus komit yang tidak diinginkan. Namun, awalnya saya mendapatkan error tersebut

error: failed to push some refs to 'ssh://[email protected]'
To prevent you from losing history, non-fast-forward updates were rejected*

Tetapi menambahkan opsi force ( -f) akan menimpa kesalahan ini

git push -f origin 52e36b294e:master
geedoubleya.dll
sumber
3

Jika Anda memiliki akses langsung ke repo jarak jauh, Anda selalu dapat menggunakan:

git reset --soft <sha1>

Ini berfungsi karena tidak ada upaya untuk mengubah direktori kerja yang tidak ada. Untuk lebih jelasnya silakan lihat jawaban aslinya:

Bagaimana saya bisa membatalkan komit terakhir di repositori git bare?

Hazok
sumber
2
Mengapa --softbahkan perlu? Anda mungkin bisa melakukan hal yang sama hanya dengan polos git reset, tanpa tanda mode.