Yanıtlar:
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ı.
git branch -a --merged/no-mergedsüreçte yerel bir izleme dalı oluşturmadan da çalışır.
git branch -r --merged/--no-mergeduzak dalları bulmak için.
--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.
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.
git branch -dgeçerli dalda birleştirilmemiş bir dalı silmeyi reddeder. Silme Değil geçerli dalı.
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.
gitistemcinin bir parçası olmayan bir uygulamanın yüklenmesini gerektirir . Ubuntu'da apt-get install gitk,.
brew install git-guialmak için, gitkkomut satırında.
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
}
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
git merge-base <commit-hash-step1> <commit-hash-step2>. Git merge-base hakkında daha fazla bilgi https://git-scm.com/docs/git-merge-base .
masterbirleştirilip birleştirilmediğini göstermez branchve daha sonra 4 işlem daha eklendi branch.
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?
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
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.
İş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.
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.
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
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.
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"
}
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]"
git logekleyebilirsiniz --merges. stackoverflow.com/a/25986615/134761
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.
git branch --mergedve sonra yerel ve uzak şubeleri sildim.