Batalkan gabungan Git yang belum didorong

3945

Dalam cabang master saya, saya melakukan secara git merge some-other-branchlokal, tetapi tidak pernah mendorong perubahan ke master asal. Saya tidak bermaksud untuk bergabung, jadi saya ingin membatalkannya. Saat melakukan git statussetelah penggabungan, saya menerima pesan ini:

# On branch master
# Your branch is ahead of 'origin/master' by 4 commits.

Berdasarkan beberapa instruksi yang saya temukan , saya mencoba berlari

git revert HEAD -m 1

tapi sekarang saya menerima pesan ini dengan git status:

# On branch master
# Your branch is ahead of 'origin/master' by 5 commits.

Saya tidak ingin cabang saya di depan oleh sejumlah komitmen. Bagaimana saya kembali ke titik itu?

Matt Huggins
sumber
3
Jika Anda perlu melestarikan sejarah, dengan kata lain ada perubahan yang pernah diambil siapa pun dari Anda atau Anda telah mendorongnya ke suatu tempat menggunakan solusi di Yuri Ushakov jawab di bawah!
Sedrik
6
Harap batalkan pilihan jawaban yang menang, itu tidak aman (seperti yang ditunjukkan oleh banyak orang) meskipun masih mengumpulkan suara. Bagi saya "MBO" -s tampak yang terbaik, meskipun memiliki poin jauh lebih sedikit.
inger
5
Jika Anda perlu menjaga sejarah , gunakan solusi Yuri di bawah ini ! (hanya menambahkan tautan ke komentar @Sedrik)
cregox
3
Ini adalah sumber yang bagus langsung dari Github: Cara membatalkan (hampir) apa pun dengan Git
jasonleonhard

Jawaban:

4461

Dengan git reflogmemeriksa komit yang merupakan salah satu sebelum penggabungan ( git reflogakan menjadi pilihan yang lebih baik daripada git log). Kemudian Anda dapat mengatur ulang menggunakan:

git reset --hard commit_sha

Ada juga cara lain:

git reset --hard HEAD~1

Ini akan membuat Anda kembali 1 berkomitmen.

Ketahuilah bahwa file apa pun yang dimodifikasi dan tidak dikomit / tidak disimpan akan disetel ulang ke kondisi tidak dimodifikasi . Untuk menjaga mereka menyembunyikan perubahan atau melihat --mergeopsi di bawah.


Seperti @Velmont sarankan di bawah dalam jawabannya, dalam kasus langsung ini menggunakan:

git reset --hard ORIG_HEAD

mungkin menghasilkan hasil yang lebih baik, karena itu harus menjaga perubahan Anda. ORIG_HEADakan menunjuk ke sebuah komit langsung sebelum penggabungan telah terjadi, jadi Anda tidak harus berburu sendiri.


Kiat selanjutnya adalah menggunakan --mergesakelar alih-alih --hardkarena sakelar tidak mereset file yang tidak perlu:

git reset --merge ORIG_HEAD

--menggabungkan

Mereset ulang indeks dan memperbarui file-file di pohon kerja yang berbeda antara <commit> dan HEAD, tetapi menyimpannya yang berbeda antara indeks dan pohon kerja (yaitu yang memiliki perubahan yang belum ditambahkan).

Marcin Gil
sumber
129
Saya tidak berpikir ini akan (selalu?) Berfungsi - "satu sebelum penggabungan" akan menjadi komit terbaru yang digabungkan dari cabang lain - itu bukan komit terbaru di cabang saat ini . Baik? (Ini mungkin hanya hasil dari apa yang git logdipilih untuk ditampilkan secara default - mungkin ada output yang berbeda git logatau git reflogdapat digunakan untuk ini)
John Bachir
6
Saya pikir itu mungkin tergantung apakah Anda squash bergabung.
Marcin Gil
29
@ JohnBachir benar. Dalam git logoutput, Anda ingin melihat komitmen dua induk. Satu adalah komit terbaru di cabang Anda, satu komit terbaru di cabang tempat Anda bergabung. Anda ingin ke git reset --hardinduk berkomitmen pada cabang tempat Anda bergabung.
Justin
7
@JohnBachir: Selama "gabungan" tidak benar-benar maju cepat, itu akan menghasilkan komit baru di bagian atas log, dan komit ini memiliki dua orang tua (atau lebih dari 2 jika Anda melakukan gurita menggabungkan). Jika Anda menghapus komit gabungan ini, maka semua komit yang lebih lama yang masuk dari gabungan juga akan hilang. Namun, agar aman, setelah reset git akan memberi tahu Anda di mana head baru berada: "HEAD sekarang di 88a04de <commit message>". Saya selalu melihat itu untuk memastikan bahwa saya berakhir di tempat yang saya harapkan. Proyek saya menggunakan skema penamaan cabang standar untuk menjaga hal-hal yang berkesan.
Mark E. Haase
44
Apa yang saya temukan berguna adalah untuk melihat "git reflog" dan mencari komit terakhir yang saya lakukan di master. Kemudian lakukangit reset --hard <commit_sha>
Max Williams
1456

