Git: Bir kesinleştirme nasıl tersine birleştirilir?


124

SVN ile bir commit'i tersine birleştirmek kolaydır, ancak bunu Git ile nasıl yapabilirim?



Soruyla kast edilenin bu olduğunu sanmıyorum. SVN'deki ters birleştirme, aynı zamanda değişiklikleri kaydetmeden yerel değişikliklere geri döndürür, böylece onları düzenleyebilir ve yeniden kaydedebilirsiniz.
Dormouse

Yanıtlar:


105

Geçmiş bir kaydetmenin değişikliklerini 'geri alan' yeni bir kaydetme oluşturmak için şunu kullanın:

$ git revert <commit>

Geçmişte keyfi bir noktadan bir commit'i yeniden oluşturarak ve sonra sıfırlayarak gerçekten kaldırmak da mümkündür, ancak taahhütlerinizi zaten başka bir depoya aktardıysanız (veya başka biri sizden çekmişse) bunu gerçekten yapmak istemezsiniz. .


31
Hangi değişikliğin geri alınacağını belirtmek için muhtemelen -m <parent number>seçenek sağlamanız gerekecektir git revert. Yayınlanmamış bir geçmiş birleşimini geri almak istiyorsanız, kullanın git reset --hard HEAD^1.
Jakub Narębski

3
Jakub: Bir birleştirme kesinliğini geri alıyorsanız bu doğrudur, ancak Subversion terminolojisinde, "ters birleştirme" aslında herhangi bir tür kaydetmeyi geri almanın adıdır.
Ben James

4
Kullanmanın -m, birleştirilmemiş daldan gelecekteki bir birleştirmenin bu birleştirmeden önceki değişiklikleri içermeyeceği anlamına geldiğini unutmayın ! Birleştirilmemiş bir dalı yeniden birleştirmenin uygun yolları için schacon.github.com/git/howto/revert-a-faulty-merge.txt adresine bakın .
Martijn Pieters

125

Bir geri almak için birleştirme taahhüt, kullanmak gerekir: git revert -m <parent number>. Örneğin, 1 numaralı ebeveyni kullanarak en son birleştirme işlemini geri döndürmek için şunu kullanırsınız:

git revert -m 1 HEAD

Son kaydetmeden önce bir birleştirme işlemini geri döndürmek için şunları yaparsınız:

git revert -m 1 HEAD^

git show <merge commit SHA1>Ebeveynleri görmek için kullanın , numaralandırma göründükleri sıradır, ör.Merge: e4c54b3 4725ad2

git merge belgeleri: http://schacon.github.com/git/git-merge.html

git birleştirme tartışması (kafa karıştırıcı ama çok ayrıntılı): http://schacon.github.com/git/howto/revert-a-faulty-merge.txt


36
Ebeveynle ilişkili 'numarayı' nasıl edinebilirsiniz? Dalların içsel bir sayısal 'kimliği' var mı?
daniyalzade

7
git show <merge commit SHA1>Ebeveynleri görmek için kullanın , numaralandırma göründükleri sıradır, örneğinMerge: e4c54b3 4725ad2
supermethod

8
örnek: git revert -m 1 SHA1Bu komut, baştan önce birkaç birleştirme taahhüdü olan ve altında birçok kaydetme olan bir birleştirme kesinleştirmesini geri döndürmem için çalıştı.
c.apolzon

3
Ebeveynler hangileri? E4c54b3 veya 4725ad2?
Yunus

1
Bu, git gösterinin sonuçlarının ebeveyn sayılarıyla nasıl ilişkili olduğu hakkında hala yeterli bilgi sağlamıyor. "Göründükleri sıra" 1 tabanlı mı? 0 tabanlı? Bu örnekte özellikle, ebeveyn 1'in SHA1'i nedir? e4c54b3 veya 4725ad2?
başlık

4

Seni doğru anladıysam, bir şey yapmaktan bahsediyorsun

svn merge -rn:n-1

daha önceki bir işlemden geri dönmek için, bu durumda muhtemelen

git revert

0
git reset --hard HEAD^ 

Birleştirme değişikliklerini geri almak için yukarıdaki komutu kullanın.


3
Bu, orijinal posterin istediğini yapmayan birleştirme taahhüdünü ortadan kaldırır. OP, önceki değişikliklerin geçmişini tamamen silmeye değil, önceki değişiklikleri geri almak için ters bir yama yapmaya çalışıyor.

-1

Taahhüt etmek istemezseniz veya daha sonra taahhüt etmek isterseniz (taahhüt mesajı yine de sizin için hazırlanacaktır ve bunu da düzenleyebilirsiniz):

git revert -n <commit>
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.