Git: Şubedeki tüm taahhütler nasıl ezilir


315

Şununla yeni şube açıyorum master:

git checkout -b testbranch

20 taahhütte bulundum.

Şimdi bu 20 taahhüdü ezmek istiyorum. Bunu şu şekilde yapıyorum:

git rebase -i HEAD~20

Ne kadar taahhütte bulunduğumu bilmiyorsam ne olur? Gibi bir şey yapmanın bir yolu var mı:

git rebase -i all on this branch

6
Yapabileceğin git rebase -i 58333012713fc168bd70ad00d191b3bdc601fa2dcommitnumber son nerede olduğunu kalır taahhüt wich interaktif rebase yapacak değişmeden
Denns

Geçen bu yöntemi kullanarak @denns sen rebasing olan dalında taahhüt gelen fantastik çalıştı. Çok teşekkürler!
Joshua Pinter

Yanıtlar:


395

Tüm taahhütlerinizi ezmenin bir başka yolu, dizini master yapmak için sıfırlamaktır:

 git checkout yourBranch
 git reset $(git merge-base master yourBranch)
 git add -A
 git commit -m "one commit on yourBranch"

Hangi daldan "yourBranch" ın geldiğini bildiğiniz için bu mükemmel değildir.
Not: Git ile bu başlangıç ​​dalını bulmak kolay / mümkün değildir ( görsel yol genellikle burada görüldüğü gibi en kolaydır ).


EDIT: kullanmanız gerekecek git push --force


Karlotcha Hoa ekler yorumlarda :

Sıfırlama için şunları yapabilirsiniz

git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD)) 

[That] şu anda bulunduğunuz dalı otomatik olarak kullanır.
Bunu kullanırsanız , komut şube adına bağlı olmadığından bir takma ad da kullanabilirsiniz .


2
YourBranchŞu anda nerede olduğunu taahhüt etmek için ödeme yapmak daha iyi . Bu tutacak YourBranchbunu yaptığında bozulmamışreset
Eugen Konkov

1
@Abdurrahim Veya bir git bash açın ve siz tho komutlarını kopyalayıp yapıştırabilirsiniz!
VonC

3
Sıfırlama için, git reset $(git merge-base master $(git rev-parse --abbrev-ref HEAD))şu anda bulunduğunuz dalı otomatik olarak kullanabilirsiniz. Bunu kullanırsanız, komut dal adına bağlı olmadığından bir takma ad da kullanabilirsiniz.
Karlotcha Hoa

1
@Druska Simlpe dallanma vakaları için, hayır, iyi çalışmalıdır.
VonC

1
@Shimmy evet, sıfırlamadan sonra zorla itmeniz şartıyla: git push --force(ve o dalda çalışan birkaç kişi iseniz meslektaşlarınızı uyarın)
VonC

112

Tüm taahhütleri tek bir taahhütte ezmek istediğiniz şubeyi kontrol edin. Diyelim ki denir feature_branch,.

git checkout feature_branch

Aşama 1:

origin/feature_branchYerel masterşubenizle yumuşak bir sıfırlama yapın (ihtiyaçlarınıza bağlı olarak, başlangıç ​​noktası / master ile de sıfırlayabilirsiniz). Bu işlem, bilgisayarınızdaki tüm ekstra işlemleri sıfırlar feature_branch, ancak dosya değişikliklerinizi yerel olarak değiştirmeden.

git reset --soft master

Adım 2:

Git repo dizininizdeki tüm değişiklikleri, oluşturulacak yeni işleme ekleyin. Ve aynısını bir mesajla yerine getirin.

git add -A && git commit -m "commit message goes here"


6
Bu benim için en güvenilir çözümdü - herhangi bir rebase hatasına veya çatışmaları birleştirmemek.
ANTARA

1
Uyarı: git add -A yerel klasörde bulunan HERŞEYİ - şubeye ekleyin.
David H

Bu çözümü seviyorum! tam da istediğim buydu!
jacoballenwood

1
Bir noob için en iyi çözüm - olmayan yıkıcı ve sadece hop an çok fazla vb uygulama sırrı olarak kontrol edilebilir, hangi olmamalı olsun uygun bir gitignore dosyanız varsa
kkarakk

