Bagaimana cara membatalkan git pull?

238

Saya ingin membatalkan git saya karena komitmen yang tidak diinginkan pada asal jarak jauh, tapi saya tidak tahu revisi mana yang harus saya atur kembali.

Bagaimana saya bisa kembali ke keadaan sebelum saya melakukan git menarik pada asal terpencil?

Kartins
sumber
4
Catatan: Anda mungkin merasa berguna untuk git fetch upstreampertama - tama, lalu melihat sekilas git diff upstream/branchuntuk melihat apa yang akan Anda gabungkan. Jika semuanya baik-baik saja, lanjutkan dengangit merge upstream/branch
Shahbaz
1
Anda akan kehilangan semua kredibilitas jalanan Anda dan akan dikenakan bayaran seminggu jika ada hipster brogrammer melihat Anda melakukan perintah git dari GUI, tetapi baik GitHub Desktop dan Atom memiliki tombol aman dan mudah untuk undomelakukan dan mencentang kotak untuk dengan mudah dan jelas mem-stage dan menghapus file di panggung. GUI juga manusia!
Dem Pilafian

Jawaban:

391

Atau untuk membuatnya lebih eksplisit daripada jawaban yang lain:

git pull 

aduh?

git reset --keep HEAD@{1}

Versi git yang lebih tua dari 1.7.1 tidak memiliki --keep. Jika Anda menggunakan versi seperti itu, Anda bisa menggunakan --hard- tetapi itu adalah operasi yang berbahaya karena kehilangan perubahan lokal apa pun.


Untuk komentator

ORIG_HEAD adalah keadaan HEAD sebelumnya, yang diatur oleh perintah yang mungkin memiliki perilaku berbahaya, agar mudah dipulihkan. Sekarang kurang berguna karena Git memiliki reflog: HEAD @ {1} kira-kira sama dengan ORIG_HEAD (HEAD @ {1} selalu merupakan nilai HEAD terakhir, ORIG_HEAD adalah nilai HEAD terakhir sebelum operasi berbahaya)

lihat
sumber
2
apa perbedaan antara HEAD @ {1} dan HEAD ^?
hugemeow
7
@hugemeow Itu akan jadi pertanyaan SO yang bagus. Sementara itu man git-rev-parsejelaskan hal ini. HEAD@{1}adalah nilai simbolis sebelumnya HEADdi reflogsedangkan HEAD^adalah revisi (pertama) induk saat ini HEAD. Kedua anggukan ini harus sama (mis. Setelah rebase, hard reset, switch cabang dan hal-hal semacam itu). Baca artikel tertaut untuk reflog. Cheers
sehe
10
Pengguna PowerShell, lepas kurung dengan backtick:git reset HEAD@`{1`}
Robert Claypool
3
ss64.com/ps/syntax-esc.html Saya pikir Anda ingin mengetik HEAD@`{1`}, atau dalam hal ini lakukan apa yang berfungsi pada cangkang POSIX juga:'HEAD@{1}'
sehe
2
Saya pikir itu tidak hanya mengatur ulang tarikan, tetapi juga komit saya = (
falsarella
67

git reflog showharus menunjukkan kepada Anda sejarah KEPALA. Anda dapat menggunakannya untuk mencari tahu di mana Anda berada sebelum pull. Kemudian Anda bisa resetAnda HEADuntuk yang melakukan.

Noufal Ibrahim
sumber
git reflog show memberikan output ini: c9e5e4d KEPALA @ {0}: pull: Maju cepat 1c86a22 KEPALA @ {1}: master tarik asal: Maju cepat 05c141a KEPALA @ {2}: pull: Maju cepat Bisakah saya dengan aman mengatur ulang HEAD ke KEPALA @ {1}
Kartins
Jawaban lain oleh sehe memiliki rincian tentang cara menuju ke sana.
Noufal Ibrahim
Ini sangat berguna setelah komit bencana yang entah bagaimana diselingi komit ke dalam sejarah saya. Dapatkan mereka dengan mencari barang yang terakhir diketahui di reflog dan kemudian memaksa mendorong.
Domenic
Bagaimana jika pulltindakan pertama? Jika pullada di HEAD@{1}, dan tidak ada yang lain sebelum itu, bagaimana Anda kembali ke keadaan sebelumnya?
Hendra Uzia
Buat ulang repositori?
Noufal Ibrahim
29

Ini berhasil untuk saya.

git reset --hard ORIG_HEAD 

Batalkan gabungan atau tarik:

$ git pull                         (1)
Auto-merging nitfol
CONFLICT (content): Merge conflict in nitfol
Automatic merge failed; fix conflicts and then commit the result.
$ git reset --hard                 (2)
$ git pull . topic/branch          (3)
Updating from 41223... to 13134...
Fast-forward
$ git reset --hard ORIG_HEAD       (4)

Lihat ini: KEPALA dan ORIG_HEAD di Git untuk lebih.

Parag Tyagi
sumber
17

Temukan <SHA#>komit yang ingin Anda tuju. Anda dapat menemukannya di github atau dengan mengetik git logatau git reflog showdi baris perintah lalu lakukan git reset --hard <SHA#>

Nina
sumber
Temukan apa untuk komit?
Martin
Maaf, saya memperbaikinya<SHA#>
Nina
Ini adalah perintah yang paling saya gunakan ketika saya harus membatalkan sesuatu
Kartins
2

Dari https://git-scm.com/docs/git-reset#Documentation/git-reset.txt-Undoamergeorpullinsideadirtyworkingtree

Batalkan gabungan atau tarik ke dalam pohon yang kotor

$ git pull           (1)
Auto-merging nitfol
Merge made by recursive.
 nitfol               |   20 +++++----
 ...
$ git reset --merge ORIG_HEAD      (2)

Bahkan jika Anda mungkin memiliki modifikasi lokal di pohon kerja Anda, Anda dapat dengan aman mengatakan git pullketika Anda tahu bahwa perubahan di cabang lain tidak tumpang tindih dengan mereka.

Setelah memeriksa hasil penggabungan, Anda mungkin menemukan bahwa perubahan di cabang lain tidak memuaskan. Menjalankan git reset --hard ORIG_HEAD akan membuat Anda kembali ke tempat Anda sebelumnya, tetapi itu akan membuang perubahan lokal Anda, yang tidak Anda inginkan. git reset --mergesimpan perubahan lokal Anda.

Lihat juga https://stackoverflow.com/a/30345382/621690

Risadinha
sumber
Terima kasih! Anda menyelamatkan hari saya
Thiago Martins