私は現在の状況を持っています
A ----- D
\
B - C (master)
ここで、マージせずD
にコミットを挿入したいと思います。たとえば、将来のコミットとの内容を変更しないでください。B
C
基本的に、コミットの親を書き換えますB
(したがって、他のすべてのコミットはアップストリームになります)。
結局、私は手動の相互作用なしで持っていたいです:
A - D - B - C
私は現在の状況を持っています
A ----- D
\
B - C (master)
ここで、マージせずD
にコミットを挿入したいと思います。たとえば、将来のコミットとの内容を変更しないでください。B
C
基本的に、コミットの親を書き換えますB
(したがって、他のすべてのコミットはアップストリームになります)。
結局、私は手動の相互作用なしで持っていたいです:
A - D - B - C
バッチモードは、現在のブランチ履歴にあるものに対して実行されます。この場合、あなたはDの歴史かあなたの主人の歴史のどちらかを見ています。ここで行う最も簡単なことは次のとおりです。
git rebase D
(マスターがすでにチェックアウトされていると仮定します)なぜこれをバッチモードで実行する必要があるのですか?
探しているアクションはrebase
インタラクティブモードです。
git checkout C
git cherry-pick D # Now: A - B - C -D
git rebase -i A
<reorder commits>
git log
この--interactive / -i
オプションを使用すると、エディターで履歴が開き、好きなだけ物事を混乱させることができます。複数のコミットをまとめて潰したり、一部を完全に削除したりすることもできます。
完全に平凡になりたい場合は、次のようにすることもできます。
git checkout A
git cherry-pick D B C
内容を変更せずに(もちろんコミットSHAのほかに)履歴に新しいコミットを導入する適切な方法は、中間のgitグラフトを使用することです。
次の例では、以前の移植はなかったと思います。
# use a graft to temporarily change the parent of B to be D
echo "$SHA_B $SHA_D" > .git/info/grafts
# apply the grafts, changing the SHAs of the commits B...C
git filter-branch
# remove old pending commits
git gc
# remove the no longer needed grafts
rm .git/info/grafts
これにより、すべてのコミットコンテンツ(ファイルとフォルダー)は変更されません。