Onlar itildikten sonra git'te nasıl ezilir?


550

Bu, çoklu taahhütleri ezmenin iyi bir açıklamasını verir:

http://git-scm.com/book/en/Git-Branching-Rebasing

ancak daha önce itilmiş olan taahhütlerde işe yaramıyor. Hem yerel hem de uzak depolarımdaki en son birkaç taahhüdü nasıl ezebilirim?

DÜZENLEME: Ne zaman git rebase -i origin/master~4 master, ilk olarak pick, diğer üç olarak ayarlamak squashve sonra çıkmak (emacs cx cc üzerinden), aldığımda:

$ git rebase -i origin/master~4 master
# Not currently on any branch.
nothing to commit (working directory clean)

Could not apply 2f40e2c... Revert "issue 4427: bpf device permission change option added"
$ git rebase -i origin/master~4 master
Interactive rebase already started

burada 2f40 picktaahhüttür. Ve şimdi 4 komisyondan hiçbiri görünmüyor git log. Bir taahhüt mesajı girebilmem için editörümün yeniden başlatılmasını bekledim. Neyi yanlış yapıyorum?

Yanıtlar:


779

Squash yerel olarak

git rebase -i origin/master~4 master

ve sonra zorla itme

git push origin +master

Fark arasında --forceve+

Aşağıdakilerin dokümantasyonundan git push:

Not --forcedolayısıyla bunu kullanarak itilir tüm hakemlerimizle için geçerlidir push.defaultetmek seti matchingveya yapılandırılmış birden itme hedeflere sahip remote.*.push(onların uzaktan meslektaşı arkasında kesinlikle yerel sayılı referanslarda dahil) geçerli dalı dışındaki ref üzerine yazabilir. Bir zorlamayı yalnızca bir dala + zorlamak için, refspec'in önünde git push origin +masterbir iterek itin (örneğin dalağa zorla itmek için master).


30
ayrıcagit push --force origin master
Daenyth

7
Daenyth : Evet, ama her zaman bu sözdizimini tercih ediyorum çünkü bu daha kısa.
Alan Haggai Alavi

86
Ve elbette, eğer uzaktaki depodan başka biri çekmiş olsaydı, muhtemelen bunu yapmak istemezsiniz - bu durumda cevap “yapmazsınız”.
Cascabel

10
Ayrıca, ben OP tam olarak komutu kopyalamak olduğunu düşünüyorum git rebase -i origin/masterve aslında nasıl daha geri taahhüt eder, örn git rebase -i origin/master~20 master.
Cascabel

6
gstackoverflow :+yalnızca önekinin bulunduğu refspec'i zorlar. --forceitilen tüm referansları zorlar. Lütfen güncellenmiş cevaba bakınız.
Alan Haggai Alavi

120

Bir dalda böyle yapabilirdim (son 4 komisyon için)

git checkout my_branch
git reset --soft HEAD~4
git commit
git push --force origin my_branch

1
Bunu zaten itilmiş bir dalda yumuşak komutla yapmak benim için bir ton başka insanı itti.
cchamberlain

3
Bir ton mu? Nasıl 4'ten fazla olabilir? Detaylandırabilir misin?
jakob-r

Emin değilim ama zaten itilmiş bir taahhüdü ezmeye çalışmakla ilgisi vardı. Başkalarının burada benzer deneyimlediği
anlaşılıyor

4
Bunu beklenen cevap olarak kabul ederdim. Cevabı kabul eden daha temiz.
vikramvi

4
Bu sadece 4 adımda en açık ve kabul edilen cevaptır
Ameya Salagre

45

Kabul edilen cevapta ufak bir fark vardı, ama çok fazla zorluk çekiyordum ve sonunda anladım.

$ git rebase -i HEAD~4
  • Açılan interaktif ekranda, squash yapmak istediğiniz tüm taahhütler için üstteki squash ile seçim yapın .
  • Düzenleyiciyi kaydedip kapatın esc --> :wq

Uzaktan kumandayı aşağıdakileri kullanarak itin:

$ git push origin branch-name --force

2
kısa ve etkili, ayrıntılı:
terwxqian

22

Sorunların bir sürü sadece bir oluşturarak önlenebilir branchüzerinde çalışmaya & değil çalışan master:

git checkout -b mybranch

remoteZaten itilmiş olan remotetaahhütler ve localsadece itilmiş taahhütlerin / sadece taahhütlerin bir karışımı için aşağıdaki işler :

# example merging 4 commits

git checkout mybranch
git rebase -i mybranch~4 mybranch

# at the interactive screen
# choose fixup for commit: 2 / 3 / 4

git push -u origin +mybranch

Ayrıca yardımcı olabilecek bazı çekme isteği notlarım var.


17

git rebase -i master

editör vm'yi açacaksınız ve bunun gibi bir şey

Pick 2994283490 commit msg1
f 7994283490 commit msg2
f 4654283490 commit msg3
f 5694283490 commit msg4
#Some message 
#
#some more

Burada tüm diğer taahhütlerin seçimini "f" olarak değiştirdim.

git push -f origin feature/feature-branch-name-xyz

bu, tüm taahhütleri bir taahhüde sabitleyecek ve diğer tüm taahhütleri kaldıracaktır. Bunu yaptım ve bana yardımcı oldu.


3

Bir Gitlab veya Github ile çalışırken bu şekilde sorun yaşayabilirsiniz. Yukarıdaki yöntemlerden biriyle taahhütlerinizi eziyorsunuz. Benim tercih ettiğim:

git rebase -i HEAD~4
or
git rebase -i origin/master

taahhüt için squash veya fixup seçin. Bu noktada git durumunu kontrol edersiniz. Ve mesaj şöyle olabilir:

    On branch ABC-1916-remote
    Your branch and 'origin/ABC-1916' have diverged,
    and have 1 and 7 different commits each, respectively.
      (use "git pull" to merge the remote branch into yours)

Ve çekmek için cazip olabilirsiniz. Bunu YAPMAYIN yoksa önceki durumla aynı durumda olacaksınız.

Bunun yerine menşeinize şunları itin:

git push origin +ABC-1916-remote:ABC-1916

+ Sadece bir dala doğru itmeye izin verir.



2

Biri zaten itilmiş olan iki taahhüdü ezmek için, tek bir dalda aşağıdakiler işe yaradı:

git rebase -i HEAD~2
    [ pick     older-commit  ]
    [ squash   newest-commit ]
git push --force

Varsayılan olarak, bu, en eski taahhüdün bir yorum olarak en yeni taahhüdünün taahhüt mesajını içerecektir.


2

1) git rebase -i HEAD~4

Detaylandırmak için: Mevcut dalda çalışır; HEAD ~ 4, son dört işlemin ezilmesi anlamına gelir; etkileşimli mod (-i)

2) Bu noktada, editör, ikinci ve sonraki taahhütleri değiştirmek, seçim yerine squash ile değiştirmek için kaydeder.

çıktı: Refs / heads / branch-name başarıyla yeniden oluşturuldu ve güncellendi.

3) git push origin refs/heads/branch-name --force

çıktı:

remote:
remote: To create a merge request for branch-name, visit:
remote: http://xxx/sc/server/merge_requests/new?merge_request%5Bsource_branch%5D=sss
remote:To ip:sc/server.git
 + 84b4b60...5045693 branch-name -> branch-name (forced update)
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.