@NSduToit Kısa cevap: Hayır, zorunda değilsiniz. Cevabımda yukarıda belirtilen adımları uyguladıktan sonra, bazı kod değişiklikleriyle bir taahhütte bulunacaksınız. Bunu, bazı kod değişiklikleriyle yapılan herhangi bir işlem gibi düşünebilirsiniz. Bunu -fbayrak olmadan uzak şubenize itebilirsiniz .
shanky

110

Yaptığınız şey oldukça hataya açık. Sadece yap:

git rebase -i master

bu otomatik olarak sadece şubenizin mevcut en son yöneticiye vereceği taahhütleri otomatik olarak yeniden oluşturur.


5
teşekkürler, ben anladım, ama neden benim sistem hatası eğilimli
user3803850 18:14

10
Muhtemelen numarayı yanlış yapmak kolay olduğu için mi?
Daniel Scott

13
Bu en iyi çözümünüz olduğu konusunda hemfikir. ancak ne yapmanız gerektiğini daha iyi açıkladığı için bu bağlantıyı takip edin .
Christo

3
Squashing taahhütleri yerine, şubeyi master'a birleştirebilir ve tüm taahhütleri bozmak için orijin / master'a git resetini yapabilirsiniz. Bu, mevcut etiketsiz kodunuzucommit -am "the whole thing!"
nurettin

2
@nurettin Bence reset origin/masteryöntem gerçekten kötü, doğrudan master üzerinde taahhütte bulunmakla aynı - 'birleştirme dalı' geçmişi, çekme isteği seçeneği yok. @WaZaA'nın cevabı bence normal git iş akışına uygun olarak çok daha fazla
Drenai

79

Bunu yapmanın bir başka basit yolu: başlangıç ​​dalına gidin ve a merge --squash. Bu komut "ezilmiş" işlemi yapmaz. bunu yaptığınızda, Şubenizin tüm taahhüt mesajları toplanacaktır.

$ git checkout master
$ git merge --squash yourBranch
$ git commit # all commit messages of yourBranch in one, really useful
 > [status 5007e77] Squashed commit of the following: ...


1
Bu, üst dalda ezmek istemiyorsanız işe yarar, sadece üst daldan yola çıkarak yeni bir dal oluşturun ve kabak birleştirin.
Charlotte

Şerefe dostum, harika ipucu!
Nestor Milyaev

Güzel! i içine "yourBranch" ezmek için ilk "master" kapalı bir "temp" şube oluşturmak, sonra "master" içine "temp" birleştirmek.
lazieburd

34

Master'dan ayrıldığınızı varsayarsak yourBranch, sıfırlama adımına her zaman girmeniz gerekmez :

git checkout yourBranch
git reset --soft HEAD~$(git rev-list --count HEAD ^master)
git add -A
git commit -m "one commit on yourBranch"

Açıklama :

  • git rev-list --count HEAD ^masterözellik dalınızı master'dan yaptığınızdan beri taahhütleri sayar, f.ex. 20.
  • git reset --soft HEAD~20son 20 işlemin yumuşak bir sıfırlamasını yapacaktır. Bu, dosyalarınızdaki değişikliklerinizi bırakır, ancak taahhütleri kaldırır.

Kullanımı :

Benim .bash_profile gisquashbir komut ile bunu yapmak için bir takma ad ekledim :

# squash all commits into one
alias gisquash='git reset --soft HEAD~$(git rev-list --count HEAD ^master)'

Sıfırladıktan ve taahhüt ettikten sonra yapmanız gereken bir git push --force.

İpucu :

Gitlab> = 11.0 kullanıyorsanız, şubeleri birleştirirken ezme seçeneği olduğu için artık bunu yapmanız gerekmez . Gitlab Ezme seçeneği


15

Birkaç Stackoverflow sorusunu ve ezilmeyle ilgili cevapları okumaya dayanarak, bunun bir daldaki tüm taahhütleri ezmek için iyi bir astar olduğunu düşünüyorum:

git reset --soft $(git merge-base master YOUR_BRANCH) && git commit -am "YOUR COMMIT MESSAGE" && git rebase -i master

Bu ustanın üssü olduğu varsayılmaktadır.


1
Çok teşekkürler, şirketin yerinde bir çok kısıtlaması var ve kaydetmek için yüksek sesle olmadığı gibi bir editörle olağan yolu yeniden birleştiremedi. Ayrıca bu şube birleşmek için Lead dev'e gider ve beğenmez gibi git de squash ve birleştirme özelliği kullanamadı. Bu 1 astar işe yaradı ve baş ağrılarını kurtardı. Harika iş.
L1ghtk3ira

10

Tıklamayı tercih edenler için çözüm:

  1. Sourcetree yükleyin (ücretsiz)

  2. Taahhütlerinizin nasıl göründüğünü kontrol edin. Büyük olasılıkla buna benzer bir şeyiniz var resim açıklamasını buraya girin

  3. Ebeveyn taahhüdüne sağ tıklayın . Bizim durumumuzda ana dal.

resim açıklamasını buraya girin

  1. Bir düğmeyi tıklatarak öncekiyle squash yapabilirsiniz. Bizim durumumuzda 2 kez tıklamak zorundayız. Tamamlama mesajını da değiştirebilirsiniz resim açıklamasını buraya girin

  2. Sonuçlar harika ve itmeye hazırız! resim açıklamasını buraya girin

Yan not: Kısmi taahhütlerinizi uzaktan kumandaya bastırıyorsanız, kabaktan sonra kuvvet itme kullanmanız gerekir


Bunun için teşekkürler!
Kristal

0

Başka bir çözüm, tüm taahhüt günlüklerini bir dosyaya kaydetmek olacaktır

git log> branch.log

Şimdi branch.log başladıktan sonra tüm taahhüt kimlikleri olacaktır .. ilk taahhüdü kullanarak aşağı kaydırın ve ilk taahhüdü alın (bu terminalde zor olacaktır)

git reset --soft

tüm taahhütler ezilecek


0

Git reset, daha önce birçok cevapta belirtildiği gibi, istediğinizi elde etmenin en iyi ve en basit yoludur. Aşağıdaki iş akışında kullanıyorum:

(geliştirme dalında)

git fetch
git merge origin/master  #so development branch has all current changes from master
git reset origin/master  #will show all changes from development branch to master as unstaged
git gui # do a final review, stage all changes you really want
git commit # all changes in a single commit
git branch -f master #update local master branch
git push origin master #push it

0

Tüm bu git sıfırlama, sert, yumuşak ve burada belirtilen her şey muhtemelen (benim için işe yaramadı) adımları doğru ve bir tür cin yaparsanız çalışıyor.
Ortalama bir Joe smo iseniz, şunu deneyin:
git merge --squash nasıl kullanılır?


Hayatımı kurtardım ve squash'a gideceğim, bunu öğrendiğimden beri 4 kez kullanıyorum. Basit, temiz ve temelde 1 comamnd. Kısacası:


Eğer bir şubedeyseniz "off_new_feature" diyelim gelişmeye devam edelim ve çekme talebinizin 35 taahhüt (veya birçok) var ve 1 olmasını istiyorsunuz.

A. Şubenizin güncel olduğundan emin olun, Devam edin "my_new_feature" ile herhangi bir çatışmayı geliştirmek, en son almak ve birleştirmek ve çözmek
(bu adım gerçekten her zaman olabildiğince çabuk almak gerekir)

B. En son geliştirmek ve yeni bir şube "my_new_feature_squashed" olarak adlandırmak dal

C. sihir burada.
Çalışmanızı "my_new_feature" tan "my_new_feature_squashed" e götürmek istiyorsunuz.
Sadece yapın (yeni
dalınızda geliştirirken geliştirdik): git merge --squash my_new_feature

Tüm değişiklikleriniz şimdi yeni şubenizde olacak, test etmekten çekinmeyin, daha sonra o şubenin 1 tek taahhüdünü, itmesini, yeni PR'sini yapın ve ertesi günü tekrarlayın.
Kodlamayı sevmiyor musun? :)


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.