Gitリベース:競合が進行をブロックし続ける


120

私は昨日マスターから作られたgitブランチ(v4と呼ばれます)を持っています。マスターにいくつかの変更がありました。v4に移行したいと考えています。そのため、v4では、マスターからリベースを実行しようとしましたが、1つのファイル(バージョン番号を含む1行のテキストファイル)が混乱を続けています。このファイルはapp/views/common/version.txtであり、リベースする前に次のテキストが含まれています。

v1.4-alpha-02

これが私がやっていることです:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

これversion.txtは次のようになります。

<<<<<<< HEAD:app/views/common/version.txt
v1.4-alpha-02
=======
v1.4-alpha-01
>>>>>>> new version, new branch:app/views/common/version.txt

だから、私はそれを片付け、それは今このように見えます:

v1.4-alpha-02

そして私は続けようとしました:最初に私はコミットを試みました:

> git commit -a -m "merged"
# Not currently on any branch.
nothing to commit (working directory clean)

運がありません。だから、私はファイルを追加しようとしました:

git add app/views/common/version.txt

応答なし。良いニュースはないと思います。だから、私は続けようとします:

> git rebase --continue
Applying: new version, new branch
No changes - did you forget to use 'git add'?

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

これでぐるぐる回った後のこの時点で、私は頭を机からぶつけています。

何が起きてる?何が悪いのですか?誰かが私をまっすぐに設定できますか?

編集-unutbu

私はあなたが提案したようにファイルを変更し、同じエラーが発生しました:

> git rebase master
First, rewinding head to replay your work on top of it...
Applying: new version, new branch
error: patch failed: app/views/common/version.txt:1
error: app/views/common/version.txt: patch does not apply
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging app/views/common/version.txt
CONFLICT (content): Merge conflict in app/views/common/version.txt
Failed to merge in the changes.
Patch failed at 0001 new version, new branch

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

10
この質問をしてくれてありがとう..私はまったく同じ問題に直面していた
Archan Mishra '20 / 01/20

6
あなたがいくつかの答えを確認した場合にいいでしょう
ホルムス

3
@MaxWilliams、あなた(私のような)は@unutbuのアドバイスを誤解していると思います :1)最初に実行git rebase master して失敗させます。2)次に、編集version.txtして、その時点で見られるように作成し、編集内容を保存します。3)それからあなたgit add .../version.txt; 4)次に、git rebase --continue「コミット」ではなく)行います!rebase --continueここで成功した場合、それはすでにコミットされています(ここでは必要ありませんgit commit!)-あとはgit push、リモートリポジトリを使用する場合のみです。これがうまくいけば、これが役に立てば:)幸い-乾杯!
sdaau 2013

@MaxWilliams、これに対する答えを得たことはありますか:ruby-forum.com/topic/187288(他の誰かが最初にそこに到着しなかった場合、返信後にこれをすぐに削除します!!)
atw

回答:


102

リベースで同様の問題が発生しました。私の問題は、私のコミットの1つがファイルのみを変更したために発生しました。解決時に、このコミットで導入された変更を破棄しました。対応するコミット(git rebase --skip)をスキップすることで問題を解決できました。

この問題は、テストリポジトリで再現できます。最初にリポジトリを作成します。

$ mkdir failing-merge
$ cd failing-merge
$ git init
Initialized empty Git repository in $HOME/failing-merge/.git/

次にversion.txt、マスターの元のコンテンツをコミットします。

$ echo v1.4-alpha-02 > version.txt
$ git add version.txt
$ git commit -m initial
[master (root-commit) 2eef0a5] initial
 1 files changed, 1 insertions(+), 0 deletions(-)
 create mode 100644 version.txt

v4ブランチを作成し、のコンテンツを変更しますversion.txt

$ git checkout -b v4
Switched to a new branch 'v4'
$ echo v1.4-alpha-03 > version.txt
$ git add version.txt
$ git commit -m v4
[v4 1ef8c9b] v4
 1 files changed, 1 insertions(+), 1 deletions(-)

に戻りmaster、コンテンツを変更してversion.txt、リベース中に競合が発生するようにします。

$ git checkout master
Switched to branch 'master'
$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git commit -m master
[master 7313eb3] master
 1 files changed, 1 insertions(+), 1 deletions(-)

v4ブランチに戻り、リベースを試みます。version.txt計画どおりに競合して失敗します。

$ git checkout v4
Switched to branch 'v4'
$ git rebase master
First, rewinding head to replay your work on top of it...
Applying: v4
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging version.txt
CONFLICT (content): Merge conflict in version.txt
Recorded preimage for 'version.txt'
Failed to merge in the changes.
Patch failed at 0001 v4

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".
$ cat version.txt
<<<<<<< HEAD
v1.4-alpha-04
=======
v1.4-alpha-03
>>>>>>> v4

masterコンテンツを選択して競合を解決しversion.txtます。ファイルを追加して、リベースの続行を試みます。

$ echo v1.4-alpha-04 > version.txt
$ git add version.txt
$ git rebase --continue 
Applying: v4
No changes - did you forget to use 'git add'?
If there is nothing left to stage, chances are that something else
already introduced the same changes; you might want to skip this patch.

When you have resolved this problem run "git rebase --continue".
If you would prefer to skip this patch, instead run "git rebase --skip".
To restore the original branch and stop rebasing run "git rebase --abort".

失敗!gitリポジトリにどのような変更があると思いますか見てみましょう。

$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

