Git'i kullanarak, bir dalda bulunan ancak diğer dalda olmayan tüm taahhütleri göster


465

Silmek istediğim eski bir şubem var. Ancak, bunu yapmadan önce, bu şubeye yapılan tüm taahhütlerin bir noktada başka bir şubeye birleştirildiğini kontrol etmek istiyorum. Bu nedenle, mevcut şubeme başka bir şubeye uygulanmamış olan tüm taahhütleri görmek istiyorum (ya da eğer herhangi bir komut dosyası olmadan bu mümkün değilse, bir şubede uygulanmamış olan tüm taahhütleri nasıl görür? başka bir şubeye?].


İki kol arasındaki kayıp hareketin listelemek için size compare-branches.py kullanabilir bitbucket.org/aakef/compare-git-branches
Bernd Schubert

Yanıtlar:


321

Muhtemelen sadece istiyorsun

git branch --contains branch-to-delete

Bu, "silinecek dal" dan taahhütleri içeren tüm dalları listeler. Yalnızca "silinecek şube" ifadesinden daha fazlasını bildiriyorsa, şube birleştirilmiştir.

Alternatifleriniz gerçekten sadece sözdizimi öğelerini rev listeler. örneğin git log one-branch..another-branch, her one-branchşeye another-branchsahip olması gereken her şeyi gösterir .

Ayrıca, git show-branchneyin nerede olduğunu görmenin bir yolu olarak da ilginizi çekebilir .



1
'O, şube birleştirmiş bir şey bildirirse' satır yanlış anlaşılabilir: eğer git branch --contains some-branchsadece getiri some-branch, o zaman dönüş şey yok, ama bu etmiştir değil olmuştu birleşti.
Karışıklık

5
Bunun git log foo..bar, çubuğun en yeni ve foo'nun en son arasındaki taahhütlerini göstereceğini, ancak zaman içinde daha sonra eksik olan diğer taahhütlerin gösterilmediğini unutmayın. Her şeyi barda görmek, ancak foo'da görmek için @ jimmyorr'un çözümünü kullanmalısınız.
Paul A Jungwirth

557

Taahhütlerin bir dalda olduğunu ancak başka bir dalda bulunmadığını görmek için git günlüğünü kullanın:

git log --no-merges oldbranch ^newbranch

... yani, yeni dalda olmayan eski daldaki tüm taahhütlerin taahhüt günlüklerini göster . Eklenecek ve hariç tutulacak birden çok dalı listeleyebilirsiniz, ör.

git log  --no-merges oldbranch1 oldbranch2 ^newbranch1 ^newbranch2

Not: Windows'ta ^bir çıkış anahtarıdır, bu yüzden başka biriyle kaçması gerekir ^:

git log --no-merges oldbranch ^^newbranch

2
Git iki dalı taahhütlerini karşılaştırmak için buldum.
Kullanıcı

25
Tam da aradığım şey buydu. Ama ^burada önek olarak kullanmak beni şaşırttı. Bu bağlamda bu dalı dışlamak anlamına gelir. ^Sonek olarak kullanmak , o dalın üst taahhüdüne göreli bir referans olacaktır.
Joe Flynn

4
çok faydalı teşekkürler. Merak ediyorum, --no-merges bayrağı neden gerekli? Şüphesiz bu taahhütleri de görmek ister mi?
Max MacLeod

2
Bununla gitk kullanmak ister misiniz? Basitçe kullanın gitk oldbranch ^newbranch --no-merges(git 1.8.1.1 ile test edilmiştir). Yan not, benim için ^kapsamlı HEAD şube taahhüdü anlamına geliyor newbranch.
Matt

2
@NazariiGudzovatyi - evet, var: "-cherry-pick". Dokümantasyon sayfasında
romeara

91

Taahhütleri eski dalda göstermek, ancak yeni dalda göstermek için:

git log newbranch..oldbranch

Farkı bu taahhütlerle göstermek için (üç nokta olduğuna dikkat edin):

git diff newbranch...oldbranch

İşte şema çizimi olan doktor https://git-scm.com/book/en/v2/Git-Tools-Revision-Selection#Commit-Ranges


Yukarıdaki Paul A Jungwirth'in yorumuna bakın . Bu bazı eski taahhütleri kaçırır gibi görünüyor?
Sefil Değişken

2
Eski taahhütlerin ne anlama geldiğinden emin değilim. Çift nokta temel olarak Git'ten bir işlemden erişilebilen ancak başka bir işlemden erişilemeyen bir dizi taahhüdü çözmesini ister. İşte bir diyagram çizimiyle doktor git-scm.com/book/en/v2/…
Xuan

1
ve eğer ikisinden newbrancholdbranchgit log ..oldbranchgit log newbranch..
biriysek

jimmyorr'un çözümü benim için işe yaramadı, ama bu ..refs isimleri arasındaki iki nokta sayesinde oldu . Ayrıca --cherry-pickher iki dalda bulunan ancak farklı bir karması olan taahhütleri gizleme seçeneğini kullandım çünkü bir daldan diğerine kiraz toplandılar.
flawyte

58

Hala basit bir cevap arayanlar için git cherry'e bakın . İşleme karmaları yerine gerçek farklılıkları karşılaştırır. Bu, kiraz toplanmış veya yeniden temellendirilmiş taahhütleri barındırdığı anlamına gelir.

İlk önce silmek istediğiniz şubeye göz atın:

