Bagaimana saya bisa mengembalikan repositori github ke komit tertentu?

431

Github saya memiliki 100 commit di dalamnya sekarang. Saya perlu mengembalikan repositori ke komit 80, dan menghapus semua yang berikutnya.

Mengapa? Repo ini seharusnya untuk penggabungan dari pengguna lain-lain. Sekelompok gabungan masuk sebagai komit dari saya, karena pengeditan yang berlebihan. Itu karena kesalahan label pada cabang jarak jauh saya, di mana 3 pengembang diberi label satu sama lain. Saya perlu mengatur ulang ke titik itu, dan kemudian tarik ke depan.

Saya ingin rebase, seperti dalam contoh ini: Bagaimana saya bisa menghapus komit di GitHub?

Namun, git ingin saya melakukan banyak manajemen konflik. Apakah ada cara yang lebih sederhana?

Jonathan Vanasco
sumber

Jawaban:

883
git reset --hard <old-commit-id>
git push -f <remote-name> <branch-name>

Catatan: Seperti yang ditulis dalam komentar di bawah ini, Menggunakan ini berbahaya di lingkungan kolaboratif: Anda sedang menulis ulang sejarah

jtdubs
sumber
43
orang, lakukan git push -f origin branch. Saya hanya memiliki waktu yang buruk, karena saya melewatkan itu.
Sumit M Asok
21
WASPADALAH terhadap ini! Anda akan kehilangan semua komitmen Anda secara lokal, dan jika Anda mendorong tidak akan ada jalan kembali
Thomas
8
Itu tidak benar, Anda bisa mendapatkan komitmen lama menggunakan git reflog
Jan Schaefer
27
Anda mungkin perlu melakukan git push origin HEAD --forcealih - alih git push -f origin branchkarena itu memberi saya error: src refspec branch does not match any.kesalahan
sprocket12
1
Yap, terima kasih kawan. Saya berhasil melakukan apa yang saya inginkan. Saya pertama kali membuat cabang terpisah dari yang di depan komit yang ingin saya kembalikan. Mengkloningnya secara lokal. Kemudian menerapkan rekomendasi Anda pada salinan itu, dengan cara ini, saya tidak membahayakan cabang utama saya ...
Gauthier Boaglio
21

Untuk membatalkan komit terbaru saya melakukan ini:

Pertama:

git log

dapatkan id SHA terbaru untuk diurungkan.

git revert SHA

Itu akan membuat komit baru yang melakukan kebalikan dari komit Anda. Kemudian Anda dapat mendorong komit baru ini untuk membawa aplikasi Anda ke keadaan sebelumnya, dan riwayat git Anda akan menunjukkan perubahan ini sesuai.

Ini bagus untuk mengulang sesuatu yang baru saja Anda lakukan, yang menurut saya lebih sering terjadi pada saya.

Seperti yang Mike katakan, Anda juga dapat melakukan ini:

git revert HEAD
Nick Res
sumber
8
git revert HEADakan mengembalikan komit terakhir tanpa harus mencari hash.
Mike Baranczak
Ini adalah solusi jika Anda tidak ingin menghapus komit sama sekali. Namun, dalam kasus ini, semua sampah berkomitmen akan tetap ada, dan memungkinkan cloner untuk mengatur ulang atau checkout kepada mereka. Jika Anda ingin mencegahnya, Anda HARUS memaksa-push.
cst1992
19

Cara lain:

Periksa cabang yang ingin Anda kembalikan, lalu setel ulang copy pekerjaan lokal Anda kembali ke komit yang Anda inginkan menjadi yang terbaru pada server jarak jauh (semuanya setelah itu akan pergi bye-bye). Untuk melakukan ini, di SourceTree, saya mengklik kanan pada dan memilih "Reset BRANCHNAME ke komit ini".

Kemudian navigasikan ke direktori lokal repositori Anda dan jalankan perintah ini:

git -c diff.mnemonicprefix=false -c core.quotepath=false push -v -f -- tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME 

Ini akan menghapus semua komit setelah yang sekarang di repositori lokal Anda tetapi hanya untuk satu cabang itu.

CommaToast
sumber
1
FYI "REPOSITORY_NAME" akan menjadi sesuatu seperti https: /[email protected]/me/repo_name.git
tim
3
Akan lebih membantu jika Anda akan memecah perintah itu dan menjelaskannya.
cst1992
3

Sebagian besar saran berasumsi bahwa Anda perlu menghancurkan 20 commit terakhir, itulah sebabnya ini berarti "menulis ulang sejarah", tetapi Anda tidak harus melakukannya.

Cukup buat cabang baru dari komit # 80 dan kerjakan cabang itu ke depan. 20 komit lainnya akan tetap di cabang yatim piatu.

Jika Anda benar-benar ingin cabang baru Anda memiliki nama yang sama, ingatlah bahwa cabang pada dasarnya hanya label. Cukup ganti nama cabang lama Anda menjadi sesuatu yang lain, lalu buat cabang baru di komit # 80 dengan nama yang Anda inginkan.

Ion Lesan
sumber
Saya menduga ini juga bermasalah dengan versi lokal semua orang dari sejarah cabang yang menarik.
ragerdl
2

Ketika melakukan pembaruan cabang dari master, saya perhatikan bahwa saya kadang-kadang mengklik berlebihan, dan menyebabkan cabang untuk bergabung ke master juga. Menemukan cara untuk membatalkannya.

Jika komit terakhir Anda adalah penggabungan, dibutuhkan lebih banyak cinta:

git revert -m 1 KEPALA

Richard Nader
sumber
1

Di github, cara mudah adalah menghapus cabang jarak jauh di UI github, di bawah tab cabang. Anda harus memastikan menghapus pengaturan berikut untuk membuat cabang dihapus:

  1. Bukan cabang default
  2. Tidak ada permintaan jajak pendapat pembukaan.
  3. Cabang tidak dilindungi.

Sekarang buat ulang di repositori lokal Anda untuk menunjuk ke titik komit sebelumnya. dan menambahkannya kembali ke repo jarak jauh.

git checkout -b master 734c2b9b   # replace with your commit point

Kemudian dorong cabang lokal ke jarak jauh

git push -u origin master

Tambahkan kembali perlindungan cabang dan cabang default, dll.

Jianwu Chen
sumber