ああ、変化はありません。以前のエラーメッセージを詳細に読んだ場合は、そのことを通知し、gitを使用することを推奨しましたgit rebase --skip。「ステージングするものが何もない場合、他の何かが同じ変更をすでに導入している可能性があります。このパッチをスキップすることをお勧めします。」したがって、コミットをスキップしてリベースが成功します。

$ git rebase --skip
HEAD is now at 7313eb3 master

注意:リベースしようとしgit rebase --skipたコミットは完全に削除されますのでご注意くださいgit。私たちの場合、これはgit空のコミットであると文句を言っているので、これで問題ありません。リベースの完了後に変更が失われたと思われる場合はgit reflog、を使用git reset --hardしてリベースの前にリポジトリのコミットIDを取得し、を使用してデポをその状態に戻すことができます(これは別の破壊的な操作です)。


4
長い説明のシルヴァンを書いてくれてありがとう!それはそれをより明確にします。作業が失われる可能性があると感じたため、パッチをスキップすることに常に神経質になっていたと思います。つまり、パッチには、競合のあるファイルだけでなく、リベースの影響を受けるすべてのファイルが含まれていました。パッチは単一のファイルの単一のマージですか?
マックスウィリアムズ、

3
いいえ、パッチには、1回のコミットで変更されたすべてのファイルの違いがすべて含まれています。ただし、を使用git rebase --skipする場合、1つのコミットのみをスキップします。私は通常git status、コミットをスキップする前にbeforeを発行して、この状況にあるかどうかを確認します。
Sylvain Defresne、2011

1
素晴らしい説明を書いてくれてありがとうとマックスに言いたかっただけです。これがなぜ起こっているのか、ようやくわかりました。私ももう怖くないですrebase --skip:)。
Ben Dolman、2011

1
警告-1つのコミットに複数の変更がある場合、git rebase --skipを実行すると作業が失われる可能性があります。私はちょうどしました
Chrissy H

@ChrissyH git reflog purgeまたはgit reflog deleteを使用しない限り、を使用して変更を取り戻すことができますgit reflog。そこで参照されている別のコミットをチェックアウトしてみてください。そのうちの1つは、全体を開始する前のツリーの状態である必要がありますgit rebase
Sylvain Defresne 2013

23

ここからの引用:http : //wholemeal.co.nz/node/9

えっ?いいえ、git addを使用するのを忘れていませんでした... 2秒前のように...

パッチからの変更がないため、gitは何かがおかしいと疑っています。Gitはパッチが適用されていることを期待していますが、ファイルは変更されていません。

エラーメッセージはあまり直感的ではありませんが、答えは含まれています。このパッチをスキップするようにリベースに指示する必要があるだけです。また、ファイル内の競合マーカーを修正する必要もありません。最終的には、リベースしているブランチのファイルバージョンになります。

$ git rebase --skip

git mergetoolを使用して変更を修正し、それらを追加してコミットした後、「現在どのブランチにもない」間に<code> git rebase --skip </ code>と入力しました。そして、すべてが修正されました。ありがとう!
geerlingguy

実は、git mergetoolを継続的に実行し、次にgit rebase --continue、次にgit mergetoolなどを組み合わせて、最終的に状況を修正したと思います。
geerlingguy 2012年

6

そのエラーメッセージはの結果ですgit commit -a -m "merged"。ファイルを修正した後git add <file>、とを実行するとgit rebase --continue、問題なく動作するはずです。git rebase --continueはコミットを実行しようとしていますが、コミットする保留中の変更がないことがわかりました(すでに変更をコミットしているため)。


1
これは、少なくとも一般的なケースでは、スキップを行うよりもかなり合理的です。ベストアンサーとしてリストされていないことに驚いています。
EmeraldD。

1
@EmeraldD。、機能しません。ファイルを修正して実行してgit add <file>も問題は解決しません。git rebase --continue まだ報告しているNo changes - did you forget to use 'git add'?
Pacerier

6

app / views / common / version.txtを次のように変更します

v1.4-alpha-01

リベースのこの時点で、非マスターブランチの進行を示すためにマージの競合を解決していることに注意してください。

だから、からリベースする

      A---B---C topic
     /
D---E---F---G master

              A*--B*--C* topic
             /
D---E---F---G master

解決している競合は、トピックブランチでA *を作成する方法です。

したがってgit rebase --abort、を実行した後、コマンドは

git checkout topic
git rebase master
< make edits to resolve conflicts >
git add .
git rebase --continue

3
unutbuに感謝します。試してみましたが、うまくいきませんでした。新しい編集についてはOPを参照してください。乾杯
マックスウィリアムズ

4

あなたが見ている振る舞いは、私がこの衝突だけで典型的なリベースから期待するものではありません。別のブランチを使用してこのリベースを行うことを検討してください(特に、コミットをリモートですでにプッシュしていて早送りしている場合)。また、git mergetool競合を解決し、を発行することを忘れないでくださいgit add

この最小限の例では、リベースは期待どおりに機能します。あなたが見ている行動を示す例を提供できますか?

#!/bin/bash

cd /tmp
mkdir rebasetest
cd rebasetest
git init
echo 'v1.0' > version.txt
git add version.txt
git commit -m 'initial commit'
git checkout -b v4
echo 'v1.4-alpha-01' > version.txt
git add version.txt
git commit -m 'created v4'
git checkout master
git merge v4
echo 'v1.4-alpha-01-rc1' > version.txt
git add version.txt
git commit -m 'upped version on master to v1.4-alpha-01-rc1'
git checkout v4
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git commit -m 'starting work on alpha-02'

git rebase master
echo 'v1.4-alpha-02' > version.txt
git add version.txt
git rebase --continue

4

ここにいくつかのアイデアがあります:

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