2

私はいくつかのコミットがある機能ブランチを持っています。次に、git rebase master を実行し、そのブランチを master にマージしました。

みたいだった

git checkout -b somebranch
......some work commits here .....
git checkout master
git fetch
git merge origin/master
git checkout somebranch 
git rebase master
git checkout master
git merge  somebranch

ここで、一部のブランチのすべてのコミットをマスターから完全に引き出す必要があります。後でマスターにマージする必要がある可能性があります。

更新: 変更はしばらく前にマスターにプッシュされ、マージ後に多くのコミットがあるため、ヘッドへのリセットは機能しません

4

3 に答える 3

3
git checkout -b somebranch # from "A"
......some work commits here x, y, z .....
git checkout master
git pull # call new HEAD "B"

だから私たちは次のようなものを持っています

A -> a1 -> a2 -> B <= master
 \
  x -> y -> z      <= somebranch

その後:

git checkout somebranch 
git rebase master

A -> ... -> B <= master
             \
              x' -> y' -> z' <= somebranch

git checkout master
git merge  somebranch # call new HEAD "C"


A -> ... -> B -------------> C <= master
             \              /
              x' -> y' -> z' <= somebranch

したがって、この時点で、 master を に巻き戻すだけで、不要なマージを簡単に元に戻すBことができます。ただし、プッシュする Cと (そして他の人がそれを見て、および/またはその上で作業を行った場合)、これは難しくなります。


簡単な解決策は、上のすべてのコミットを元に戻すことsomebranchです:

git revert x'..z'

押します。

ここで、somebranch再度マージする前に、(最初に行ったように) リベースする必要があります。これは機能しますが、マスターの履歴にノイズが発生します。


限られた数の人々が子供を見たり、コミットしたりし、彼らと調整できる場合、これを回避することは可能ですが、それは大変な作業です. 可能であれば、彼らが取り組んでいるすべてがコミットされ、プッシュされていることを確認する必要があります。その後、これをリベースできます。

A -> ... -> B -------------> C -> c1 -> c2 -> D <= master
             \              /
              x' -> y' -> z' <= somebranch

これに:

              c1' -> c2' -> D' <= master
             /
A -> ... -> B -------------> C -> c1 -> c2 -> D
             \              /
              x' -> y' -> z' <= somebranch

これで中央のブランチは孤立し、新しいヘッドにD'は変更が反映されず、somebranchそのまま残っているので後でマージできます。

これを行うには、次を使用します。

git rebase --onto B C c1
git push --force

他のすべての人はD'、たとえば次のようにして、新しい head に更新する必要があります。

git fetch
git checkout master
git reset --hard origin/master

まだ依存している(そして、リベースしたときにまだチェーンに表示されていない)ローカル コミットを誰か持っている場合は、それらを新しい履歴にリベースまたはチェリー ピックする必要があることに注意してください。これは潜在的に多くの (エラーが発生しやすい) 作業になるため、可能であれば回避することをお勧めします。Cc1..D

于 2012-11-20T21:49:52.087 に答える
1

のローカル コピーではmaster、次のことを試すことができます。これにより、変更が元に戻された新しいコミットが作成されます (マスターで既に行ったことの逆)。

git revert OLDER_COMMIT^..NEWER_COMMIT

OLDER_COMMIT機能ブランチ コミットの最初のコミットであり、機能ブランチNEWER_COMMITの最後のコミットです。

または、代わりに、試すことができます

git revert -n OLDER_COMMIT..NEWER_COMMIT

コミットによって行われた変更を元に戻しますが、元に戻された変更で新しいコミットを作成しません。元に戻すと、作業ツリーとインデックスのみが変更されます。

注: を使用して1.7.4+

于 2012-11-20T21:20:09.973 に答える
0

マージコミットがまだ最新であり、そのコミットをまだアップストリームにプッシュしていない場合は、マージ前にコミットに戻す必要があります。つまり、ブランチを後の場所にgit reset --hard HEAD^戻します。mastergit merge origin/master

于 2012-11-20T20:41:41.387 に答える