web-dev-qa-db-ja.com

git rebase merge conflict

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

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

61
pahnin

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

git mergetool

次に、変更を追加してコミットし、続行します

git rebase --continue

幸運を

90
iltempo

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

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

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

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

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

27
Uga Buga

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

commit 5fdacc1 (2017年7月16日)by William Duclot(williamdclt を参照してください。
浜野邦夫-gitster- in commit 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ユーザーに役立つように対処します。
この目的のために、これらのメッセージで使用されている用語がこのユーザーセグメントによって理解され、問題を解決するための指針となることを確認すると役立ちます。

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

7
VonC

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

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

git checkout -b temp
git merge Origin/master

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

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

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

git checkout alpha
git rebase Origin/master -X theirs

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

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

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

git branch -D temp

それで全部です。非表示のマージによってリベースを行いました。

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

3
baur