Git deposunun ilk iki taahhüdü birleştirilsin mi?


197

Diyelim ki A, B ve C üç komitesini içeren bir geçmişiniz var :

A-B-C

İki A ve B taahhüdünü bir taahhüt AB ile birleştirmek istiyorum :

AB-C

denedim

git rebase -i A

editörümü aşağıdaki içeriklerle açar:

pick e97a17b B
pick asd314f C

Bunu ben olarak değiştiriyorum

squash e97a17b B
pick asd314f C

Sonra Git 1.6.0.4 şöyle diyor:

Cannot 'squash' without a previous commit

Bir yol var mı yoksa bu imkansız mı?



Yanıtlar:


169

git rebase -i --root Git 1.7.12 sürümünden itibaren kullanın .

Etkileşimli Rebase dosyasında, taahhüt ikinci satırını değiştirmek B için kabak ve diğer satır bırakınız kıracağıyla :

pick f4202da A
squash bea708e B
pick a8c6abc C

Bu, iki A ve B komisyonunu bir taahhüt AB ile birleştirecektir .

Bu cevapta bulundu .


126

Denedin:

git rebase -i A

Aşağıdakilerden editziyade devam ederseniz şöyle başlayabilirsiniz squash:

edit e97a17b B
pick asd314f C

o zaman koş

git reset --soft HEAD^
git commit --amend
git rebase --continue

Bitti.


4
Bunu bir github özünü sessizce düzeltmek için yapıyorsanız, taahhüde -m "ilk" i eklemeniz gerekir. ;-)
Bruno Bronosky

1
git rebase --abortbaştan başlamak ve doğru şekilde yapmak (editördeki ilk taahhüdü ezmek değil)
oma

66

Ailk taahhütti, ama şimdi ilk taahhüt olmak istiyorsun B. git taahhütleri bütün ağaçlar, normalde tanıttıkları fark açısından tanımlanıp görüntülenseler bile farklar değil.

Bu tarif A ve B ile B ve C arasında birden fazla işlem olsa bile işe yarar.

# Go back to the last commit that we want
# to form the initial commit (detach HEAD)
git checkout <sha1_for_B>

# reset the branch pointer to the initial commit,
# but leaving the index and working tree intact.
git reset --soft <sha1_for_A>

# amend the initial tree using the tree from 'B'
git commit --amend

# temporarily tag this new initial commit
# (or you could remember the new commit sha1 manually)
git tag tmp

# go back to the original branch (assume master for this example)
git checkout master

# Replay all the commits after B onto the new initial commit
git rebase --onto tmp <sha1_for_B>

# remove the temporary tag
git tag -d tmp

1
Ben yaptığımda bu büyük bir interaktif rebase tetiklergit rebase --onto tmp <sha1_for_B>
Alex

Sadece iki taahhütle yepyeni bir repoma sahip olduğum düşünüldüğünde (bu benim bir tane olmak istedim), bu benim için mükemmel çalıştı. @CB Bailey
RominRonin

10

Etkileşimli rebase durumunda, listenin olması için bunu A'dan önce yapmanız gerekir:

pick A
pick B
pick C

olmak:

pick A
squash B
pick C

A ilk işlemse, A git farkları düşünmeden önce farklı bir ilk işlem gerçekleştirmeniz gerekir, (A ve B) ve (B ve C) arasındaki fark üzerinde çalışır. Bu nedenle kabak örneğinizde çalışmıyor.


9

Kullandığınız, kaydedilmesini yüzlerce veya binlerce olması durumunda kostmo cevabını arasında

git rebase -i --root

sadece rebase betiğinin iki kez işlemesi gereken çok sayıda taahhüt nedeniyle , bir kez etkileşimli rebase düzenleyici listesini oluşturmak için (her bir işlem için hangi eylemi gerçekleştireceğinizi seçtiğinizde) ve bir kez de taahhütlerin yeniden uygulanması.

İşte bir olan alternatif çözüm interaktif Rebase editörü listesini oluştururken zaman maliyetini önleyecektir interaktif rebase kullanmayarak ilk etapta. Bu şekilde, Charles Bailey'nin çözümüne benzer . Sadece ikinci taahhütten bir yetim dalı oluşturursunuz ve daha sonra tüm soyundan gelen taahhütleri yeniden temellendirirsiniz:

git checkout --orphan orphan <second-commit-sha>
git commit -m "Enter a commit message for the new root commit"
git rebase --onto orphan <second-commit-sha> master

belgeleme



0

Kadro için Git komutu: git rebase -i HEAD ~ [işlem sayısı]

Diyelim ki git işlem geçmişi aşağıda:


feat 5152061 feat: Resmi kaydetmek için destek eklendi. (A)
39c5a04 seçin Düzeltme: hata düzeltmeleri. (B)
839c6b3 düzeltmesini seçin: çakışma çözüldü. (C)

Şimdi A ve B'yi AB'ye ezmek istiyorsunuz, aşağıdaki adımları uygulayın:


feat 5152061 feat: Resmi kaydetmek için destek eklendi. (A)
s 39c5a04 Düzeltme: hata düzeltmeleri. (B)
839c6b3 düzeltmesini seçin: çakışma çözüldü. (C)

Not: ezme işlemi için squash veya s kullanabilirsiniz. Sonuç olarak:
pick 5152061 feat: Resmi kaydetmek için destek eklendi. (AB)
839c6b3 düzeltme düzeltmesi: çakışma çözüldü. (C)


-1

Biraz komut satırı büyüsü yapmalısınız.

git checkout -b a A
git checkout B <files>
git commit --amend
git checkout master
git rebase a

Bu size taahhütte AB ve C olan bir şube bırakmalıdır.


Eski ve yeni ilk taahhütlerin ortak bir atası olmadığı için git, ortak bir ağacı olmasına rağmen, ustanın tüm tarihini a'ya uygulamaya çalışırken gereksiz bazı çatışmalar yaşayabilirsiniz. Git rebase için --onto seçeneğini kullanarak git uygulamasına başlamak için doğru yeri söyleyebilirsiniz.
CB Bailey
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.