Git birleştirmeyi geri alma


225
develop branch
--> dashboard (working branch)

git merge --no-ff developYukarı akış değişikliklerini kontrol panelinde birleştirmek için kullanıyorum

git günlüğü:

commit 88113a64a21bf8a51409ee2a1321442fd08db705
Merge: 981bc20 888a557
Author: XXXX <>
Date:   Mon Jul 30 08:16:46 2012 -0500

    Merge branch 'develop' into dashboard

commit 888a5572428a372f15a52106b8d74ff910493f01
Author: root <root@magneto.giveforward.com>
Date:   Sun Jul 29 10:49:21 2012 -0500

    fixed end date edit display to have leading 0

commit 167ad941726c876349bfa445873bdcd475eb8cd8
Author: XXXX <>
Date:   Sun Jul 29 09:13:24 2012 -0500

Birleştirme içinde yaklaşık 50+ taahhüt vardı ve birleştirme nasıl geri döndürüleceğini merak ediyorum, böylece gösterge tablosu devlet birleştirmeden geri dönüyor

Bunun ikinci kısmı, eğer birleştirme --no-ffyapmazsam, ' Birleştirme dalı' geliştirmek 'gösterge tablosuna ' alamadım .. Bu birleştirmeyi nasıl geri alırım?


Yanıtlar:


321

Birleştirme taahhüdünü geri almak diğer sorularda kapsamlı bir şekilde ele alınmıştır . İleride tanımladığınız hızlı ileri bir birleştirme yaptığınızda git reset, önceki duruma geri dönmek için kullanabilirsiniz :

git reset --hard <commit_before_merge>

Sen bulabilirsiniz <commit_before_merge>ile git reflog, git logya da, sen moxy hissediyorsanız (ve başka değil bitti bir şey var):git reset --hard HEAD@{1}


6
hızlı cevap için teşekkürler .. git log bakarak, git birleştirme geliştirmek aslında diğer tüm taahhütleri koyar gibi birleştirme öncesi taahhüt 50 + geri taahhüt eder. Sanırım ne elde edemiyorum, eğer bu birleşmenin ne olduğunu / nerede olduğunu bilmiyorsam - nasıl bulabilirim? Commit_before_merge'yi bulursunuz .. Sanırım bu kısmı anlamıyorum
cgmckeever

4
git reflog ile benziyor son kafaları güzelce özetliyor ve nereye sıfırlamam gerektiğini bilmeme izin veriyor. git günlüğü, sıfırlanacak yeri tam olarak belirlemek için çok fazla ayrıntı düzeyine sahip gibi görünüyor. Teşekkürler
cgmckeever

1
Evet, refloghayat kurtarıcı. HEAD@{1}sadece HEAD'in en son ikinci durumunu veya daha teknik olarak açıklar: "Bir ref, ardından bir küme çifti içine alınmış bir sıra belirtimi içeren bir sonek (örn., {1}, {15}) bunun n'inci önceki değerini belirtir ref."
Christopher

4
Geri döndürmeyi uzaktan kumandaya itmeye ne dersiniz? Nasıl çalışacağını görmüyorum.
Anton Savelyev

2
Bu umutsuz. Birleşmeden sonra tüm taahhütleri yok eder.
aaa90210

151

Buradan:

http://www.christianengvall.se/undo-pushed-merge-git/

git revert -m 1 <merge commit hash>

Git revert, belirtilen taahhüdü geri alan yeni bir tamamlama ekler.

-M 1 kullanılması, bunun bir birleştirme olduğunu ve ana daldaki ana taahhüde geri dönmek istediğimizi söyler. Geliştirme dalını belirtmek için -m 2 kullanırsınız.


30
Bundan sonra şubeyi yeniden birleştiremeyeceğinizi unutmayın; dokümanlar şöyle diyor: "Birleştirme taahhüdünü geri almak, birleştirmenin getirdiği ağaç değişikliklerini asla istemeyeceğinizi açıklar. Sonuç olarak, daha sonraki birleştirmeler yalnızca tanıtılan ağaç değişikliklerini getirir daha önce geri döndürülmüş birleştirme işleminin atası olmayan taahhütlere göre. Bu istediğiniz olabilir veya olmayabilir. "
Dalibor Karlović