Dengan asumsi master lokal Anda tidak lebih penting dari asal / master, Anda harus dapat melakukannya

git reset --hard origin/master

Maka mastercabang lokal Anda akan terlihat identik origin/master.

randomguy3
sumber
71
@Carter itu sebenarnya bukan jawaban terbaik. Ada kemungkinan bahwa asal / master mungkin mendahului master lokal Anda sebelum penggabungan oleh beberapa komitmen, dalam hal ini mungkin tidak memberikan hasil yang diinginkan
Dhruva Sagar
15
@ dhruva-sagar Ya, tapi selama git tidak mengatakan Anda di belakang, dan Anda tidak mengambil, Anda harus baik-baik saja.
Kelvin
3
Terima kasih! Ini sempurna jika (dan hanya jika) Anda memiliki repositori jarak jauh.
tomc
2
Tidak, itu bukan yang sempurna untuk pertanyaan ini, lihat klausa "berasumsi". Jawaban MBO sebenarnya mencakup kasus ini, dan kasus di mana penggabungan bukan satu-satunya komit lokal.
inger
2
Sekali lagi, mungkin peringatan ini harus masuk ke jawabannya sendiri: Selalu menghindari penulisan ulang sejarah git!
cregox
1175

Lihat bab 4 dalam buku Git dan posting asli oleh Linus Torvalds .

Untuk membatalkan gabungan yang sudah didorong :

git revert -m 1 commit_hash

Pastikan untuk mengembalikan kembali jika Anda melakukan cabang lagi, seperti kata Linus.

Yuri Geinish
sumber
10
@perfectionist setuju :) Semacam keinginan ada cara untuk memigrasikan jawaban ini ke pertanyaan lain - (mungkin ada?)
mikermcneil
untuk informasi lebih lanjut tentang kembalikan: tautan
assaqqaf
1
Untuk yakin bahwa pengembalian ini telah berhasil, Anda dapat melakukan git diff hash1 hash2 di mana hash1 adalah commit yang dikembalikan, dan hash2 adalah commit lama yang keadaannya ingin Anda coba kembali. Tidak ada output == sukses! Saya dapat memutar kembali beberapa komit dengan melakukan ini beberapa kali, mulai dengan mengembalikan penggabungan terbaru dan bekerja mundur. git diff menunjukkan kepada saya bahwa saya berakhir dalam keadaan yang saya inginkan.
Robert Sinton
6
Perhatikan bahwa ini sebenarnya tidak menyelesaikan pertanyaan pengirim asli . Poster asli sudah digunakan git revert -m 1 <commit>. Masalahnya adalah melakukan itu tidak menghapus gabungan tidak disengaja yang dia lakukan (dan belum mendorong). Jawaban lain yang melibatkan hard reset lebih baik untuk masalah poster asli.
Ini adalah sumber yang bagus langsung dari Github: Cara membatalkan (hampir) apa pun dengan Git
jasonleonhard
986

Sungguh aneh bahwa perintah yang paling sederhana tidak ada. Sebagian besar jawaban berfungsi, tetapi membatalkan penggabungan yang baru saja Anda lakukan, ini adalah cara yang mudah dan aman :

git reset --merge ORIG_HEAD

Wasit ORIG_HEADakan menunjuk ke komit asli dari sebelum penggabungan.

