ブランチがすでにマスターにマージされているかどうかはどうすればわかりますか?


1140

複数のブランチを持つgitリポジトリがあります。

どのブランチがすでにマスターブランチにマージされているかを知るにはどうすればよいですか?

回答:


1793

git branch --merged masterマスターにマージされたブランチをリストします

git branch --mergedHEADにマージされたブランチをリストします(つまり、現在のブランチの先端)

git branch --no-merged マージされていないブランチをリストします

デフォルトでは、これはローカルブランチのみに適用されます。-aフラグは、ローカルとリモートの両方の分岐を示し、そしてう-rフラグのみを示しているリモートブランチ。


2
余談ですが、リモートブランチがマージされたかどうかを確認しようとすると、まずローカルトラッキングブランチをセットアップし、ステータスを特定してgit branch --merged、ローカルブランチとリモートブランチを削除しました。
Kenneth Kalmer、2011

83
どうやら、git branch -a --merged/no-mergedプロセスでローカルトラッキングブランチを作成しなくても機能します。
フレスコマ

70
または、単にgit branch -r --merged/--no-mergedリモートブランチを見つけるだけです。
Asfand Qazi 2012

5
リベース後に実際にマージされたマージされていないブランチを削除する方法はありますか?
Ashfame 14

9
--merged/--no-mergedその後にオプションのコミット引数を取ります。少なくとも私のバージョンのgit(1.9.1)では、後に-aor -rフラグを追加すると、致命的なエラーが発生します。-aまたは-r 以前 を追加し--(no-)mergedます。
Jonathan Gawrych、2015

113

git merge-baseコマンドを使用して、2つのブランチ間の最新の共通コミットを見つけることができます。そのコミットがブランチヘッドと同じである場合、ブランチは完全にマージされています。

まだ完全にマージされていないgit branch -dブランチの削除を拒否するため、この種の処理はすでに行われていることに注意してください。


3
@hariの答えは、これをどのように使用するかについてさらに詳しく説明しています。
Muhd 2017年

これを自動的に/プログラムでどのように実行できますか?
Alexander Mills

1
「まだ完全にマージされていません」...どのブランチに完全にマージされましたか?
Alexander Mills

@AlexanderMills:現在のブランチに。
グレッグヒューギル2018

2
@AlexanderMills:git branch -d現在のブランチにマージされていないブランチの削除を拒否します。現在のブランチを削除しません。
グレッグヒューギル2018

27

グラフィカルインターフェイスソリューションもあります。入力するだけ

gitk --all

新しいアプリケーションウィンドウには、リポジトリ全体のグラフィック表示が表示され、ブランチがすでにマージされているかどうかを簡単に認識できます。


17
明確にするために、gitクライアントの一部ではないアプリケーションのインストールが必要です。Ubuntuの上で、apt-get install gitk
メターム

macOSで、Homebrewがインストールされている場合、コマンドラインにアクセスbrew install git-guiするにgitkは、
program247365

24

私は次のような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
}

3
これは実際には機能しません。ソースブランチがすでに宛先ブランチにマージされており、宛先ブランチがさらにいくつかのコミットを取得した場合、それは機能しなくなりますが、理由はわかりません
Alexander Mills


18

を使用しgit merge-base <commit> <commit>ます。

このコマンドは、2つのコミット間の共通の祖先を検索します。そして、共通の祖先が「ブランチ」の最後のコミットと同一である場合、「ブランチ」はすでにマスターにマージされていると安全に想定できます。

手順は次のとおりです

  1. マスターブランチで最後のコミットハッシュを見つける
  2. 「ブランチ」の最後のコミットハッシュを見つける
  3. コマンドを実行しますgit merge-base <commit-hash-step1> <commit-hash-step2>
  4. ステップ3の出力がステップ2の出力と同じである場合、「ブランチ」はすでにマスターにマージされています。

git merge-base https://git-scm.com/docs/git-merge-baseに関する詳細情報。


2
これは、ヒントがマージされた場合にのみわかると思います。たとえば、masterがにマージされたかどうかはわかりませんがbranch、さらに4つのコミットがに追加されましたbranch
mkobit 2018

なぜそうではなく、出力にgit log -1 $(git merge-base base-branch feature-branch)表示feature-branchされれば、それらがマージされていることがわかりますか?
カールG

12

リモートブランチのクリーンアップについて

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

これは、各リモートブランチに続いて、最新のSHAがどのリモートブランチ内にあるかをリストします。

これは、マージされたが削除されていないリモートブランチ、マージされていない、したがって減衰しているリモートブランチを識別するのに役立ちます。

'tig'(gitkのようなターミナルベース)を使用している場合は、

tig origin/feature/someones-decaying-feature

gitチェックアウトせずにブランチのコミット履歴を確認する


3
よくやった!実際に何が表示されているかを理解したら、非常に役立ちます。GitHubアプリは、これを階層のないアルファベット順のリストではなく、ブランチの視覚表示に組み込む必要があります。
CMash

12

どのブランチがマスターにマージされているかを確認するには、次のコマンドを使用する必要があります。

  • 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、マスターにマージされたすべてのリモートリポジトリが表示されます。


5

これは、ブランチがマージされているかどうかを確認する必要がある場合のテクニックです。機能ブランチの一般的なシナリオであるメインブランチで最新の状態にリベースされている場合でも同様です。

これらのアプローチはどちらも完全な証拠ではありませんが、何度も役立つことがわかりました。

1すべてのブランチのログを表示

gitkやTortoiseGitなどのビジュアルツールを使用するか、単に--allを使用してgit logを実行し、履歴を調べてメインブランチへのすべてのマージを確認します。この特定の機能ブランチがマージされているかどうかを確認できるはずです。

2機能ブランチにマージするときは常にリモートブランチを削除します

機能ブランチにマージするときに常にローカルブランチとリモートブランチの両方を削除するという良い習慣がある場合は、他のコンピューターのリモートを更新およびプルーニングするだけで、機能ブランチが消えます。

これを覚えておくために、私はすでに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

3コミットメッセージで検索

常にリモートブランチを削除するとは限らない場合でも、同様のコミットを検索して、ブランチがマージされているかどうかを確認できます。ここでの落とし穴は、コミットの破棄やコミットメッセージの変更など、リモートブランチが認識できないものにリベースされている場合です。

  • すべてのリモートをフェッチしてプルーニングします
  • 機能ブランチの最後のコミットのメッセージを見つける
  • 同じメッセージのコミットがマスターブランチで見つかるかどうかを確認する

マスターブランチのコマンド例:

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"
}

@anjdeas-ステップ1-どのブランチがmainにマージされたかをどのようにして知ることができますか。私はログとGUIツールを見てきました-そして、これが明示的に示している場所はどこにもありませんか???
ハフ

@TheHuffこれを試してください: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では、mainブランチにいる場合、すべてのマージがmainに表示されるはずです。
Angularsen

ありがとう-しかし、マージとは何ですか?私はそれらがすべてコミットであると想定しています-これは正しいですか?
ハフ

@TheHuff:コミットの2つのストリーム/パスが1つのコミット「ダウンストリーム」(ログビューで上に)にマージされることを視覚的に確認する必要があります。そのコミットはマージコミットです。また、マージコミットのみを表示git logする--mergesように追加できます。stackoverflow.com/a/25986615/134761
angularsen

4

以下は、現在のブランチがリモートの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

私が最新かどうかを確認します。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.