回答:
git branch --merged master
マスターにマージされたブランチをリストします
git branch --merged
HEADにマージされたブランチをリストします(つまり、現在のブランチの先端)
git branch --no-merged
マージされていないブランチをリストします
デフォルトでは、これはローカルブランチのみに適用されます。-a
フラグは、ローカルとリモートの両方の分岐を示し、そしてう-r
フラグのみを示しているリモートブランチ。
git branch -a --merged/no-merged
プロセスでローカルトラッキングブランチを作成しなくても機能します。
git branch -r --merged/--no-merged
リモートブランチを見つけるだけです。
--merged/--no-merged
その後にオプションのコミット引数を取ります。少なくとも私のバージョンのgit(1.9.1)では、後に-a
or -r
フラグを追加すると、致命的なエラーが発生します。-a
または-r
以前 を追加し--(no-)merged
ます。
git merge-base
コマンドを使用して、2つのブランチ間の最新の共通コミットを見つけることができます。そのコミットがブランチヘッドと同じである場合、ブランチは完全にマージされています。
まだ完全にマージされていない
git branch -d
ブランチの削除を拒否するため、この種の処理はすでに行われていることに注意してください。
git branch -d
現在のブランチにマージされていないブランチの削除を拒否します。現在のブランチを削除しません。
グラフィカルインターフェイスソリューションもあります。入力するだけ
gitk --all
新しいアプリケーションウィンドウには、リポジトリ全体のグラフィック表示が表示され、ブランチがすでにマージされているかどうかを簡単に認識できます。
git
クライアントの一部ではないアプリケーションのインストールが必要です。Ubuntuの上で、apt-get install gitk
。
brew install git-gui
するにgitk
は、
私は次のようなbash関数を使用しています: 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
}
を使用しgit merge-base <commit> <commit>
ます。
このコマンドは、2つのコミット間の共通の祖先を検索します。そして、共通の祖先が「ブランチ」の最後のコミットと同一である場合、「ブランチ」はすでにマスターにマージされていると安全に想定できます。
手順は次のとおりです
git merge-base <commit-hash-step1> <commit-hash-step2>
。 git merge-base https://git-scm.com/docs/git-merge-baseに関する詳細情報。
master
がにマージされたかどうかはわかりませんがbranch
、さらに4つのコミットがに追加されましたbranch
。
git log -1 $(git merge-base base-branch feature-branch)
表示feature-branch
されれば、それらがマージされていることがわかりますか?
リモートブランチのクリーンアップについて
git branch -r | xargs -t -n 1 git branch -r --contains
これは、各リモートブランチに続いて、最新のSHAがどのリモートブランチ内にあるかをリストします。
これは、マージされたが削除されていないリモートブランチ、マージされていない、したがって減衰しているリモートブランチを識別するのに役立ちます。
'tig'(gitkのようなターミナルベース)を使用している場合は、
tig origin/feature/someones-decaying-feature
gitチェックアウトせずにブランチのコミット履歴を確認する
どのブランチがマスターにマージされているかを確認するには、次のコマンドを使用する必要があります。
git branch <flag[-r/-a/none]> --merged master
マスターにマージされたすべてのブランチのリスト。git branch <flag[-r/-a/none]> --merged master | wc -l
マスターにマージされたすべてのブランチの数をカウントします。フラグは:
-a
フラグ- (すべて)リモートブランチとローカルブランチを表示-r
フラグ- (リモート)リモートブランチのみを表示<emptyFlag>
- 地元の支店のみを表示たとえば git branch -r --merged master
、マスターにマージされたすべてのリモートリポジトリが表示されます。
これは、ブランチがマージされているかどうかを確認する必要がある場合のテクニックです。機能ブランチの一般的なシナリオであるメインブランチで最新の状態にリベースされている場合でも同様です。
これらのアプローチはどちらも完全な証拠ではありませんが、何度も役立つことがわかりました。
gitkやTortoiseGitなどのビジュアルツールを使用するか、単に--allを使用してgit logを実行し、履歴を調べてメインブランチへのすべてのマージを確認します。この特定の機能ブランチがマージされているかどうかを確認できるはずです。
機能ブランチにマージするときに常にローカルブランチとリモートブランチの両方を削除するという良い習慣がある場合は、他のコンピューターのリモートを更新およびプルーニングするだけで、機能ブランチが消えます。
これを覚えておくために、私はすでにgitフロー拡張(AVHエディション)を使用して機能ブランチをローカルで作成およびマージしているため、次のgitフローフックを追加して、リモートブランチも自動削除するかどうかを確認します。
機能ブランチの作成/終了の例
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 / hooks / post-flow-feature-finish
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
常にリモートブランチを削除するとは限らない場合でも、同様のコミットを検索して、ブランチがマージされているかどうかを確認できます。ここでの落とし穴は、コミットの破棄やコミットメッセージの変更など、リモートブランチが認識できないものにリベースされている場合です。
マスターブランチのコマンド例:
gru
gls origin/feature/foo
glf "my message"
私のbash .profile構成
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 log
する--merges
ように追加できます。stackoverflow.com/a/25986615/134761
以下は、現在のブランチがリモートのorigin / masterブランチからのデータを組み込んでいるか、またはそこにない場合に通知する小さなワンライナーです。
$ git fetch && git branch -r --merged | grep -q origin/master && echo Incorporates origin/master || echo Out of date from origin/master
機能ブランチで作業しているときにこの質問に出くわし、最新の作業を自分の個別の作業ブランチに組み込んだことを確認したいことがよくありました。
このテストを一般化するために、次のエイリアスを〜/ .gitconfigに追加しました:
[alias]
current = !git branch -r --merged | grep -q $1 && echo Incorporates $1 || echo Out of date from $1 && :
それから私は呼び出すことができます:
$ git current origin/master
私が最新かどうかを確認します。
git branch --merged
、ローカルブランチとリモートブランチを削除しました。