Bir dalın zaten master ile birleştirilip birleştirilmediğini nasıl bilebilirim?


1139

Birden çok şubesi olan bir git depom var.

Hangi dalların ana dalda birleştirildiğini nasıl bilebilirim?

Yanıtlar:


1792

git branch --merged mastermaster ile birleştirilen dalları listeler

git branch --mergedHEAD ile birleştirilen dalları listeler (yani geçerli dalın ucu)

git branch --no-merged birleştirilmemiş şubeleri listeler

Varsayılan olarak bu yalnızca yerel şubeler için geçerlidir. -aBayrak yerel ve uzak dalları ve her iki gösterecektir -rbayrak gösterileri sadece uzaktan dalları.


2
Sadece bir yan not, uzak bir şubenin birleştirilip birleştirilmediğini görmeye çalıştığımda, önce bir yerel izleme şubesi kurdum, durumu belirledim git branch --mergedve sonra yerel ve uzak şubeleri sildim.
Kenneth Kalmer

83
Görünüşe göre, git branch -a --merged/no-mergedsüreçte yerel bir izleme dalı oluşturmadan da çalışır.
fresskoma

70
Veya sadece git branch -r --merged/--no-mergeduzak dalları bulmak için.
Asfand Qazi

5
Yeniden temellendirildikten sonra birleştirilen birleştirilmemiş dalları silmenin herhangi bir yolu var mı?
Ashfame

9
--merged/--no-mergedSonra isteğe bağlı bir tamamlama argümanı alır unutmayın . En azından git (1.9.1) versiyonumda, -aya da -rbayrağını ekledikten sonra ölümcül bir hata veriyor. -aVeya -r öncesini ekleyin --(no-)merged.
Jonathan Gawrych

113

git merge-baseİki dal arasındaki en son ortak taahhüdü bulmak için komutu kullanabilirsiniz . Bu taahhüt şube başkanınızla aynıysa, şube tamamen birleştirilmiştir.

Not git branch -dbu tür şeylerin zaten yapar bir dalı silmek reddeder çünkü henüz zaten tamamen birleştirildi.


3
@ hari'ın cevabı , bunun nasıl kullanılacağı hakkında daha fazla ayrıntıya giriyor.
Muhd

bunu otomatik olarak / programlı olarak nasıl yapabiliriz?
Alexander Mills

1
"daha önce tamamen birleştirilmemiş" ... tamamen hangi dalda birleştirildi?
Alexander Mills

@AlexanderMills: Mevcut şubenize.
Greg Hewgill

2
@AlexanderMills: git branch -dgeçerli dalda birleştirilmemiş bir dalı silmeyi reddeder. Silme Değil geçerli dalı.
Greg Hewgill

27

Grafiksel bir arayüz çözümü de var. Sadece yaz

gitk --all

Yeni bir uygulama penceresi, bir şubenin birleştirilmiş olup olmadığını anlamanın çok kolay olduğu tüm repo'nuzun grafik temsilini isteyecektir.


17
Hangi açık olmak gerekirse, gitistemcinin bir parçası olmayan bir uygulamanın yüklenmesini gerektirir . Ubuntu'da apt-get install gitk,.
metame

Eğer Homebrew yüklü olup olmadığını MacOS üzerinde, şöyle olacaktır brew install git-guialmak için, gitkkomut satırında.
program247365

24

Aşağıdaki gibi bash işlevini kullanıyorum: git-is-merged develop feature/new-feature

git-is-merged () {
  merge_destination_branch=$1
  merge_source_branch=$2

  merge_base=$(git merge-base $merge_destination_branch $merge_source_branch)
  merge_source_current_commit=$(git rev-parse $merge_source_branch)
  if [[ $merge_base = $merge_source_current_commit ]]
  then
    echo $merge_source_branch is merged into $merge_destination_branch
    return 0
  else
    echo $merge_source_branch is not merged into $merge_destination_branch
    return 1
  fi
}

3
bu aslında işe yaramıyor. Kaynak şube zaten hedef şubeye birleştirildiyse ve daha sonra hedef şube birkaç işlem daha alırsa, artık işe yaramıyor, ancak nedenini bilmiyorum
Alexander Mills


18

Kullanın git merge-base <commit> <commit>.