( --mergeOpsi tidak ada hubungannya dengan penggabungan. Ini seperti git reset --hard ORIG_HEAD, tapi lebih aman karena tidak menyentuh perubahan yang tidak dikomit.)

odinho - Velmont
sumber
17
Jika Anda sudah mencemari pohon kerja Anda sejak saat itu, git reset --merge ORIG_HEADpertahankan perubahan itu.
yingted
1
Ini adalah satu - satunya jawaban yang benar (saya tidak mengatakan ini adalah jawaban terbaik - perhatikan perbedaannya). Katakanlah, pada master, saya melakukan 3 commit pada t1, t3, dan t5. Katakanlah, pada branch1, saya melakukan 3 komentar pada t2, t4 dan t6 (anggap t1, t2, t3, t4, t5 dan t6 berada dalam urutan kronologis). Perintah apa pun yang mirip dengan git reset --hard HEAD~5hanya akan mereset KEPALA (dapat menghapus komit di master dan branch1). Hanya --mergeopsi yang menghapus merge.
Manu Manjunath
@ Manu --mergeOpsi ini tidak benar-benar menghapus penggabungan, Anda dapat menggunakannya --hardjuga akan berfungsi dengan baik. Ini adalah referensi ORIG_HEAD yang merupakan petunjuk di sini, sudah diatur sebelum Anda melakukan penggabungan ke posisi Anda saat itu. :)
odinho
@mencoba apa yang Anda maksud dengan "Jika Anda sudah mencemari pohon kerja Anda sejak itu, git reset --merge ORIG_HEAD menyimpan perubahan itu." Apakah maksud Anda mengubah file setelah penggabungan? Lagi pula saya melakukan penggabungan dan kemudian melakukan beberapa penyelesaian konflik. Tetapi kemudian saya ingin mengatur ulang penggabungan dan melakukan seperti yang diperintahkan dalam jawaban ini. Semuanya baik-baik saja dan itu tidak menyimpan perubahan yang saya lakukan setelah penggabungan. Repo lokal saya mirip dengan posisi sebelum saya melakukan penggabungan.
Samitha Chathuranga
The git reset --hard ORIG_HEADperintah bekerja sempurna bagi saya - itu mungkin telah dibantu oleh fakta bahwa saya tidak membuat perubahan lain untuk repositori setelah lokal git mergesaya mencoba untuk membatalkan. Perintah ini cukup mengatur ulang status repositori kembali ke keadaan sebelum penggabungan. Terima kasih atas tipnya!
bluebinary
391

Dengan versi Git yang lebih baru, jika Anda belum melakukan penggabungan dan Anda memiliki konflik penggabungan , Anda dapat melakukannya:

git merge --abort

Dari man git merge:

[Ini] hanya bisa dijalankan setelah penggabungan menghasilkan konflik. git merge --abortakan membatalkan proses penggabungan dan mencoba merekonstruksi status pra-penggabungan.

Travis Reeder
sumber
8
Penggabungannya dilakukan tetapi tidak didorong (lihat judul), ia telah bergabung, perintah Anda hanya bekerja ketika ia masih di tengah penggabungan
JBoy
135

Anda harus mengatur ulang ke komit sebelumnya. Ini seharusnya bekerja:

git reset --hard HEAD^

Atau bahkan HEAD^^ untuk mengembalikan komitmen yang dikembalikan. Anda selalu dapat memberikan referensi lengkap SHA jika Anda tidak yakin berapa banyak langkah yang harus Anda ambil.

Jika Anda memiliki masalah dan cabang master Anda tidak memiliki perubahan lokal, Anda dapat mengatur ulang ke origin/master.

MBO
sumber
5
IMHO jawaban terbaik, menggabungkan OP sendiri (dengan asumsi hanya 1 langkah untuk kembali, yang tampaknya menjadi kasus di Q), serta pintasan acakguy3 (yang bekerja ketika "cabang master Anda tidak memiliki perubahan lokal ")
inger
4
Anda komentator, @Inger, dan @Konstantin, mengapa? Anda datang ke sini setelah jawaban saya dibuat, dan itu lebih benar. Menaiki KEPALA satu langkah sering salah, dan Anda harus benar-benar menghitung seberapa jauh Anda harus melangkah. Git sudah siap ORIG_HEADuntuk Anda, mengapa tidak menggunakannya?
odinho
apakah ini akan mengatur ulang perubahan lokal juga? #PleaseUpdate.
CoDe
Ini bekerja dengan sempurna bagi saya, mengatur ulang kepala seperti itu jauh lebih masuk akal daripada setengah jawaban di sini.
Varda Elentári
KEPALA ^ sama dengan komit sebelum KEPALA? dan ^^ apakah dua commit sebelumnya? Mengira ini tidak akan bekerja dengan penggabungan maju cepat?
Marcus Leon
87

