web-dev-qa-db-ja.com

git:分岐した分岐。どうやって進める?

私のローカルツリーはマスターから分岐しました。

$ git status
# On branch master
# Your branch and 'Origin/master' have diverged,
# and have 7 and 3 different commit(s) each, respectively.
#
nothing to commit (working directory clean)

git pull --rebaseを試しましたが失敗しました:

$ git pull --rebase
First, rewinding head to replay your work on top of it...
Applying: * ...
Using index info to reconstruct a base tree...
Falling back to patching base and 3-way merge...
Auto-merging ChangeLog
CONFLICT (content): Merge conflict in ChangeLog
Failed to merge in the changes.
Patch failed at 0001 * ...

git rebase --abortで元に戻し、現在は1番です。

私が欲しいのは:

  1. 7つのパッチを人間が読めるdiffファイルにエクスポートします(a hg export)。
  2. 私のツリーをOrigin/master(a la hg strip)のカーボンコピーにします。
  3. 7つのパッチを1つずつ手動で再適用します(a hg import)。

git rebase --continueがこれを行うことを理解しています。私はそれをして、それはうまくいきました(いくつかの手動マージとgit addの後)。しかし、私はそれを手動で実行できるようにしたいので、上記のhgコマンドに対応するgitコマンドは何だろうと思っています。

ありがとう。

PS。 ChangeLogファイルをgitとともに使用するのは愚かだと言わないでください。たとえそうであっても、それは私次第ではありません。

31
sds

もちろん、これを手動で行う方法はいくつかあります。 gitは基本的にこれを内部で実行しているため、同じ競合が発生します。ただし、これを手動で行いたい場合は、いくつかの方法があります。

最初に、コミットを一連のパッチとしてエクスポートします。これを行う最も簡単な方法は、git format-patchを使用することです。

git format-patch -M @{upstream}

コミットごとに1つ、計7つのパッチファイルが作成されます。 (「@ {upstream}」はリテラルであることに注意してください。これはgitのあまりよく知られていない機能です。)これは、git diffの出力をキャプチャするよりも優れています。など)が保持されます。

次に、アップストリームに一致するようにリポジトリをリセットできます。

git reset --hard @{upstream}

その後、git amを使用してパッチを再適用できます。一度に1つずつ、またはすべてを一度に適用できます。

git am 0001-blah-blah.patch
git am 0002-blah-blah.patch
...

2番目のオプションは、作業中の予備ブランチを作成することです。

git branch scrap

次に、ブランチをアップストリームにリセットします。

git reset --hard @{upstream}

次に、コミットをチェリーピックします。

git cherry-pick scrap~6
git cherry-pick scrap~5
git cherry-pick scrap~4
...

次に、スクラップブランチをゴミ箱に移動します。

git branch -D scrap
45
Pat Notz

やってみました git merge Origin/master

リモートの変更はブランチに保存されますOrigin/master。 (または、git fetch。)2つのブランチ(masterOrigin/master-2つのブランチと同様に、競合を解決します(存在する場合)。

これは、gitの競合を解決する方法を知る必要がある場合に役立ちます。

Gitでマージの競合を解決する方法?

17
Sailesh

Gitは、希望どおりに(Origin/masterからの最新の変更の上にパッチを再適用)しようとしたが、競合して失敗したと言います。直後の git pull --rebase競合が競合ファイルでエディターを開きます(git statusは、これらを「変更済み」の下にリストし、標準のdiff linguaでマークされた競合を解決します。競合の解決が完了したら、git rebase --continue(またはgit rebase --skip解像度に変更がない場合)。

Gitのリベース後のマージ競合の解決に関するStackexchangeのドキュメント で彼について読んでください。

7
wilhelmtell

同じ問題に対するいくつかの適切な回答を次に示します(競合を解決しない場合のみ)。

マスターブランチと「オリジン/マスター」が分岐しました、「ブランチを「分岐解除」する方法」

最初に、ローカルバージョンと比較して、リモートマスターで何が変更されたかを確認できます。

git log HEAD..Origin/master

実際の問題を修正するために、ウィルヘルムテルが提案したのと同じ行に要約します。

git pull --rebase

あなたが言ったように、あなたは対立を得るでしょう。

競合の解決は繰り返し発生する問題です。まだ行っていない場合は、git mergetoolをご覧ください(詳細はgit help mergetoolをご覧ください)。グラフィカルサポートを取得するには、merge.tool構成を上書きすることをお勧めします。たとえば、3者間マージに meld を使用する場合、次を使用できます。

git config --global merge.tool meld

競合を解決した後、git pull --rebaseは何をしましたか? Origin/masterからのすべての変更をローカルマスターにマージし、その上で変更をリプレイしました。おめでとうございます、正常に戻りました。

0
Philipp Claßen