Undo git pull, cara membawa repo ke kondisi lama

1006

Apakah ada cara untuk mengembalikan atau membatalkan git pull sehingga sumber / repo saya akan kembali ke kondisi lama yang sebelumnya melakukan git pull? Saya ingin melakukan ini karena menggabungkan beberapa file yang saya tidak ingin melakukannya, tetapi hanya menggabungkan file yang tersisa lainnya. Jadi, saya ingin mendapatkan file-file itu kembali, apakah itu mungkin?

EDIT: Saya ingin membatalkan git untuk klarifikasi. Setelah melihat beberapa jawaban, saya melakukan ini

git reflog
bb3139b... HEAD@{0}: pull : Fast forward
01b34fa... HEAD@{1}: clone: from ...name...

Sekarang, apa yang harus saya lakukan? Apakah baik git reset --hard -baik saja? Saya tidak ingin mengacaukannya lagi, jadi minta langkah rinci?

seg.server.fault
sumber
23
Sepertinya Anda hanya memiliki dua hal dalam sejarah: klon dan pengambilan. Cukup setel ulang ke klon:, git reset --hard 01b34fadalam hal ini Anda bisa melakukan git reset --hard HEAD^yang diatur ulang ke satu komit sebelum KEPALA.
jkp
2
--hard diperlukan jika Anda ingin memodifikasi file dalam direktori kerja Anda
William Pursell
3
@ seg.server.fault: jika berhasil, Anda selalu dapat menerima jawabannya;)
jkp
7
git reset --hard HEAD ^
funroll
7
git reflogakan menunjukkan semua yang telah dilakukan dengan git. Ada kekhawatiran yang git reset --hard [sha1 of something from reflog]akan mengembalikan semua yang ditampilkan reflog, yang terkadang bukan tujuan, misalnya. Anda ingin mengembalikan penggabungan pada cabang master yang ditarik dari asal dengan data buruk (terjadi), dan setelah penggabungan tersebut Anda telah bekerja pada cabang lainnya. reflogakan menunjukkan setiap chage di cabang lain. Tapi git checkout masterdan git reset --hard [SH1 of commit on master branch just before merge]akan mengatur ulang hanya cabang master saat ini menghapus gabungan yang ditarik dari asal.
Vladimir Vukanac

Jawaban:

1427

Menjalankan git pullmelakukan tugas-tugas berikut, dalam rangka:

  1. git fetch
  2. git merge

Langkah menggabungkan menggabungkan cabang yang telah disetel untuk digabungkan dalam konfigurasi Anda. Anda ingin membatalkan langkah penggabungan , tetapi mungkin tidak mengambilnya (tidak masuk akal dan tidak perlu).

Untuk membatalkan penggabungan , gunakan git reset --harduntuk mengatur ulang repositori lokal ke status sebelumnya; gunakan git-reflog untuk menemukan SHA-1 dari kondisi sebelumnya dan kemudian mengatur ulang.

Peringatan

Perintah yang tercantum di bagian ini menghapus semua perubahan yang tidak dikomit, berpotensi menyebabkan hilangnya pekerjaan:

git reset --hard

Atau, reset ke titik waktu tertentu, seperti:

git reset --hard master@{"10 minutes ago"}
jkp
sumber
325
Cara terbaik untuk memilih keadaan sebelumnya, alih-alih menggunakan git-reflog dan menyalin hash, adalah dengan menggunakan jalan pintas seperti master@{1}, yang merupakan posisi sebelumnya master, master@{"5 minutes ago"}atau master@{14:30}. Rincian lengkap tentang menentukan revisi dengan cara ini dapat ditemukan di man git-rev-parse, di bagian yang disebut "menentukan revisi".
Cascabel
38
Dalam hal ini ORIG_HEAD juga harus berfungsi ("git reset --hard ORIG_HEAD")
Jakub Narębski
@Jelfromi: terima kasih atas tipnya, saya tidak tahu Anda bisa sangat bertele-tele tentang revisi. Saya tahu tentang memilih revisi relatif terhadap HEAD, tetapi ketika pertanyaan diajukan, saya tidak tahu seberapa jauh ke masa lalu ia ingin pergi.
jkp
Ketika saya menarik, katanya Updating d2c90a3..035ac4d. Di sini, Anda juga dapat menggunakan d2c90a3sebagai parameter untuk mengatur ulang.
Thailand
Anda tidak perlu mengetik hash saat menggunakan reflog. Anda juga dapat menggunakan HEAD @ {1} atau nomor sebelumnya seperti yang didefinisikan dalam reflog.
Simon The Cat
338

Sama seperti jawaban jkp, tapi inilah perintah lengkapnya:

git reset --hard a0d3fe6

di mana a0d3fe6 ditemukan dengan melakukan

git reflog

dan melihat titik di mana Anda ingin membatalkannya.

Jeffrey Sun
sumber
Mengapa saya tidak bisa begitu saja git reset HEAD --hard, misalnya?
Sung Cho
9
@MikeC Pendekatan ini memungkinkan Anda untuk kembali beberapa tarikan, misalnya
xji
2
Saya tidak dapat menggunakan id sisi kiri tetapi git reset --hard HEAD@{n}bekerja
E. Sundin
1
Anda seharusnya menyarankan edit untuk jawaban jkp daripada hampir mereplikasi di sini setelah bertahun-tahun.
Abhishek Anand
Jika saya memilikinya di git reflog: dab04ec HEAD @ {0}, aaaaaaa HEAD @ {1} dan bbbbbbb HEAD @ {2}. Jika saya melakukannya, git reset --hard bbbbbbbsaya akan kehilangan KEPALA 0 dan 1?
pmiranda
115

