1. ホーム
  2. git

[解決済み] Git リベース: コンフリクトで進行が妨げられる

2022-08-16 23:28:22

質問

昨日masterから作成したgitブランチ(v4)を持っています。 master にいくつかの変更があり、それを v4 に取り込みたいと思っています。 v4 で、私は master からリベースを実行しようとしましたが、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".

どのように解決するのですか?

私はリベースで同じような問題に遭遇しました。私の問題の原因は、あるコミットがファイルを変更しただけで、解決するときにこのコミットで導入された変更を破棄したことでした。私は、対応するコミットをスキップすることで問題を解決することができました ( git rebase --skip ).

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

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

の元の内容をコミットします。 version.txt をmasterにコミットします。

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