Bu komut iki işlem arasında en iyi ortakları bulur. Ve eğer ortak ata bir "dalın" son taahhüdü ile özdeş ise, o zaman güvenle bir "dalın" ustaya birleştirildiğini varsayabiliriz.

İşte adımlar

  1. Master şubedeki son taahhüt karmasını bulun
  2. Bir "dalda" son işleme karmasını bulun
  3. Komutu çalıştır git merge-base <commit-hash-step1> <commit-hash-step2>.
  4. 3. adımın çıktısı 2. adımın çıktısıyla aynıysa, bir "dal" zaten master ile birleştirilmiştir.

Git merge-base hakkında daha fazla bilgi https://git-scm.com/docs/git-merge-base .


2
Bunun sadece ipuçlarının birleştirilmesi durumunda size söyleyeceğini düşünüyorum. Örneğin, bu size masterbirleştirilip birleştirilmediğini göstermez branchve daha sonra 4 işlem daha eklendi branch.
mkobit

Neden olmasın git log -1 $(git merge-base base-branch feature-branch)ve feature-branchçıktıda görürseniz , o zaman bunların birleştirildiğini biliyor musunuz?
Carl G

12

Uzak dalları temizleme konusunda

git branch -r | xargs -t -n 1 git branch -r --contains

Bu, her uzak dalı ve ardından en son SHA'larının içinde bulunduğu uzak dalları listeler.

Bu, hangi uzak dalların birleştirildiğini ancak silinmediğini ve birleştirilmediğini ve dolayısıyla çürütüldüğünü ayırt etmek için yararlıdır.

'Tig' (gitk ama terminal tabanlı) kullanıyorsanız

tig origin/feature/someones-decaying-feature

çıkış yapmak zorunda kalmadan bir şubenin taahhüt geçmişini görmek


3
Aferin o adam! Gerçekten gösterdiklerini etrafında bir kez olsun çok yararlı! GitHub uygulamasının bunu hiyerarşisi olmayan alfabetik bir liste yerine dallarınızın görsel bir görüntüsüne dahil etmesi gerekir!
CMash

12

Hangi dalların master ile birleştirildiğini doğrulamak için şu komutları kullanmalısınız:

  • git branch <flag[-r/-a/none]> --merged master ana dalda birleştirilen tüm dalların listesi.
  • git branch <flag[-r/-a/none]> --merged master | wc -l master ile birleştirilen tüm dalların sayısını say.

Bayraklar:

  • -abayrak - (tümü) uzak ve yerel şubeleri gösterir
  • -rbayrak - (uzak) yalnızca uzak dalları gösteriyor
  • <emptyFlag>- yalnızca yerel şubeleri gösterme

örneğin: git branch -r --merged master size master ile birleştirilen tüm uzak depoları gösterir.


5

İşte bir branşın birleştirilip birleştirilmediğini anlamaya ihtiyacım olduğunda, özellik branşları için ortak bir senaryo olan ana şubemizle güncelleşmiş olsa bile benim tekniklerim.

Bu yaklaşımların hiçbiri aptalca kanıt değildir, ancak birçok kez yararlı buldum.

1 Tüm şubeler için günlüğü göster

Gitk veya TortoiseGit gibi görsel bir araç kullanarak veya --all ile git logunu kullanarak ana daldaki tüm birleştirmeleri görmek için geçmişe gidin. Bu özellik dalının birleştirilip birleştirilmediğini tespit edebilmelisiniz.

2 Bir özellik dalında birleştirirken her zaman uzak dalı kaldırın

Bir özellik dalında birleştirdiğinizde hem yerel hem de uzak dalı her zaman kaldırma konusunda iyi bir alışkanlığınız varsa, diğer bilgisayarınızdaki uzaktan kumandaları güncelleyebilir ve budayabilirsiniz ve özellik dalları kaybolacaktır.

Bunu hatırlamaya yardımcı olmak için, özellik dallarını yerel olarak oluşturmak ve birleştirmek için git akış uzantılarını (AVH sürümü) zaten kullanıyorum , bu yüzden uzak dalı otomatik olarak kaldırmak isteyip istemediğimi sormak için aşağıdaki git akış kancasını ekledim.

Örnek oluşturma / sonlandırma özelliği dalı

554 Andreas:MyRepo(develop)$ git flow start tmp
Switched to a new branch 'feature/tmp'

