Gitおよび「ブランチ 'x'は完全にマージされていません」エラー


294

ここに私がマスターブランチから使用したコマンドがあります

git branch experiment
git checkout experiment

次に、ファイルにいくつかの変更を加え、変更をコミットし、新しいブランチをGitHubにプッシュしました。

git commit . -m 'changed files'
git push -u origin experiment

後で、実験ブランチをマスターブランチにマージすることにしました。

git checkout master
git merge experiment

最後に、変更をGitHubにプッシュしました。

git push -u origin master

を使用して実験ブランチを削除しようとするまで、すべてうまくいきました

git branch -d experiment

私はerror: The branch 'experiment' is not fully merged.gitに少し慣れていないというエラーメッセージを受け取りましたが、2つのブランチをマージできる可能性がどれだけあるかわかりません。ここで何が欠けていますか?


2
この投稿は役に立ちますか?stackoverflow.com/questions/1710894/...
Chrisdigital

2
これは、私が行ったときに時々現れますgit commit --amend
Arcolye 2014

12
また、このメッセージはaの後に表示されることに注意してくださいsquashstackoverflow.com/q/41946475/109941
Jim G.

最も一般的なシナリオは、ブランチをローカルで削除する前に、新しくマージした変更をプルする必要があるだけだと思います。
RaisinBranCrunch

回答:


313

言葉遣いはコメントに応じて変更されました。ありがとう@slekse
これはエラーではなく、警告です。これは、削除しようとしているブランチに、その上流のブランチまたはHEAD(現在チェックアウトされているリビジョン)のいずれからも到達できないコミットが含まれていることを意味します。つまり、コミットを失う可能性がある場合です¹。

実際には、おそらく修正、リベース、またはフィルタリングされたコミットであり、それらは同一ではないように見えます。

したがって、他のブランチを削除することで、参照解除しようとしているコミットが含まれているブランチをチェックアウトすることで、警告を回避できます。²

実際に重要なコミットが欠落していないことを確認する必要があります。

git log --graph --left-right --cherry-pick --oneline master...experiment

これにより、ブランチ間で共有されていないリストが表示されます。興味がある場合は、違いがない可能性があり--cherry-pick、この違いが警告の原因である可能性があります。

--cherry-pick

コミットのセットが対称的な違いで制限されている場合は、「反対側」で別のコミットと同じ変更を導入するコミットを省略します。たとえば、AとBの2つのブランチがある場合、それらの片側だけですべてのコミットをリストする通常の方法は、そのオプションの説明の上記の例のように--left-rightを使用することです。ただし、他のブランチからチェリーピックされたコミットを示しています(たとえば、「3rd on b」はブランチAからチェリーピックされている可能性があります)。このオプションを使用すると、そのようなコミットのペアは出力から除外されます。


¹デフォルトでは、実際にはしばらくしてからガベージコレクションされます。また、このgit-branchコマンドはすべてのブランチのリビジョンツリーをチェックしません。警告は明らかな間違いを避けるためにあります。

²(ここでの私の好みは、代わりに削除を強制することですが、追加の安心が必要になる場合があります)。


24
ありがとう。キーフレーズは「他の参照ヘッドから到達できないコミットが含まれている」でした。もはや実験ブランチは必要なく、すでにそれをマスターにマージしていて、それをoriginから削除する予定でしたが、gitは実験への変更をoriginにプッシュするまで満足できませんでした。この警告は一種の健全性チェックだったと思います。
mellowsoon 2011

35
-1「削除しようとしているブランチに、他の参照ヘッドから到達できないコミットが含まれていることを意味します。」これは正しくありません。警告は、その上流(存在する場合)または現在のHEADからブランチに到達できないことを意味します。git-branchのマンページを参照してください。
sleske 2012

3
@TachyonVortex素敵なリンク。コマンドgit branch -vvは、私に何が起こっているのかを本当に明確にしました。
Jason Massey

11
@sleskeコメントをありがとう-この回答は本当に編集する必要があります。主な説明文が間違っているため、非常に賛成されているのは残念です。私はこの問題を抱えていて、問題が何であるかを理解しようとするのに迷惑なほど長い時間を費やしており、リモートトラッキングブランチがプルリクエストの一部として削除されただけで、マスターから変更をプルしてからの時間でしたローカルブランチ。唯一の「問題」は、削除されたリモートトラッキングブランチが見つからないことでした(そして、同じ理由でローカルブランチを削除しようとしました)。
2014

3
ええ、これは、ローカルブランチを作成しようとしたときとは別のブランチにいる場合に、ローカルブランチを削除しようとしたときにのみ発生します。「他の参照から到達できないコミット」は正しくなく、不必要に怖いです!
アマルゴビナス2015

80

Drew Taylorが指摘したように、-dを使用したブランチの削除では、現在の HEAD のみが考慮され、ブランチが「完全にマージ」されているかどうかが判断されます。ブランチ他のブランチマージされていても文句を言うでしょう。エラーメッセージは、この点で間違いなく明確になる可能性があります...削除する前に、マージされたブランチをチェックアウトするか、単にgit branch -Dを使用できます。大文字の-Dは、チェックを完全にオーバーライドします。


2
現在のHEADの部分で修正しました。私のマスターは、競合するブランチを作成した機能ブランチとは異なりました:D
viki.omega9

1
gitを学ぶ人にとって、「current」という言葉は「HEAD」と重複しているように見えますか?uncurrent HEADのようなものはありません-定義によってHEADがある現在のブランチ。何か不足していますか?「current branch」または「HEAD」と言っても「current HEAD」とは言えないでしょう。
マークラカタ2017年

