Git rebase-すべてのマージの競合が解決された場合でも不平を続けます


115

解決方法がわからない問題に直面しています。

私は私のブランチからマスターに対してリベースを行いました:

git rebase master

次のエラーが発生しました

 First, rewinding head to replay your work on top of it...
 Applying: checkstyled.
 Using index info to reconstruct a base tree...
 Falling back to patching base and 3-way merge...
 Auto-merging AssetsLoader.java
 CONFLICT (content): Merge conflict in AssetsLoader.java
 Failed to merge in the changes.
 Patch failed at 0001 checkstyled.

それで、私は私のお気に入りのエディターに行き、1行の競合を修正し、ファイルを保存し、gitステータスを実行して、次の出力を取得しました。

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   PassengerContactHandler.java
 #
 # Unmerged paths:
 #   (use "git reset HEAD <file>..." to unstage)
 #   (use "git add/rm <file>..." as appropriate to mark resolution)
 #
 #  both modified:      AssetsLoader.java
 #

私はgit add AssetsLoader.javaとgitステータスを実行し、以下を得ました:

 # Not currently on any branch.
 # Changes to be committed:
 #   (use "git reset HEAD <file>..." to unstage)
 #
 #  modified:   AssetsLoader.java
 #  modified:   PassengerContactHandler.java
 #

そして、私がgit rebaseを実行したとき-続けて、

git rebase --continue
You must edit all merge conflicts and then
mark them as resolved using git add

パッチをスキップしてリベースを続行できることはわかっていますが、PassengerContactHandler.javaの変更がブランチにリベースされるかどうかはわかりません。

だから私はわかりません、どうすればいいですか?

編集:解決された競合のあるファイルが元のバージョンとまったく同じである可能性がありますか?

どうもありがとう、ルーカス

編集、それはちょうど私に再び起こりました:

それはちょうど私に再び起こりました、

(307ac0d...)|REBASE)$ git status
# Not currently on any branch.
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   modified:   assets/world/level1/Level-1.xml
#   modified:   George.java
#   modified:   DefaultPassenger.java
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#   mb-art/originalAssets/27dec/

((307ac0d ...)| REBASE)$ git rebase-続行

You must edit all merge conflicts and then
mark them as resolved using git add

git --version

git version 1.7.1

これがの完全な出力git statusです。その下に欠けているセクションはありませんか?
Cascabel 2011

git-rebase解決されていない競合がある場合は、決して報告しないでください。より簡単なテストケースで問題を再現できれば、デバッグははるかに簡単になりますが、それでもgit status競合が報告されずgit rebase --continue、Gitのバージョンが最新である場合は、Git開発者にメールを送信してみてください。 git@vger.kernel.orgのメーリングリストには、できるだけ多くの診断情報が含まれています。
Cascabel 2011

1
(307ac0d ...)| REBASE)$ git status#現在、どのブランチにもありません。#コミットする変更:#(ステージングを解除するには "git reset HEAD <file> ..."を使用)##変更:assets / world / level1 / Level-1.xml#変更:George.java#変更:DefaultPassenger.java ##追跡されていないファイル:#(コミットされるものに含めるには "git add <file> ..."を使用)##mb-art / originalAssets / 27dec /
Lucas

GITKRAKENを使用する必要があると思います。これは競合の解決に役立ちます
Nikhil Bhardwaj

回答:


115

これは、競合を修正するときに、リベースしているブランチに適用されているパッチbeeingのすべてのコードを削除したために発生します。git rebase --skip続行して使用します。

もう少し詳細:

通常、リベース中に競合を修正する場合、競合するファイルを編集し、リベースするブランチに現在適用されているパッチのコードの一部またはすべてを保持します。パッチを修正して実行した後

git add your/conflicted/file
git status

変更されたファイルを示す(通常は緑色の)行が表示されます

変更:your / conflicted / file

git rebase --continueはこの状況で正常に動作します。

ただし、競合を解決するときに、新しいパッチのすべてを削除して、リベースしたブランチからのコードのみを保持する場合があります。これで、ファイルを追加すると、リベースしようとしたファイルとまったく同じになります。git statusは、変更されたファイルを示す緑の線を表示しません。今、あなたがするなら

git rebase --continue

gitは文句を言うでしょう

変更なし-「git add」を使用するのを忘れていませんか?

この状況でgitが実際にしてほしいことは、

git rebase --skip

パッチをスキップします。以前は、これを行ったことはありませんでした。スキップした場合、実際に何がスキップされるのかが常にわからなかったため、「このパッチをスキップ」が何を意味するのかがわかりませんでした。しかし、緑の線が出ない場合

変更:your / conflicted / file

競合するファイルを編集して追加し、gitステータスを実行した後、パッチ全体を削除したことを確認できます。代わりに、

git rebase --skip

続ける。

元の投稿はこれが時々うまくいくと言いました:

git add -A
git rebase --continue
# works magically?

...しかし、これに依存しないでください(リポジトリフォルダーに残りのファイルを追加しないようにしてください)


1
私は同じ問題と同じ解決策を持っているようで、魔法のようでもありました!
bspink 2015

