16

状況:私が分岐したマスターから始めて、Aいくつかの変更を加えてからB、その分岐をにマージしました(C)。さらにいくつかの変更を加えた後D、ブランチで発生した変更なしでコードをデプロイする必要があることがわかりました。私がそれを手でマージしなかったら、それは大丈夫だっただろう。

A_______C___D
 \     /
  \_B_/

まず、マージが発生しなかったかのようにコードをデプロイするために、ここから何をすべきかを知りたいと思います。注:ブランチで編集された同じファイルは、マスターで編集されていません。

第二に...

これに対処するための最善の方法を見つける時間がなかったので、ブランチが追加したファイルを削除し、ブランチで行われたいくつかの編集を手動で元に戻し、展開のために結果をコミットしました(F

A_______C___D___F
 \     /
  \_B_/

ブランチの開発を続け、マスターからの変更をマージして最新の状態に保ちたいのですが、そうすると、作成したものFがマージされてファイルが削除され、元に戻す編集。これに対処するための最良の方法は何ですか?

4

2 に答える 2

16

リベースを使用して、1つのステップでそれを行うことができます。

git rebase --onto A C D

私はこれをテストしたところ、適切な結果が得られました。

$ edit test.txt
$ git add .
$ git commit -mA
$ git checkout -b the_branch
$ edit test.txt
$ git commit -a -mB
$ git checkout master
$ git merge master the_branch --no-ff
$ edit test.txt
$ git commit -a -mD

ここから、あなたが説明した状況があります。それで:

$ git rebase --onto <SHA1-for-A> <SHA1-for-C> master

コミットをC(除外)からマスター、Aにリベースします。BとDの同じ場所で変更したため、いくつかの競合を修正する必要がありましたが、修正しないと思います。

   _D'
  /
 /
A_______C___D
 \     /
  \_B_/

git rebase --onto多かれ少なかれあなたの状況である についてのドキュメント:http: //git-scm.com/docs/git-rebase


あなたが持っていた場合:

A_______C___D___F
 \     /
  \_B_/

、そしてあなたは今持っています:

   _D'___F'_(master)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

ここから、マスターの変更をブランチにマージするのは簡単です。コミットF'を完全に破棄します。

$ git checkout master # if you were not here already
$ git branch old_fix  # if you want to be able to return to F' later
$ git reset --hard <SHA1-to-D'>

上記のコマンドの後、次のようになります。

     (master)
    /
   _D'___F'_(old_fix)
  /
 /
A_______C___D___F
 \     /
  \_B_/(the_branch)

masterの更新をthe_branchにマージするには:

$ git checkout the_branch
$ git merge master

...そして競合を修正します。

于 2010-12-14T10:45:03.787 に答える
6

明らかな解決策は、にリセットしA、すべてのパッチを手動で再適用し、競合を解決することです(これはありません)。

git revertまたは、パッチを適用するだけBでも、新しいコミットが作成されます。

ゴーティエの答えはより良いですが。

于 2010-12-14T00:27:44.850 に答える