web-dev-qa-db-ja.com

リベースの競合を解決できません

foo:/opt/bar$ git status
# On branch develop
nothing to commit (working directory clean)

foo:/opt/bar$ git pull --rebase Origin develop
From ssh://xxx/yyy
* branch develop -> FETCH_HEAD
First, rewinding head to replay your work on top of it...
Applying: Subscription logging added.
Using index info to reconstruct a base tree...
<stdin>:120: trailing whitespace.
* @return integer
<stdin>:143: trailing whitespace.
* @return integer
<stdin>:166: trailing whitespace.
* @return integer
<stdin>:189: trailing whitespace.
* @return integer
<stdin>:212: trailing whitespace.
* @return integer
warning: squelched 3 whitespace errors
warning: 8 lines add whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/config/config.yml
CONFLICT (content): Merge conflict in app/config/config.yml
Failed to merge in the changes.
Patch failed at 0001 Subscription logging added.

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

foo:/opt/bar$ git status
# Not currently on any branch.
# Unmerged paths:
# (use "git reset HEAD <file>..." to unstage)
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: app/config/config.yml
#
no changes added to commit (use "git add" and/or "git commit -a")

foo:/opt/bar$ git add -A

foo:/opt/bar$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

foo:/opt/bar$ git rebase --continue
Applying: Subscription logging added.
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 check out the original branch and stop rebasing run "git rebase --abort".

foo:/opt/bar$ git add -A

foo:/opt/bar$ git status
# Not currently on any branch.
nothing to commit (working directory clean)

foo:/opt/bar$ git rebase --continue
Applying: Subscription logging added.
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 check out the original branch and stop rebasing run "git rebase --abort".

foo:/opt/bar$
16
Roman Newaza

あなたは正しい道を進んでいます。問題があるコミットをスキップする必要があります。

git rebase --skip

競合を修正しましたが、これにより、前のコミットと比較して変更はありません。この場合、許可されていない空のコミットを作成するようにGitに指示しているため、git rebase --continueだけを使用することはできません。

他のコミットと競合する場合でも、git rebase --continueを使用する必要があります。

--skipオプションは、新しく作成された履歴に特定のコミットをまったく含めたくない場合にも役立ちます。

43
Haralan Dobrev

git rebase --skipは確かに正しい解決策ですが、スタックして現在のリベースを続行できない場合があります。

Git 2.0.2(2014年7月)はそのバグを修正しました: commit 95104c7 by brianm。carlson(bk2204 を参照してください:

rebase--merge:2つの競合が連続する--skipを修正

git rebase --mergeで競合が発生した場合、次のコミットも競合すると--skipは機能しません
msgnumファイルが新しいパッチ番号で更新されることはないため、パッチが実際にスキップされることはなく、回避できないループが発生します。

Call_mergeの最初のものとして、msgnumファイルの値を更新します。
これにより、コミットをスキップするときの「Already applied」メッセージも回避されます。
call_mergeが呼び出される他のコンテキストでは、msgnumファイルの値は変更されないため、目に見える変化はありません。

7
VonC