Akhir-akhir ini, saya menggunakan ini git refloguntuk membantu. Ini sebagian besar hanya berfungsi jika penggabungan HANYA terjadi, dan itu ada di mesin Anda.

git reflog mungkin mengembalikan sesuatu seperti:

fbb0c0f HEAD@{0}: commit (merge): Merge branch 'master' into my-branch
43b6032 HEAD@{1}: checkout: moving from master to my-branch
e3753a7 HEAD@{2}: rebase finished: returning to refs/heads/master
e3753a7 HEAD@{3}: pull --rebase: checkout e3753a71d92b032034dcb299d2df2edc09b5830e
b41ea52 HEAD@{4}: reset: moving to HEAD^
8400a0f HEAD@{5}: rebase: aborting

Baris pertama menunjukkan bahwa penggabungan terjadi. Baris ke-2 adalah waktu sebelum penggabungan saya. Saya hanya git reset --hard 43b6032memaksa cabang ini untuk melacak dari sebelum penggabungan, dan melanjutkan.

Parris
sumber
Jawaban yang bagus, terima kasih! Diperlukan untuk membatalkan penggabungan tetapi jawaban lain hanya mengacaukannya, menggunakan refloguntuk mendapatkan SHA dan meneruskannya agar git resetberfungsi.
Lankymart
51

Dengan Git modern, Anda dapat:

git merge --abort

Sintaks yang lebih lama:

git reset --merge

Sekolah tua:

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 for merge command.

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

Setelah penggabungan yang gagal, saat tidak ada MERGE_HEAD, gabungan yang gagal dapat diurungkan git reset --merge, tetapi tidak harus dengangit merge --abort , sehingga mereka tidak hanya sintaks lama dan baru untuk hal yang sama .

Secara pribadi saya menemukan git reset --mergejauh lebih kuat dan berguna dalam pekerjaan sehari-hari, jadi itulah yang selalu saya gunakan.

Martin G
sumber
Bekerja dengan baik untuk saya. Setiap posting lain mengatakan ini sangat rumit, tetapi ini melakukan persis seperti yang diharapkan. Saya kira itu hanya berhasil karena ada konflik, yang tidak benar-benar menjawab pertanyaan awal.
Jeremy
Jawaban ini tidak fokus pada situasi OP, dan meninggalkan konteks penting.
Ben Wheeler
37

Oke, jawaban yang diberikan orang lain dekat dengan saya, tetapi tidak berhasil. Inilah yang saya lakukan.

Melakukan ini...

git reset --hard HEAD^
git status

... memberi saya status berikut.

# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.

Saya kemudian harus mengetikkan git resetperintah yang sama beberapa kali lagi. Setiap kali saya melakukan itu, pesannya diubah satu seperti yang Anda lihat di bawah.

> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 3 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 1 and 3 different commit(s) each, respectively.
> git reset --hard HEAD^
HEAD is now at [...truncated...]
> git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.

Pada titik ini, saya melihat pesan status berubah, jadi saya mencoba melakukan git pull, dan itu sepertinya berhasil:

> git pull
Updating 2df6af4..12bbd2f
Fast forward
 app/views/truncated |    9 ++++++---
 app/views/truncated |   13 +++++++++++++
 app/views/truncated |    2 +-
 3 files changed, 20 insertions(+), 4 deletions(-)
> git status
# On branch master

Singkat cerita, perintah saya sampai pada ini:

git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git reset --hard HEAD^
git pull
Matt Huggins
sumber
19
atau Anda bisa menggunakanHEAD^^^^
hasen
17
bahkan mungkin diatur ulang ke origin/master;)
hasen
23

Anda dapat menggunakan git refloguntuk menemukan checkout sebelumnya. Terkadang itu adalah kondisi bagus yang ingin Anda kembalikan.