私は同じ問題を抱えていました、リベースされたブランチでリファクタリングして新しいファイルを追加し、マージ解決プロセスがそれらの新しいファイルに変更を加えた場合、それらを明示的に再度git addする必要があるようです。
イブラヒム

すべてのジャンクファイルをリポジトリに追跡する場合を除き、これを行わないでください。
ジェドリンチ

git add ...長いパスを持つファイルのヒープを変更した後、入力するのは本当に面倒です。git add --all-the-files-i-changed以前に実行できるA はありgit rebase continueますか?
jozxyqk 2017

3
コマンドgit rebase --skipを使用する場合は注意が必要です。作業(編集済みファイル)が失われる可能性があります
Youness Marhrani


8

ステージングされていないファイルがあるときに、この警告が表示されました。ステージングされていないファイルがないことを確認してください。ステージングされていないファイルの変更を望まない場合は、変更を破棄してください

git rm <filename>  

2
とてもシンプルなので、コメントにすることもできます。とても参考になります。ありがとう!
Lucas Lima

4

コマンドラインでこれを実行してみてください:

$ git mergetool

競合を解決できるインタラクティブエディタが表示されます。手動で行うよりも簡単です。また、gitはいつマージを行うかを認識します。また、手動で実行しようとしたときに起こり得る、偶然に完全にマージしない状況を回避します。


たぶんそれはより簡単かもしれないし、将来このような状況を避けることもできると考えました。
Batkins、2011

1
あなたは私の夜を救った。シンプルなツールですが、このツールなしでは競合を解決する方法を理解することはできません。
eonil 2017年

4

競合を修正した後、変更されたファイルがステージングされたファイルに追加されていることを確認してください。これで問題は解決しました。


これは私にとってはトリックでした。OPで説明されているメッセージを受け取った後、Sourcetreeをチェックしましたが、コマンドウィンドウに記載されている2つのファイルがステージングされていないことがすぐにわかりました。ファイルをステージングし、「git rebase --continue」を実行して、順調に戻りました。
Mass Dot Net、

3

AssetsLoader.javaでマージの競合を見逃しました。それを開き、競合マーカー( ">>>>"、 "===="、 "<<<<<")を探して、もう一度git addを実行します。見つからない場合は、「git diff --staged」を実行してください。


3
追跡されたすべてのファイルに対してgrepを実行しましたが、競合マーカーはありませんでした。
Lucas

DOESはgit diff --staged便利なものを明らかに?これは、リベースのこの時点でマージの競合を解決するためにコミットしようとしている変更を示します。ファイルの1つに「おっと、これは私がこれを解決するためにやろうとしていたことではない」ビットがあるはずです。
Ether

4
Gitは、次に進むときにマージ競合マーカーを探しません。インデックスがクリーンな状態であることを確認するだけです。まだ競合マーカーが含まれているファイルをステージングした場合は、そのファイルと共にコミットすることを示しています。それはおそらく常に間違いですが、それはあなたにそれをさせます。
Cascabel 2011

@これは理由ではありません。git add競合マーカーが含まれているファイルでも可能です。結局、そのようなファイルは完全に合法かもしれません!
2011

@Jefromi:ハ、知っておくと良い!私はいつもマーカーがチェックされていると思いました、そしてそれが意図的だったらそれを過ぎて強制する必要があるでしょう-
Ether

3

私はちょうどこの問題がありました、そして私はいくつかの原因があるかもしれないと思いますが、これは私のものです...

特定の条件下でコミットを拒否するgit pre-commitフックがありました。フックの出力が表示されるため、手動でコミットする場合は問題ありません。修正するか、commit --no-verifyを使用して無視することもできます。

問題は、リベース時にrebase --continueがフックを呼び出すことです(最新の変更をコミットするため)。しかし、リベースはフックの出力を表示せず、失敗したことがわかり、「すべてのマージの競合を編集してから、git addを使用して解決済みとしてマークする必要がある」というより具体的なエラーを出力します

それを修正するには、すべての変更をステージングし、「git rebase --continue」を実行する代わりに、「git commit」を試してください。同じフックの問題に苦しんでいる場合は、失敗の理由を確認する必要があります。

興味深いことに、git rebaseはgitフックからの出力を表示しませんが、フックをバイパスする--no-verifyを受け入れます。


1
同様の問題がありました。ここでは何もうまくいきませんでしたが、「git commit」を実行してから中止するだけで、不一致があったとしても魔法のように解決されたように見え、「git rebase --continue」を正常に実行できました。
patrickvacek 2012

念のため、私が最近同様の問題に取り組んでgit rebaseいるように、--no-verifyオプションを受け入れます。ただし、pre-rebaseフックのみが省略されますが、このオプションはへの後続の呼び出しには適用されませんgit commit
pkrysiak

有効なポイント(変更のコミット)が含まれていますが、適切な回答には冗長すぎます。
ジャックミラー

1

私はこの問題に出くわしただけです。私が保持したかった、タグ付けされた変更を明確に示すgit rebase --skip からではありませんgit status。予想外に来たいくつかの余分なファイルがあったが。私は解決しました

git checkout .

タグの付いていない変更を削除して、git rebase --continue成功しました。


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