これを変更/構成する方法はありますか(たとえば、常にチェックするようにしorigin/masterますか?)origin/master最初にチェックアウトするのはそれほど面倒ではないと思いますが、それは一種の奇妙な流れのように感じられます-なぜorigin/masterローカルでチェックアウトする必要があるのですか?私の変更がそこでマージされていることを確認するためだけですか?
アレック

15

私はシーエの答えを試しましたが、うまくいきませんでした。

マージされていないコミットを見つけるには、以下を使用します。

git log feature-branch ^master --no-merges

14

最初の機能ブランチをマスターにマージしていたので、今日これが起こりました。SOの他のスレッドで述べたように、トリックはブランチを削除する前にマスターに切り替えることでした。マスターに戻ると、gitは警告なしでブランチを削除しました。


7
ここでは特定の問題ではないようですが、今説明した問題に遭遇しました。ありがとうございます。
Daniel Buckmaster

4

Gitは、このブランチを削除すると履歴が失われる可能性があることを警告しています。実際にコミットをすぐに削除するわけではありませんが、ブランチ上のコミットの一部またはすべてが他のブランチの一部でない場合は、到達できなくなります。

ブランチexperimentを別のブランチに「完全にマージ」するには、そのチップコミットが他のブランチのチップの祖先である必要があり、他のブランチのexperimentサブセットでコミットします。これによりexperiment、すべてのコミットが他のブランチを介してリポジトリ履歴の一部として残るため、安全に削除できます。すでに数回マージされている可能性がありますが、最後のマージ以降に他のブランチに含まれていないコミットが追加されているため、「完全に」マージする必要があります。

ただし、Gitはリポジトリ内の他のすべてのブランチをチェックしません。2つだけ:

  1. 現在のブランチ(HEAD)
  2. 上流ブランチ(存在する場合)

experimentあなたの場合と同様に、の「上流ブランチ」はおそらくorigin/experimentです。experimentが現在のブランチに完全にマージされている場合、Gitは問題なくそれを削除します。そうでない場合でも、上流のブランチに完全にマージされていると、Gitは次のような警告を表示します。

warning: deleting branch 'experiment' that has been merged
to 'refs/remotes/origin/experiment', but not yet merged to
HEAD.
Deleted branch experiment (was xxxxxxxx).

Where xxxxxxxxはコミットIDを示します。上流で完全にマージされexperimentているということは、コミットが元のリポジトリにプッシュされていることを示しています。そのため、ここでそれらを失っても、少なくとも他の場所に保存される可能性があります。

Gitは他のブランチをチェックしないため、別のブランチに完全にマージされていることがわかっているため、ブランチを削除しても安全です。-D示されているオプションを使用してこれを行うか、最初にそのブランチに切り替えて、Gitに完全にマージされたステータスを確認させます。


1
キーは「現在のブランチに完全にマージ」されています。XからブランチX 'が完全にXにマージされ、origin / X'がすでに削除されていました。しかし、Yをチェックアウトすると、この警告が表示されました。チェックアウトすると、XIはX 'を削除できました。ばかげていると思います。
Lawrence Dol 2016年

2
この回答は、帰属なしにここから盗用されています。chimera.labs.oreilly.com/books/1230000000561/…
Mark

3

マージされていない変更を確認するために、私はこれを行いました:

git checkout experiment
git merge --no-commit master

git diff --cached

注:これは、masterにはない変更を示していますexperiment

次のことを忘れないでください。

git merge --abort

調べ終わったら。


@IgorGanapolsky Dunno正確ですが、通常man git-resetはgit resetコマンドで状態の問題から回復できます。
ThorSummoner 2017

3

説明付きの最も簡単な解決策(再確認された解決策)(以前に問題に直面した)

問題は:

1-ブランチを削除できない

2-端末は、まだ承認されていないコミットがあるという警告メッセージを表示し続けます

3-マスターとブランチをチェックし、それらが同一であることを知っている(最新)

解決:

git checkout master
git merge branch_name
git checkout branch_name
git push
git checkout master
git branch -d branch_name

説明:

ブランチが上流のリモートブランチ(Github、bitbucketなど)に接続されている場合は、ブランチをマスターにマージ(プッシュ)する必要があり、新しい変更(コミット)をリモートリポジトリ(Github、bitbucketまたは何でも)ブランチから、

私のコードで行ったことは、マスターに切り替えてからブランチをマージし(ローカルマシン上でそれらが同じであることを確認するため)、ブランチに再度切り替えて、更新または変更をリモートのオンラインにプッシュしました。 「git push」を使用したリポジトリ。

その後、もう一度マスターに切り替えてブランチを削除しようとすると、問題(警告メッセージ)が消え、ブランチが正常に削除されました


3

あなたは単に理解することができます:

git log-チェリーマスター...実験的

--cherry オプションはの同義語です --right-only --cherry-mark --no-merges

git-logのmanページは言った

出力を私たちのコミットに制限し、フォークされた履歴の反対側に適用されたものにgit log --cherryアップストリーム... mybranchをマークすることは、git cherryアップストリームmybranchと同様に便利です。

ご参考までに。--cherry-pick同等のコミットを省略しますが、省略--cherry-marksしません。リベースを見つけて、アップストリームとコワーキングパブリックブランチの間で更新された変更を強制することは有用です


1

ローカルgitにアップストリームブランチがありませんでした。私はマスター、git checkout -b mybranchからローカルブランチを作成しました。上流のgitでbitbucket GUIを使用してブランチを作成し、ローカルブランチ(mybranch)をその上流のブランチにプッシュしました。ローカルのgitでgit fetchを実行して上流のブランチを取得したら、git branch -d mybranchを実行できます。


0

--forceはあなたが本当に探しているものだと思います。git branch -d --force <branch_name>ブランチを強制的に削除するのに使用するだけです。

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