Secara konkret,

$ git reflog
$ git reset --hard HEAD@{0}
stephjang
sumber
1
Terima kasih! Anda menghemat setengah hari dari pekerjaan saya. Namun saya tidak dapat keluar dari mode reflog dengan perintah apa pun.
Katarzyna
1
@Katarzyna gunakan tombol "q" untuk keluar dari reflog
Amjed Baig
21

Jika Anda berada di tengah penggabungan, Anda selalu dapat membatalkannya git merge --abort

llioor
sumber
2
terima kasih bro dan aku akan melakukan hal yang benar itu jawaban yang benar. beruntung saya menggulir ke bawah. saya hanya ingin menghapus gabungan
Nyuu
15

Saya dapat menyelesaikan masalah ini dengan satu perintah yang tidak melibatkan mencari komit id.

git reset --hard remotes/origin/HEAD

Jawaban yang diterima tidak bekerja untuk saya tetapi perintah ini mencapai hasil yang saya cari.

Ralph Ritoch
sumber
Persis! Ini mengatur ulang perubahan Anda ke KEPALA cabang! Tidak melakukan satu per satu
Carlos Zinato
tidak bekerja untuk saya. sebenarnya akhirnya mengirim cabang lokal kembali satu atau dua bulan. Untungnya ini semua lokal sehingga saya selalu dapat menghancurkan cabang dan mengambilnya lagi. Hanya ingin menunjukkan itu kalau-kalau orang lain mencoba ini.
Matt Pengelly
@MattPengelly metode ini sebagian besar tidak berdokumen dan biasanya berfungsi jika cabang Anda sinkron dengan cabang jarak jauh sebelum Anda melakukan penggabungan. Sudah berbulan-bulan sejak cabang Anda sinkron dengan cabang jarak jauh?
Ralph Ritoch
@MattPengelly juga tergantung pada cabang mana KEPALA menunjuk. Saya menggunakan gitflow pada salah satu proyek saya, dan meskipun saya berada di cabang pengembangan, remote / asal / HEAD menunjuk ke asal / master jadi jika saya perlu mengurungkan penggabungan, saya mungkin perlu mengatur ulang ke remote / origin / develop
Ralph Ritoch
14

Jika Anda belum melakukannya, Anda hanya dapat menggunakannya

$ git checkout -f

Ini akan membatalkan penggabungan (dan semua yang Anda lakukan).

Idealmind
sumber
Mencoba ini dan itu benar-benar meningkatkan jumlah komitmen yang cabang lokal saya di depan.
barclay
14

Sampai pada pertanyaan ini juga mencari untuk kembali ke mencocokkan asal (yaitu, TIDAK melakukan lebih dulu dari asal). Meneliti lebih lanjut, menemukan ada resetperintah untuk itu:

git reset --hard @{u}

Catatan: @{u}adalah singkatan untuk origin/master. (Dan, tentu saja, Anda membutuhkan repositori jarak jauh agar ini berfungsi.)

leanne
sumber
14

Anda harus mengubah KEPALA Anda, Tentu saja bukan KEPALA Anda tetapi git KEPALA ....

Jadi sebelum menjawab, mari tambahkan beberapa latar belakang, jelaskan apa ini HEAD.

First of all what is HEAD?

HEADhanyalah referensi ke komit saat ini (terbaru) di cabang saat ini.
Hanya ada satu HEADpada waktu tertentu. (tidak termasuk git worktree)

Konten HEADdisimpan di dalam .git/HEADdan berisi 40 byte SHA-1 dari komit saat ini.


detached HEAD

Jika Anda tidak menggunakan komit terbaru - artinya HEADmenunjuk komit sebelumnya dalam sejarah yang disebut detached HEAD.

masukkan deskripsi gambar di sini

Pada baris perintah, akan terlihat seperti ini- SHA-1 bukan nama cabang karena HEADtidak menunjuk ke ujung cabang saat ini

masukkan deskripsi gambar di sini

masukkan deskripsi gambar di sini