git checkout [branch-to-delete]

daha sonra git cherry'u ana geliştirme dalınızla karşılaştırmak için kullanın:

git cherry -v master

Örnek çıktı:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message
- 85867e38712de930864c5edb7856342e1358b2a0 Yet another message

Not: -vBayrak, SHA karma ile birlikte tamamlama mesajını içermelidir.

Önde '+' bulunan satırlar silinecek daldadır, ancak ana dalda değildir. Önde '-' olanların efendide eşdeğer bir taahhütleri vardır.

SADECE usta olmayan taahhütler için kiraz seçimini grep ile birleştirin:

git cherry -v master | grep "^\+"

Örnek çıktı:

+ 8a14709d08c99c36e907e47f9c4dacebeff46ecb Commit message
+ b30ccc3fb38d3d64c5fef079a761c7e0a5c7da81 Another commit message

Bunu denedim, ama yine de mb (ana şube) olmayan fb (özellik şube) birçok taahhüt olduğunu bildiriyor. Ancak, eğer ben fb ve git diff mb yapmak, hiçbir fark görmüyorum. Rebase kullandım ve her şeyi ezdim. Bu yüzden neredeyse eminim, ama sadece emin olmak istiyorum. Eğer durum buysa, mümkünse ezmekten kaçınacağım; "Kayıp bilgi kampı yok". Geçmişi temiz tutmak ve henüz bilgi kaybetmemek için birleştirme gibi görünebilir bir günlük görüntüleme modu eklemek mümkün olup olmadığını merak ediyorum.
Outis Von Nemo

1
Burada tam senaryonuzdan emin değilsiniz, ancak birden fazla taahhütü bir araya getirdiyseniz ve bunu taahhütlerin ayrı olduğu başka bir dalla karşılaştırıyorsanız, bu kesinlikle işe yaramaz. Bu durumda, diffçeşitli dosyaları karşılaştırmak için unix yardımcı programını kullanmak isteyebilirsiniz . Ya da, geçici bir dal oluşturabilir ve orijinal dalda yaptığınız gibi tüm taahhütleri ezebilir ve daha sonra işe yarayacağını düşündüğüm bunu kullanabilirsiniz.
Tim S

50

Burada gönderilen cevapların bazıları aradığınızı bulmanıza yardımcı olurken, git şubesinin aşağıdaki alt komutu göreviniz için daha uygun bir çözümdür.

--merged , güvenli bir şekilde silinebilecek tüm şubeleri bulmak için kullanılır, çünkü bu şubeler HEAD tarafından tamamen kapsanır .

İken mastertek bir güvenle şöyle kaldırmak olabilir dalları numaralandırılamıyor komutu çalıştırabilir:

git branch --merged
  develop
  fpg_download_links
* master
  master_merge_static

# Delete local and remote tracking branches you don't want
git branch -d fpg_download_links
git push origin :fpg_download_links
git branch -d master_merge_static
git push origin :master_merge_static

# There is also a flag to specify remote branches in the output
git branch --remotes --merged

16

jimmyorr'un yanıtı Windows'ta çalışmaz. bunun --notyerine kullanmak için yardımcı olur ^:

git log oldbranch --not newbranch --no-merges

4
Bu doğru, +1. O olsa Not ^Windows üzerinde desteklenir ancak ihtiyaçlar Windows'da, (başka) olan, kaçmış olan ^: git log oldbranch ^^newbranch --no-merges.
VonC

3
Spesifik olarak, Powershell konsolunda Windows'da çalışır, ancak CMD'de ekstra "^" gerektirir.
Rod

7

Eğer durum bu ise bir (tek) tam şube 'A' birleştirilecek olan bu dal 'B' isterseniz örneğin kontrol etmek gerektiğini şube, sadece aşağıdakileri yapabilirsiniz:

$ git checkout A
$ git branch -d B

git branch -d <branchname> "Şube tamamen HEAD ile birleştirilmelidir."

Dikkat : Bu, A ile birleştirilirse B dalını siler.


3

Birleştirilmemiş taahhütleri görmek için bu basit komut dosyasını kullanabilirsiniz

#!/bin/bash
# Show commits that exists only on branch and not in current
# Usage:
#   git branch-notmerge <branchname>
#
# Setup git alias
#   git config alias.branch-notmerge [path/to/this/script]
grep -Fvf <(git log --pretty=format:'%H - %s') <(git log $1 --pretty=format:'%H - %s')

Şube durumunu görüntüleyecek git-wtf aracını da kullanabilirsiniz .


0

Sadece git cherryşubedeki tüm taahhütleri seçmek için kullanın newFeature42:

git cherry -v master yeniÖzellik42


-5

Çekme İsteği Oluşturmaya BaşlayınKullandığınız git barındırma hizmeti aracılığıyla . Şube temel şubeyle tamamen birleştirildiyse, yeni Halkla İlişkiler oluşturamazsınız.

Çekme talebinde bulunmanıza gerek yoktur, sadece şubeleri seçtiğiniz ilk adımı kullanın.

Örneğin, GitHub'da:

Karşılaştırılacak bir şey yok

Birleştirilen şubeler için PR oluşturulamaz.

Bu komut komut satırında git kullanmaz, ancak başka bir arcane git komutunu hatırlamaya çalışmak yerine genellikle diğer araçları açık bir zihinsel modelle kullanmanın yararlı olduğunu düşünüyorum.

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.