116

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

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

4

3 に答える 3

149

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

git mergetool

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

git rebase --continue

幸運を

于 2012-07-29T14:33:22.433 に答える
36

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

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

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

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

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

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

git branch -D temp

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

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

于 2019-02-22T09:59:47.600 に答える
15

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

William Duclot( )によるcommit 5fdacc1(2017年7月16日)を参照してください。( Junio C Hamanoによってマージされました---コミット076eeec、2017年8月11日williamdclt
gitster

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つのポイントに答えます。

于 2017-08-12T09:36:18.097 に答える