Beberapa opsi tentang cara memulihkan dari HEAD yang terpisah:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Ini akan mengecek cabang baru yang menunjuk ke komit yang diinginkan.
Perintah ini akan checkout ke komit yang diberikan.
Pada titik ini, Anda dapat membuat cabang dan mulai bekerja sejak saat ini.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Anda selalu dapat menggunakan itu reflogjuga.
git reflogakan menampilkan perubahan apa pun yang memperbarui HEADdan memeriksa entri reflog yang diinginkan akan mengatur HEADkembali komitmen ini.

Setiap kali KEPALA diubah akan ada entri baru di reflog

git reflog
git checkout HEAD@{...}

Ini akan membuat Anda kembali ke komit yang Anda inginkan

masukkan deskripsi gambar di sini


git reset --hard <commit_id>

"Pindahkan" KEPALA Anda kembali ke komit yang diinginkan.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts if you've modified things which were
# changed since the commit you reset to.
  • Catatan: ( Karena Git 2.7 )
    Anda juga bisa menggunakan itu git rebase --no-autostash.

git revert <sha-1>

"Undo" rentang komit atau komit yang diberikan.
Perintah reset akan "membatalkan" setiap perubahan yang dilakukan dalam komit yang diberikan.
Komit baru dengan undo patch akan dilakukan sementara komit asli akan tetap ada dalam sejarah juga.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Skema ini menggambarkan perintah mana melakukan apa.
Seperti yang Anda lihat ada reset && checkoutmodifikasi HEAD.

masukkan deskripsi gambar di sini

Panduan Kode
sumber
Ini adalah harta karun 🐱‍👤🐱‍👤🐱‍👤
Jawand Singh
12

Jawaban paling sederhana adalah yang diberikan oleh odinho - Velmont

Pertama lakukan git reset --merge ORIG_HEAD

Bagi mereka yang ingin me-reset setelah perubahan didorong, lakukan ini (Karena ini adalah posting pertama yang terlihat untuk pertanyaan git reset gabung)

git push origin HEAD --force

Ini akan mengatur ulang sedemikian rupa sehingga Anda tidak akan mendapatkan perubahan yang digabungkan kembali setelah menarik.

Harsha
sumber
10

Hanya untuk opsi tambahan untuk melihat, saya telah sebagian besar mengikuti model percabangan yang dijelaskan di sini: http://nvie.com/posts/a-successful-git-branching-model/ dan karena itu telah bergabung dengan--no-ff (tidak ada maju cepat) biasanya.

Saya baru saja membaca halaman ini karena saya secara tidak sengaja menggabungkan cabang pengujian alih-alih cabang rilis saya dengan master untuk disebarkan (situs web, master adalah apa yang ditayangkan). Cabang pengujian memiliki dua cabang lainnya yang digabung dan total sekitar enam komitmen.

Jadi untuk mengembalikan seluruh komit, saya hanya perlu satu git reset --hard HEAD^dan mengembalikan seluruh gabungan. Karena penggabungan tidak diteruskan dengan cepat, penggabungan tersebut merupakan blok dan satu langkah mundur adalah "cabang tidak digabungkan".

Damien Byrne
sumber
10

Anda dapat menggunakan hanya dua perintah untuk mengembalikan gabungan atau memulai kembali dengan komit tertentu:

  1. git reset --hard commitHash (Anda harus menggunakan komit yang ingin Anda restart, mis. 44a587491e32eafa1638aca7738)
  2. git push origin HEAD --force (Mengirim cabang master lokal baru ke asal / master)

Semoga sukses dan teruskan!

Matheus Abreu
sumber
10

Itu bisa dilakukan dengan berbagai cara.

1) Batalkan Penggabungan

Jika Anda berada di antara penggabungan yang buruk (keliru dilakukan dengan cabang yang salah), dan ingin menghindari penggabungan untuk kembali ke cabang terbaru seperti di bawah ini:

git merge --abort

2) Setel ulang HEAD ke cabang jarak jauh

Jika Anda bekerja dari cabang pengembangan jarak jauh, Anda dapat mengatur ulang HEAD ke komit terakhir di cabang jarak jauh seperti di bawah ini:

git reset --hard origin/develop

3) Hapus cabang saat ini, dan checkout lagi dari repositori jarak jauh

Menimbang, Anda sedang bekerja mengembangkan cabang di repo lokal, yang disinkronkan dengan cabang jarak jauh / kembangkan, Anda dapat melakukan seperti di bawah ini:

