2

私は次のようなコミットを持っています

Initial->FeatureX->B->C->D->FixBugInFeatureX->E->F->

今、FeatureX、FixBugInFeatureX から単一のコミットを作成したい

だから私は試しました

   git -rebase -i -<FeatureX>

次に、コミット FixBugInFeatureX をテキスト ファイルの FeatureX の直後に移動し、これを からpickに変更しましsquash た。しかし、すべてが書き換えられたコミットを含む新しいブランチが表示されます。 Initial->FeatureX->B->C->D->FixBugInFeatureX->E->F. このブランチを Head にマージできますが、以前のコミットはすべて残っています (ここで、FixBugInFeatureX には 2 回目の FeatureA が含まれています。さらに、コミット B、C、および D の間のすべてが 2 回存在します。

私が欲しいのは、次のような新しいコミット ツリーです

Initial->FeatureX->B->C->D->E->F

このようにリベースするにはどうすればよいですか? または、別のコマンドが必要ですか?

4

2 に答える 2

0

私は解決策を見つけました:

rebase --interactive は、最初のコミットの前にコミットのハッシュをスカッシュに渡すと、ジョブを実行します。

git rebase  -i --no-autosquash "<hash of comitt BEFORE FeatureX>"

これにより、次のようなテキストファイルが開きます

pick 07b952c some unrelated committ 
pick 6c46e25 FeatureX
pick b4bc625 B
pick f2fab98 C
pick dc6ba8b D
pick 5633408 FixBugInFeatureX
pick 077888f E
pick 0123445 F

# Rebase xxx..yyy onto zzz
#
# Commands:
#  p, pick = use commit
#  r, reword = use commit, but edit the commit message
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#  f, fixup = like "squash", but discard this commit's log message
#  x, exec = run command (the rest of the line) using shell
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
#
# However, if you remove everything, the rebase will be aborted.
#
# Note that empty commits are commented out

このファイルを次のように変更できるようになりました

pick 07b952c some unrelated committ 
pick 6c46e25 FeatureX
squash 5633408 FixBugInFeatureX
pick b4bc625 B
pick f2fab98 C
pick dc6ba8b D
pick 077888f E
pick 0123445 F

そして、git は両方のコミットをまとめて押しつぶします。その後、編集可能なテキスト ファイルが表示され、ここで 6c46e25 の新しいコミット メッセージを編集できます。これには 5633408 も含まれています。

マージまたはプッシュ/プルが両方のコミット間で行われた場合、これは満足のいく動作をしません。これにより、少なくとも私の試験では履歴が重複しました。しかし、これに加えて、まさに私が欲しかったものです。重複した履歴はありません。明らかにポイントは、編集する最初のコミットの前にコミットのハッシュを渡すことです。

于 2013-03-27T11:13:22.663 に答える
0

FeatureX と FixBugInFeatureX のコミットを確認し (その場合、頭が切り離された状態になります)、それらを 2 つの新しいブランチにコミットできます。

git checkout <FeatureX> 
git checkout -b featureX

git checkout <FixBugInFeatureX>
git checkout -b bugfix

次に、これらのブランチをマージして、元のコミットと修正の間で競合が発生しないようにします

git merge featureX

次に、マスター(またはそのチェーンを含むブランチ)をチェックアウトできます

git checkout master

git rebase インタラクティブ モードを実行して、マスター ブランチと、FeatureX の修正バージョンを含むブランチをリベースします。

git rebase -i bugfix

コミットに希望の順序を与えるだけで、リベースが残りを行います(チェーンを希望する順序)

于 2012-08-15T15:22:24.677 に答える