4

2つのパッチにマージしたいさまざまなコミットを含むリポジトリがあります。この機能を導入するパッチと、それを使用するように既存のコードを変更するパッチ。問題は、私がコーディングしてコミットしていたとき、それを念頭に置いていなかったので、両方を行うコミットがあります。これらのコミットを分割するにはどうすればよいですか?

どういうわけか、git rebase -iを使用して、変更したいコミットごとに編集を選択することでそれを実行できることを知っていますが、この方法では、コードではなく、コミットメッセージのみを変更できます。

4

2 に答える 2

4

Gitを使用すると、コミットを分割rebaseできます。

インタラクティブモードでは、アクション「編集」でコミットをマークできます。ただし、これは必ずしもgitrebaseがこの編集の結果が正確に1つのコミットであることを期待していることを意味するわけではありません。実際、コミットを元に戻すことも、他のコミットを追加することもできます。これは、コミットを2つに分割するために使用できます。

  • git rebase -i ^を使用してインタラクティブなリベースを開始します。ここで、分割するコミットはです。実際、そのコミットが含まれている限り、どのコミット範囲でもかまいません。

  • 分割するコミットをアクション「編集」でマークします。

  • そのコミットを編集する場合は、git resetHEAD^を実行します。その効果は、HEADが1つ巻き戻され、インデックスがそれに追随することです。ただし、作業ツリーは同じままです。

  • 次に、最初のコミットで必要な変更をインデックスに追加します。これを行うには、git add(おそらくインタラクティブ)またはgit gui(またはその両方)を使用できます。

  • 現在適切なコミットメッセージを使用して、現在のインデックスをコミットします。

  • 作業ツリーがきれいになるまで、最後の2つの手順を繰り返します。

  • gitrebase--continueを使用してリベースを続行します。

中間リビジョンの一貫性が完全にわからない場合(コンパイル、テストスイートの合格など)、各コミット、テスト、および修正の場合はコミットの修正後に、gitstashを使用してまだコミットされていない変更を隠しておく必要があります必要です。

于 2012-07-18T12:30:29.477 に答える
1

これが私がすることです:

git reset COMMIT_BEFORE_CHANGES --soft

適切なコミットですべてを再コミットします。--soft作業ツリーとインデックスは、リセット前の状態のままになります。

言うまでもなく、誰かがあなたから引っ張った後は、このようなことをしてはいけません。

于 2012-07-18T12:16:32.997 に答える