gitrebaseマージの競合


93

私はgithubリポジトリをフォークし、githubリポジトリで作業しました。
プルリクエストをして完了しました。

その後、アップストリームにはさらにいくつかのコミットがあったので、今はリベースしたいと思います。それが私がしなければならないことだと思います。
しかし、これらのマージの競合が発生しています。

First, rewinding head to replay your work on top of it...
Applying: Issue 135 homepage refresh
Using index info to reconstruct a base tree...
<stdin>:17: trailing whitespace.
      %h4 
warning: 1 line adds whitespace errors.
Falling back to patching base and 3-way merge...
Auto-merging app/views/layouts/application.html.haml
CONFLICT (content): Merge conflict in app/views/layouts/application.html.haml
Auto-merging app/views/home/index.html.haml
CONFLICT (content): Merge conflict in app/views/home/index.html.haml
Auto-merging app/views/home/_group_projects.html.haml
CONFLICT (content): Merge conflict in app/views/home/_group_projects.html.haml
Failed to merge in the changes.
Patch failed at 0001 Issue 135 homepage refresh

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".

これらを修正する方法がわかりません。助けてください。


この記事では私の答えを見て:stackoverflow.com/questions/48307297/...
アビシェーク

回答:


125

リベースは本当に頭痛の種になる可能性があります。マージの競合を解決し、リベースを続行する必要があります。たとえば、マージツールを使用できます(設定によって異なります)

git mergetool

次に、変更を追加して続行します

git rebase --continue

幸運を


2
はい、リベースは頭痛の種です。gitpullアップストリームマスターを使用できますか?
pahnin 2012

2
はい、あなたはそれを試すことができます。違いは、コミットがアップストリームからのコミットの上に置かれないことです。マージの競合が少なくなる可能性があります。
iltempo 2012

7
@iitempoコミットする必要はありません。リベースを続行するには、gitaddだけで十分です。
enigmaticPhysicist 2018

47

リベース中に競合が発生した場合、次の3つのオプションがあります。

  • 実行git rebase --abortして、リベースを完全に元に戻すことができます。Gitは、gitrebaseが呼び出される前の状態にブランチの状態に戻ります。

  • 実行git rebase --skipして、コミットを完全にスキップできます。これは、問題のあるコミットによって導入された変更が含まれないことを意味します。このオプションを選択することは非常にまれです。

  • iltempoが言ったように、競合を修正できます。終了したら、を呼び出す必要がありますgit rebase --continue。私のmergetoolはkdiff3ですが、競合を解決するために使用できるものは他にもたくさんあります。マージツールをgitの設定で設定するだけで、https://git-scm.com/docs/git-mergetoolを呼び出したときに呼び出すことができますgit mergetool

上記のいずれもうまくいかない場合は、散歩に出てもう一度やり直してください:)


2
はい、しかしどのように衝突を修正するのですか?question.Whatは「あなたが完了したら、」「競合を解決する」との間であること
KansaiRobot

@KansaiRobot手動修正を実行するための1つのオプション:競合するファイルをテキストエディターで開き、次を探します<<<<<
スピンアップ

18

リベースするコミットがたくさんあり、それらの一部が競合を引き起こしている場合、それは本当に痛いです。しかし、私は「すべての対立を押しつぶす」方法についてあまり知られていないアプローチを提案することができます。

まず、一時ブランチをチェックアウトし、標準マージを開始します

git checkout -b temp
git merge origin/master

競合を解決する必要がありますが、実際の競合は1回だけです。次に、すべてのファイルをステージングし、マージを終了します。

git commit -m "Merge branch 'origin/master' into 'temp'"

次に、ブランチに戻って(アルファにします)、リベースを開始しますが、競合は自動的に解決されます。

git checkout alpha
git rebase origin/master -X theirs

ブランチはリベースされましたが、プロジェクトはおそらく無効な状態です。それで問題ありません。最後のステップが1つあります。プロジェクトの状態を復元する必要があるだけなので、ブランチ 'temp'とまったく同じになります。技術的には、低レベルのコマンドgit commit-treeを介してツリー(フォルダーの状態)をコピーする必要があります。さらに、作成されたばかりのコミットを現在のブランチにマージします。

git merge --ff $(git commit-tree temp^{tree} -m "Fix after rebase" -p HEAD)

そして一時的なブランチを削除します

git branch -D temp

それで全部です。非表示のマージを介してリベースを実行しました。

また、スクリプトを作成したので、ダイアログで実行できます。ここで見つけることができます。


13

注:Git 2.14.x / 2.15(2017年第3四半期)では、git rebase競合が発生した場合のメッセージがより明確になります。

参照してください5fdacc1コミットすることにより(2017年7月16日)ウィリアムDuclotを(williamdclt
(合併によりJunio C浜野- gitster-076eeecコミット2017年8月11日)

rebase:経験の浅いユーザー向けに解決メッセージを明確にする

前:

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

後:

Resolve all conflicts manually, 
mark them as resolved with git add/rm <conflicted_files>
then run "git rebase --continue".

You can instead skip this commit: run "git rebase --skip".
To abort and get back to the state before "git rebase", run "git rebase --abort".')

git UIは、エラーメッセージを、経験の浅いカジュアルなgitユーザーなどの役立つメッセージに対処することで改善できます。
この目的のために、これらのメッセージで使用されている用語がこのユーザーセグメントによって理解され、問題を解決するためのガイドとなるようにすることが役立ちます。

特に、gitリベース中にパッチを適用できないことは一般的な問題であり、経験の浅いユーザーにとっては非常に不安定になる可能性があります。
対立の解決(3段階のプロセスであるため複雑)に向けて彼らを導き、「--abort」では対処できない状況から逃れることができることを彼らに安心させることが重要です。
このコミットは、解決プロセスを詳しく説明し、不可解なgit linguoを回避することで、これら2つのポイントに答えます。


1
いいね!ヘルプページには、変更をコミットすることで競合を解決するように書かれていますが、違います。ここでは、コミットをスキップして、代わりにマージを続行する必要があります。(ヘルプページ:help.github.com/articles/…
Jerther 2017年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.