Cara yang lebih modern untuk membatalkan penggabungan adalah:

git merge --abort

Dan cara yang sedikit lebih tua:

git reset --merge

Cara sekolah lama yang dijelaskan dalam jawaban sebelumnya (peringatan: akan membuang semua perubahan lokal Anda):

git reset --hard

Namun sebenarnya, perlu diperhatikan bahwa git merge --aborthanya setara dengan yang git reset --mergediberikan yang MERGE_HEADhadir. Ini bisa dibaca di git help untuk menggabungkan perintah.

git merge --abort is equivalent to git reset --merge when MERGE_HEAD is present.

Setelah penggabungan yang gagal, ketika tidak ada MERGE_HEAD, penggabungan yang gagal dapat dibatalkan dengan git reset --mergetetapi tidak harus dengan git merge --abort, sehingga mereka tidak hanya sintaks lama dan baru untuk hal yang sama . Inilah mengapa saya merasa git reset --mergejauh lebih berguna dalam pekerjaan sehari-hari.

Martin G
sumber
20
git merge --abortbekerja selama penggabungan, bukan setelah git pullselesai. Jadi jawaban ini tampaknya tidak relevan dengan pertanyaan itu.
Abhishek Anand
1
git reset --mergemenghapus semua perubahan yang tidak dilakukan untuk melakukan. Menemukan ini dengan cara yang sulit.
theadriangreen
62

ini berfungsi pertama kali digunakan: git reflog

temukan SHA Anda dari status previus Anda dan buat (HEAD @ {1} sebagai contoh)

git reset --hard HEAD@{1}
Ezequiel García
sumber
40

Jika Anda memiliki gitk (coba jalankan "gitk --all dari git command line"), itu sederhana. Jalankan saja, pilih komit yang ingin Anda kembalikan (klik kanan), dan pilih "Reset master branch to here". Jika Anda tidak memiliki perubahan yang tidak dikomit, pilih opsi "keras".

Samuel Carrijo
sumber
8
Ini layak dijalankan jika Anda belum melihatnya. Itu muncul GUI gila.
Evan Moran
35

Misalkan $COMMITadalah id komit terakhir sebelum Anda tampil git pull. Yang Anda butuhkan untuk membatalkan tarikan terakhir adalah

git reset --hard $COMMIT

.

Bonus:

Berbicara tentang tarik, saya ingin berbagi trik yang menarik,

git pull --rebase

Perintah di atas adalah perintah yang paling berguna dalam hidup git saya yang menghemat banyak waktu.

Sebelum mendorong komit Anda yang baru ke server, coba perintah ini dan itu akan secara otomatis menyinkronkan perubahan server terbaru (dengan mengambil + gabungan) dan akan menempatkan komit Anda di bagian atas dalam log git. Tidak perlu khawatir tentang tarikan / penggabungan manual.

Temukan detailnya di: http://gitolite.com/git-pull--rebase

Sazzad Hissain Khan
sumber
17

Ini adalah cara termudah untuk mengembalikan perubahan yang Anda tarik.

** Warning **

Harap buat cadangan file yang diubah karena akan menghapus file dan folder yang baru dibuat .

git reset --hard 9573e3e0

Di mana 9573e3e0{id Komit} Anda

Manish Goswami
sumber
respons ini sangat berguna, karena jika kita melakukan git pull cabang asal akan mendapatkan sesuatu seperti ini Updating ffce65bd..e929e884, dogit reset --hard ffce65bd
Ernesto Alfonso
15

Anda dapat melakukan git reset --hard ORIG_HEAD

sejak "menarik" atau "menggabungkan" set ORIG_HEAD menjadi kondisi saat ini sebelum melakukan tindakan tersebut.

Orlando
sumber
5

git pull lakukan di bawah operasi.

saya. git fetch

ii. git merge

Untuk membatalkan tarik lakukan operasi apa pun:

saya. git reset --hard --- kembalikan semua perubahan lokal juga

atau

ii. git reset --hard master@{5.days.ago} (seperti 10.minutes.ago, 1.hours.ago,1.days.ago ..) untuk mendapatkan perubahan lokal.

atau

aku aku aku. git reset --hard commitid

Perbaikan:

Lain kali gunakan git pull --rebasealih-alih git pull.. sinkronisasi servernya dengan melakukan (ambil & gabungkan).

GolamMazid Sajib
sumber
4

Jika ada gabungan gagal, yang merupakan alasan paling umum untuk ingin membatalkan git pull, menjalankan git reset --mergemelakukan persis apa yang diharapkan: simpan file yang diambil, tetapi batalkan gabungan yang git pullberusaha untuk menggabungkan. Maka orang dapat memutuskan apa yang harus dilakukan tanpa kekacauan yang git mergekadang - kadang menghasilkan. Dan tidak perlu satu untuk menemukan ID komit yang tepat yang --harddisebutkan dalam setiap jawaban lainnya membutuhkan.

Davide
sumber