git checkout master 
##to delete one branch, you need to be on another branch, otherwise you will fall with the branch :) 

git branch -D develop
git checkout -b develop origin/develop
Amit Kaneria
sumber
"1) Abort Merge" sudah cukup. Upvoting.
CodeToLife
1
Hati-hati! git merge --abort "hanya dapat dijalankan setelah penggabungan tersebut menghasilkan konflik. git merge --abort akan membatalkan proses penggabungan dan mencoba merekonstruksi negara pra-penggabungan"
Pedro García Medina
8

Jika gabungan Anda dan komit yang sesuai belum didorong, Anda selalu dapat beralih ke cabang lain, menghapus yang asli dan membuatnya kembali.

Sebagai contoh, saya tidak sengaja menggabungkan cabang pengembangan menjadi master dan ingin membatalkannya. Menggunakan langkah-langkah berikut:

git checkout develop
git branch -D master
git branch -t master origin/master

Voila! Master berada pada tahap yang sama dengan asal, dan negara salah-merger Anda terhapus.

Stephan
sumber
1
Catatan: Ini tidak hanya membatalkan penggabungan tetapi juga komit lokal yang dibuat sejak push to origin terakhir.
Martijn Heemels
4

Jika Anda menginginkan solusi command-line, saya sarankan untuk hanya mengikuti jawaban MBO.

Jika Anda seorang pemula, Anda mungkin menyukai pendekatan grafis:

  1. Memulai gitk (dari baris perintah, atau klik kanan di browser file jika Anda memilikinya)
  2. Anda dapat dengan mudah melihat komit gabungan di sana - simpul pertama dari atas dengan dua orang tua
  3. Ikuti tautan ke orang tua pertama / kiri (yang ada di cabang Anda saat ini sebelum penggabungan, biasanya merah untuk saya)
  4. Pada komit yang dipilih, klik kanan "Reset cabang ke sini", pilih hard reset di sana
inger
sumber
4

Strategi: Buat cabang baru dari tempat semuanya baik.

Alasan: Mengembalikan merger sulit. Ada terlalu banyak solusi, tergantung pada banyak faktor seperti apakah Anda telah berkomitmen atau mendorong penggabungan Anda atau apakah ada komitmen baru sejak penggabungan Anda. Anda juga masih harus memiliki pemahaman yang relatif mendalam tentang git untuk menyesuaikan solusi ini dengan kasus Anda. Jika Anda mengikuti beberapa instruksi secara membabi buta, Anda bisa berakhir dengan "penggabungan kosong" di mana tidak ada yang akan digabungkan, dan upaya penggabungan lebih lanjut akan membuat Git memberi tahu Anda "Sudah up to date".

Larutan:

Katakanlah Anda ingin menggabungkan devke dalam feature-1.

  1. Temukan revisi yang Anda inginkan untuk menerima penggabungan:

    git log --oneline feature-1
    a1b2c3d4 Merge branch 'dev' into 'feature-1' <-- the merge you want to undo
    e5f6g7h8 Fix NPE in the Zero Point Module <-- the one before the merge, you probably want this one
    
  2. Lihat (kembali waktu):

    git checkout e5f6g7h8
    
  3. Buat cabang baru dari sana dan periksa:

    git checkout -b feature-1
    

Sekarang Anda dapat memulai kembali penggabungan:

  1. Menggabungkan: git merge dev

  2. Perbaiki konflik gabungan Anda.

  3. Melakukan: git commit

  4. Saat Anda puas dengan hasilnya, hapus cabang lama: git branch --delete feature-1

pyb
sumber
2

Cukup buat cabang baru, lalu pilih cherry-commit yang diinginkan.

Lebih simpel dan simpel, kemudian mengatur ulang yang dijelaskan dalam banyak jawaban di atas

devi
sumber
1
Saya setuju dengan saran ini, terutama jika Anda tidak sepenuhnya nyaman dengan perintah git yang tercantum. Ini mungkin lebih lambat dengan lebih banyak "kerja keras", tetapi jika itu tidak muncul banyak dan Anda khawatir kehilangan pekerjaan Anda, itu sepadan dengan usaha.
Greg
1