23
@ DaliborKarlović Bu ifade biraz sert. Kesinlikle bu değişiklikleri daha sonra geri getirebilirsiniz, hile geri dönüşü geri döndürmektir. Daha fazla bilgi burada "geri alma geri döndürülüyor" bölümünde
Hilikus

3
Maalesef here@Hilikus yorumundaki bağlantı artık geçerli değil. Site, içeriğin bir kitaba ( git-scm.com/book/en/v2 ) taşındığını iddia ediyor, ancak öyleyse, orada bulmak önemsiz değil.
Jesse Chisholm

@ DaliborKarlović yukarıdaki cevap @Christopher'dan böyle mi?
James B

3
Geri alınan birleştirme içeriği buraya
SEK

28

Sadece birleştirme işlemini sıfırlayın git reset --hard HEAD^.

--No-ff git komutunu kullanırsanız, arada bir şey işlemeseniz bile her zaman birleştirme oluşturur. --No-ff git olmadan hızlı bir ileri gidersiniz, yani dallarınız HEAD birleşmiş dalın HEAD'ına ayarlanır. Bu sorunu çözmek için ve geri dönmek istediğiniz işlem kimliğini bulun git reset --hard $COMMITID.


1
Birleştirme öncesi taahhüdü bilmiyorsanız iyi bir çözüm.
iglesiasedd

Taahhüt kimliği bilmediğim için benim için çalıştı + 1
Anant Singh --- Alive to Die

istenmeyen birleştirme zaten uzaktan ayarlanmışsa , geri döndükten sonra uzak dalı güncellemek için git push -f komutunu kullandım.
zumek

16
git revert -m 1 88113a64a21bf8a51409ee2a1321442fd08db705

Ancak beklenmedik yan etkileri olabilir. Git-scm.com/docs/git-revert--mainline parent-number içindeki seçeneğe bakın

Belki de kaba ama etkili bir yol, bu taahhüdün sol üst öğesini kontrol etmek, tüm dosyaların bir kopyasını oluşturmak, HEADtekrar kontrol etmek ve tüm içeriği eski dosyalarla değiştirmek olacaktır. Sonra git size ne geri alındığını söyleyecek ve kendi geri dönüş taahhüdünüzü oluşturacaksınız :)!


1
+1 çünkü bu cevap sıfırlama gibi geçmişle uğraşmaz (zaten uzaktan kumandaya bastıysanız gerçekten önemlidir). Ama ne beklenmedik yan etkiler beklemeliyim?
pedromanoel

3
Bu belirttiğiniz yan etki mi? Reverting a merge commit declares that you will never want the tree changes brought in by the merge. As a result, later merges will only bring in tree changes introduced by commits that are not ancestors of the previously reverted merge. This may or may not be what you want.
pedromanoel

1
git resetÇözüm olduğunu söylüyorsunuz , ancak bunun beklenmedik yan etkileri olabileceğini de belirtiyorsunuz. Ancak, bu bağlantı git revertdeğil, değil git reset:)
Mark

2
Git reset'in -m bayrağı olmadığını lütfen unutmayın. Ayrıca @JorgeOrpinel'e git-reset değil de git-revert belgelerine başvurduğuna dikkat edin. Sanırım git revertdeğil demek istedimgit reset
Devin Gleason Lambert

Önlemek için nasıl Anahat belirtildi ama 1234xyz bir birleştirme değil işlemek hatası.
Achal

0

Şubeyi birleştirdiyseniz, bir çekme isteği kullanarak birleştirmeyi geri döndürdüyseniz ve bu çekme isteğini geri almak için birleştirdiyseniz.

Hissettiğim en kolay yol:

  1. Geliştirme / master'dan (birleştirdiğiniz yerde) yeni bir şube çıkarın
  2. Kullanarak git revert -m 1 xxxxxx(geri alma bir dal kullanılarak birleştirildiyse) veya git revert xxxxxxbasit bir geri alma yöntemini kullanarak geri alma
  3. Yeni dalda artık yeniden birleştirmek istediğiniz değişiklikler bulunmalıdır.
  4. Geliştirmek / master yapmak için değişiklik yapın veya bu dalı birleştirin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.