web-dev-qa-db-ja.com

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

昨日masterから作成された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".
115
Max Williams

リベースで同様の問題が発生しました。私の問題は、コミットの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

version.txtmasterコンテンツを選択することにより、競合を解決します。ファイルを追加し、リベースを続行しようとします。

$ 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を使用してリベースの前にリポジトリのコミットIDを取得し、git reset --hardを使用してデポをその状態に戻すことができます(これは別の破壊的な操作です)。

101

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

え?いいえ、git addを使用することを忘れませんでした。

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

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

$ git rebase --skip
21

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

v1.4-alpha-01

リベースのこの時点で、マージ競合を解決してnon-masterブランチの進行を表示していることを忘れないでください。

だから、からリベースで

      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
6
unutbu

このエラーメッセージは、git commit -a -m "merged"の結果です。ファイルを修正したら、git add <file>、およびgit rebase --continueを実行すると、正常に機能するはずです。 git rebase --continueはコミットを試みていますが、コミットする保留中の変更がないことを検出しています(すでにコミットしているため)。

6
twalberg

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

4
Adam Monsen

あなたが見ている振る舞いは、私がこの競合だけで典型的なリベースから期待するものではありません。このリベースを行うために別のブランチを使用することを検討してください(特に、早送りしているコミットをリモートで既にプッシュしている場合)。また、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
Ben Taitelbaum