git geçmişten birleştirme kaydetmeyi kaldır


99

Git geçmişim şöyle görünüyor:

Git geçmişi

Mor taahhütleri tek bir parçaya sıkıştırmak istiyorum. Onları bir daha taahhüt günlüğümde görmek istemiyorum.

Bir yapmaya çalıştım git rebase -i 1, ancak 1mavi dalda olmasına rağmen (resme bakın), hala mor dalımdaki her işlemi görüyorum.

Mor dalı nasıl tamamen kaldırabilirim (kaydetme günlüğünden)?


Deponuz, başkalarının ondan çıkardığı herhangi bir yere itildi mi?
Schleis

Her iki şube de tamamen yereldir.
Benjamin Toueg

Yanıtlar:


102

Bunu git rebase -i <sha before the branches diverged>yapmak, birleştirme işlemini kaldırmanıza izin verir ve günlük istediğiniz gibi tek bir satır olur. Ayrıca artık istemediğiniz herhangi bir kaydı silebilirsiniz. Geri ödemenizin işe yaramamasının nedeni, yeterince geriye gitmemenizdi.

UYARI: Bunu yaparak geçmişi yeniden yazıyorsunuz. Bunu uzak bir depoya gönderilen değişikliklerle yapmak sorunlara neden olacaktır. Bunu yalnızca yerel olan işlemlerle yapmanızı öneririm.


4
Dallar ayrılmadan önce bir sha
seçsem bile

1
Evet, sonra gelen düzenleyicide onları silersiniz git rebaseve kaldırılırlar.
Schleis

4
Kaydetmelerin silinmesi, birleştirmedeki tüm değişikliklerin kaybedilmesine neden oldu. Ama yumuşak bir sıfırlama yaptım ve istediğim gibi bir şeye sahip oldum (sipariş ilk beklentilerle eşleşmiyor).
Benjamin Toueg

2
bu cevap ayrıntılı olarak eksik, geri ödemeyi hangi şubeden başlatıyorsunuz?
grgry

3
İşlemleri 'kaldırmak' istemediğinizden oldukça emin olun. Yeniden temelde 'kaldır' bir seçenek değildir, ancak silme işlemidir. bir kaydetmeyi silerseniz, yaptığı değişiklikleri kaybedersiniz. Kayıtları ezmek istiyorsun.
thecoshman

71

Orijinal durumda repo ile başlama

Orijinal repo geçmişi

Birleştirme işlemini kaldırmak ve dalı ana hattaki tek bir işleme halinde sıkıştırmak için

Ezilmiş kayıtlar, birleştirme kaydı yok

Şu komutları kullanın (5 ve 1'i karşılık gelen kayıtların SHA'ları ile değiştirin):

git checkout 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git rebase HEAD master

Bir birleştirme kaydını tutmak ancak şube taahhütlerini bire sıkıştırmak için:

Ezilmiş kaydetmeler, tutulan birleştirme taahhüdü

Şu komutları kullanın (5, 1 ve C'yi karşılık gelen kayıtların SHA'ları ile değiştirin):

git checkout -b tempbranch 5
git reset --soft 1
git commit --amend -m '1 2 3 4 5'
git checkout C
git merge --no-ff tempbranch
git rebase HEAD master

Birleştirme taahhüdünü kaldırmak ve şubeden bireysel taahhütlerle değiştirmek için

Şube ana hatta taşındı, birleştirme taahhüdü yok

Yapmanız gereken (5'i karşılık gelen kaydetmenin SHA'sı ile değiştirin):

git rebase 5 master

Ve son olarak, dalı tamamen kaldırmak için

Şube tamamen kaldırıldı

Bu komutu kullanın (C ve D'yi ilgili kayıtların SHA'ları ile değiştirin):

git rebase --onto C D~ master

içinde git rebase 5 mastersöz, neden değil "ABC 1 2 3 4 5 D ..." emridir?
Roy

1
Bu komut, masterortak noktaları olmayan 5commit'leri alır ve üstüne yerleştirir 5. Taahhüt C, neslinin bir parçası değil 5, ilk taşınacak 5.
Allen Luce

2
"ABC 1 2 3 4 5 D ..." ile bitirmek istiyorsanız şunları yapabilirsiniz:git rebase C 5; git rebase 5 master
Allen Luce

19

Bir Birleştirme İşlemini Kaldırmak İçin

Tek yapmak istediğiniz, hiç olmamış gibi olması için bir birleştirme işlemini (2) kaldırmaksa, komut basitçe aşağıdaki gibidir

git rebase --onto <sha of 1> <sha of 2> <blue branch>

Ve şimdi mor dal hiç mavi işlem günlüğünde değil ve yine iki ayrı dalınız var. Daha sonra moru bağımsız olarak ezebilir ve arada birleştirme taahhüdü olmadan istediğiniz diğer işlemleri yapabilirsiniz.


1
Tüm cevaplar arasında, bunu hem en basit hem de yapması en kolay olanı buluyorum. Teşekkür ederim.
Roshambo

16

İstediğiniz şeye bağlı olarak bunun üstesinden gelmenin iki yolu vardır:

1.Çözüm : Geçmişi koruyarak mor taahhütleri kaldırın (geri almak istemeniz durumunda)

git revert -m 1 <SHA of merge>

-m 1 hangi üst satırın seçileceğini belirtir

Mor taahhütler tarihte hala orada olacak, ancak geri döndüğünüz için bu işlemlerden kod görmeyeceksiniz.


Çözüm 2 : Mor taahhütleri tamamen kaldırın (depo paylaşılıyorsa yıkıcı değişiklik)

git rebase -i <SHA before branching out>

ve mor işlemlere karşılık gelen sil (satırları kaldır).

Birleştirmeden sonra taahhütler yapılmazsa, bu daha az yanıltıcı olur. Ek taahhütler sırasında çatışma olasılığını artırır revert/rebase.


Bu kulağa doğru gelmiyor. Orijinal posterin ilk başta mor taahhütlerle ne yapmak istediğini söylemenin zor olduğu gerçeğini bir kenara bırakırsak, birleştirmeyi geri alırsanız, sorun değil, bu, bu işlemedeki değişikliklerin tersine bir yama yapacak ve başka bir işlem, mor taahhütleri iptal etmek. Gibi 1 - 1 = 0. Ancak mor taahhütleri yeniden temel alırsanız, onu da yeniden desteklemediğiniz sürece, geri alınan yamayı geride bırakırsınız. Bunu yapmazsanız, bu -1geçmişinize başvurmak gibidir 0, bu yüzden istemediğiniz değişiklikleri geride bırakırsınız.

@Cupcake, verilen iki ayrı cevaptı. P: Ben kafa karıştırıcı az cevabını revize var
Prem

AFAIK OP'nin istediği bu değil. Değişiklikleri saklamak, ancak günlüğündeki gürültüyü kaldırmak istiyor. Bunun için taahhütleri bastırması gerekiyor, silmek değişiklikleri kaldıracak.
thecoshman

Doğru, orijinal soru yeniden ifade edilmiş gibi görünüyor. Bu cevap OP problemi için değildir.
Prem
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.