昨日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".
リベースで同様の問題が発生しました。私の問題は、コミットの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.txt
のmaster
コンテンツを選択することにより、競合を解決します。ファイルを追加し、リベースを続行しようとします。
$ 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
を使用してデポをその状態に戻すことができます(これは別の破壊的な操作です)。
ここから引用: http://wholemeal.co.nz/node/9
え?いいえ、git addを使用することを忘れませんでした。
パッチgitから変更がないため、何かが間違っていると思われます。 Gitはパッチが適用されていることを期待していますが、ファイルは変更されていません。
エラーメッセージはあまり直感的ではありませんが、答えが含まれています。このパッチをスキップするようにrebaseに指示する必要があります。ファイル内の競合マーカーを修正する必要もありません。最終的には、リベースするブランチのファイルバージョンになります。
$ git rebase --skip
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
このエラーメッセージは、git commit -a -m "merged"
の結果です。ファイルを修正したら、git add <file>
、およびgit rebase --continue
を実行すると、正常に機能するはずです。 git rebase --continue
はコミットを試みていますが、コミットする保留中の変更がないことを検出しています(すでにコミットしているため)。
ここにいくつかのアイデアがあります:
rm -rf .git/rebase-apply
あなたが見ている振る舞いは、私がこの競合だけで典型的なリベースから期待するものではありません。このリベースを行うために別のブランチを使用することを検討してください(特に、早送りしているコミットをリモートで既にプッシュしている場合)。また、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