0

コミットa1、a2、a3、a4のテストブランチがあります。マスターブランチに変更を加えたいのですが、4回ではなく1回のコミットでのみです。だから私はしました:

git checkout master
git merge -Xtheirs test
git rebase -i a1

squash a4
squash a3
squash a2
pick a1

したがって、マスターブランチで、a1、a2、a3、a4からの変更を含むコミットb1を取得しました。これは、初めて実行したときに正常に機能しました。次に、テストブランチを続行し、コミットa5、a6、a7、a8を追加しました。私はマスターにチェックアウトし、再度マージしました-a5はa4の続きであり、したがってb1の続きであるため、奇妙な競合を解決する必要がありました。git diffa4とb1では違いが出力されなかったことに注意してください。次に、a5からリベースしようとしましたが、さらに多くの競合が発生しました。

だから、それはgit rebase私が必要としているものではないようです。コミットに参加した後、gitはa4とb1を異なる履歴を持つ異なるコミットオブジェクトと見なし、さらに悪いことに、グラフ内の異なる位置になります。

私は次のようなものが欲しいです:

b0 --- b0
| |
a1 |
| |
a2 |
| |
a3 |
| |
a4 ---- b1
| |
a5 |
| |
a6 |
| |
a7 |
| |
a8 ---- b2
| |   
a9 |
| |
... --- b3

それも可能ですか?

コミットのすべてのグループにブランチを作成できます。つまり、a1、a2、a3、a4にブランチを作成してから、マスターを使用してマージとリベースを実行し、コミットa5、a6、a7、a8にb1から別のブランチを作成してから、マスターとマージしてリベースし、b2などを取得します。しかし、これは私が望んでいることではありません。1日に1つのブランチを持つことは望ましくありません。すべてのコミットを含むテストブランチと、より大まかな粒度のマスターブランチの2つのブランチのみが必要です。マスターをプッシュしたときに、私が行った小さな変更がすべて表示されないようにします。

4

2 に答える 2

4

たぶんあなたは--no-ffオプションを使用したいgit mergeですか?そうすれば、gitがコミットの早送りマージを実行する代わりに、常にマージコミットを取得できます。あなたの場合b0、、、b1...はマージコミットになります。

編集:マージの競合なしにマスターブランチでb0、b1のみをコミットすることはできません。ただし、中間コミットを非表示にする必要がない場合は、上記が適切な代替手段です。一般に、リベースおよび/またはチェリーピックを実行して競合に対処するか、すべてのコミットオブジェクトをプッシュして競合に対処する必要はありません。

于 2012-08-03T20:12:30.937 に答える
1

オンになっている間、これらの新しいコミットをで潰すmasterことができます。これにより、テストブランチのコミットはそのままになり、プッシュして、他の人があなたが行ったすべての変更を確認できないようにすることができます(要件に従って)git cherry-pick a1..a4mastermaster

もちろん、この場合、b1とa4は2つの異なるコミットになります。実際、b1とa4が同じコミットになることはありません。グラフィカルツールがa4からb1を指すようにする場合は、--no-ffMattiasが前述したようにマージを使用する必要があります。

于 2012-08-04T05:20:36.877 に答える