Saya pikir Anda dapat melakukan di git rebase -i [hash] [branch_name] mana [hash]hash identifikasi untuk seberapa jauh Anda ingin mundur ditambah satu (atau seberapa banyak banyak komitmen yang ingin Anda tuju) dan kemudian hapus baris untuk komit di editor yang tidak Anda inginkan lagi . Simpan file. Keluar. Berdoa. Dan itu harus diputar ulang. Anda mungkin harus melakukan git reset --hard, tetapi itu harus baik pada saat ini. Anda juga dapat menggunakan ini untuk menarik komit tertentu dari tumpukan, jika Anda tidak ingin menyimpannya dalam riwayat Anda, tetapi itu bisa membuat repositori Anda dalam keadaan yang mungkin tidak Anda inginkan.

tychoish
sumber
1

Jika Anda melakukan penggabungan:

git reset HEAD~1
# Make sure what you are reverting is in fact the merge files
git add .
git reset --hard
Dorian
sumber
1
  1. Pertama, pastikan Anda telah melakukan segalanya.

  2. Kemudian atur ulang repositori Anda ke kondisi kerja sebelumnya:

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36
    

    atau menggunakan --hard( ini akan menghapus semua perubahan lokal, tidak berkomitmen! ):

    $ git reset f836e4c1fa51524658b9f026eb5efa24afaf3a36 --hard
    

    Gunakan hash yang ada di sana sebelum Anda salah menggabungkan komit.

  3. Periksa komitmen yang ingin Anda komit ulang di atas versi yang benar sebelumnya dengan:

    $ git log 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    commit 4c3e23f529b581c3cbe95350e84e66e3cb05704f
    
    ...
    
    commit 16b373a96b0a353f7454b141f7aa6f548c979d0a
    
    ...
    
  4. Terapkan komit kanan Anda di atas versi kanan repositori Anda dengan:

    • Dengan menggunakan cherry-pick (perubahan yang dilakukan oleh beberapa commit yang ada)

          git cherry-pick ec59ab844cf504e462f011c8cc7e5667ebb2e9c7
      
    • Atau dengan memetik berbagai komitmen dengan:

      • Pertama-tama memeriksa perubahan yang tepat sebelum menggabungkannya:

        git diff 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        
      • Pertama-tama memeriksa perubahan yang tepat sebelum menggabungkannya:

        git cherry-pick 5216b24822ea1c48069f648449997879bb49c070..4c3e23f529b581c3cbe95350e84e66e3cb05704f
        

        di mana ini adalah rentang komit yang benar yang telah Anda komit (tidak termasuk penggabungan yang salah komitmen).

kenorb
sumber
1
  1. git stash

  2. git branch -d the_local_branch

  3. git checkout -t <name of remote>

  4. git stash apply

Ini bekerja untuk saya .. !!

Siva Kumar
sumber
0

Jika Anda melihat bahwa Anda harus segera kembali setelah penggabungan dan Anda belum melakukan hal lain setelah upaya penggabungan, Anda bisa mengeluarkan perintah ini: git reset --hard HEAD@{1} .

Pada dasarnya, penggabungan Anda shaakan menunjuk ke HEAD@{0}jika tidak ada yang dilakukan setelah penggabungan dan HEAD@{1}akan menjadi poin sebelumnya sebelum penggabungan.

Dut A.
sumber
0

Kesempatan paling sederhana dari yang paling sederhana, jauh lebih sederhana dari apa pun yang dikatakan di sini:

Hapus cabang lokal Anda (lokal, bukan jarak jauh) dan tarik lagi. Dengan cara ini Anda akan membatalkan perubahan pada cabang master Anda dan siapa pun akan terpengaruh oleh perubahan yang tidak ingin Anda dorong. Mulai lagi.

Luis
sumber
0

Dalam hal ini, Anda ingin mengatur ulang cabang Anda git reset --hard <branch_name>. Jika Anda ingin menyimpan perubahan Anda sebelum meresetnya pastikan untuk membuat cabang baru dan git checkout <branch_name>.

Anda dapat mengatur ulang negara ke komit tertentu git reset --hard <commit_id>juga.

Jika perubahan telah didorong, Anda dapat menggunakannya git revert <branch_name>. Pastikan untuk memeriksa cara menggunakan git revert dan git checkout di skenario lain juga.

Nesha Zoric
sumber