Summary of actions:
- A new branch 'feature/tmp' was created, based on 'develop'
- You are now on branch 'feature/tmp'

Now, start committing on your feature. When done, use:

     git flow feature finish tmp

555 Andreas:MyRepo(feature/tmp)$ git flow finish
Switched to branch 'develop'
Your branch is up-to-date with 'if/develop'.
Already up-to-date.

[post-flow-feature-finish] Delete remote branch? (Y/n)
Deleting remote branch: origin/feature/tmp.

Deleted branch feature/tmp (was 02a3356).

Summary of actions:
- The feature branch 'feature/tmp' was merged into 'develop'
- Feature branch 'feature/tmp' has been locally deleted
- You are now on branch 'develop'

556 Andreas:ScDesktop (develop)$

.git / kanca / sonrası akış-özellik-finiş

NAME=$1
ORIGIN=$2
BRANCH=$3

# Delete remote branch
# Allows us to read user input below, assigns stdin to keyboard
exec < /dev/tty

while true; do
  read -p "[post-flow-feature-finish] Delete remote branch? (Y/n) " yn
  if [ "$yn" = "" ]; then
    yn='Y'    
  fi
  case $yn in
      [Yy] ) 
        echo -e "\e[31mDeleting remote branch: $2/$3.\e[0m" || exit "$?"
        git push $2 :$3; 
        break;;
      [Nn] ) 
        echo -e "\e[32mKeeping remote branch.\e[0m" || exit "$?"
        break;;
      * ) echo "Please answer y or n for yes or no.";;
  esac
done

# Stop reading user input (close STDIN)
exec <&-
exit 0

3 Teslim mesajına göre arama

Uzak dalı her zaman kaldırmazsanız, dalın birleştirilip birleştirilmediğini belirlemek için yine de benzer taahhütler arayabilirsiniz. Buradaki tuzak, uzak dalın ezme taahhütleri veya taahhüt mesajlarını değiştirme gibi tanınmayan bir şekilde yeniden temellendirilmesidir.

  • Tüm uzaktan kumandaları getir ve budama
  • Özellik dalında son işlem mesajını bul
  • Ana dalda aynı iletiyle bir taahhüt bulunup bulunmadığına bakın

Ana dalda örnek komutlar:

gru                   
gls origin/feature/foo
glf "my message"

Benim bash .profile config

alias gru='git remote update -p'
alias glf=findCommitByMessage

findCommitByMessage() {
    git log -i --grep="$1"
}

@anjdeas - adım 1 - hangi şubelerin ana bölüme birleştirildiğini nasıl biliyorsunuz? Ben günlükleri ve gui araçlarına bakıyordum - ve açıkça bunu gösterir hiçbir yerde bulamıyorum ???
Huff

@TheHuff Şunu deneyin:git log --all --color --graph --decorate --topo-order --date=relative --abbrev-commit --pretty=format:"%C(green)%h %C(red bold)[%<(14)%ad] %Creset%s%Cred%d%C(blue) [%an]"
angularsen

@TheHuff TortoiseGit'te, ana daldaysanız, tüm birleştirmeleri anaya göstermelidir.
angularsen

Teşekkürler - ama bir birleştirme ne olduğunu nasıl bilebilirim? Hepsinin taahhütte olduğunu varsayıyorum - bu doğru mu?
Huff

@TheHuff: Görsel olarak iki akış / taahhüt yolunun tek bir alt akışa (günlük görünümünde daha yüksek) birleştirildiğini görmelisiniz. Bu taahhüt bir birleşme taahhüdüdür. Ayrıca, yalnızca birleştirme taahhütlerini göstermek için git logekleyebilirsiniz --merges. stackoverflow.com/a/25986615/134761
angularsen

4

Mevcut şubenizin uzaktaki bir kaynaktan / ana daldan veri içerip içermediğini veya veri dışı olup olmadığını size bildirecek küçük bir astar:

$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master

Bir özellik dalı üzerinde çalışırken ve sık sık en son çalışmanın kendi ayrı çalışma dalıma dahil edildiğinden emin olmak isterken bu soruya rastladım.

Bu testi genelleştirmek için ~ / .gitconfig dosyasına aşağıdaki diğer adı ekledim:

[alias]
   current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :

Sonra arayabilirim:

$ git current origin/master

güncel olup olmadığımı kontrol etmek için.

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.