(これは私の質問に対する2番目の答えです。2回目の読書では、元の問題は私が最初に理解した問題とは少し異なっていた可能性があると思います。)
あなたが開発ブランチのパララーを持っているので、私は質問を理解していますmaster
。通常、この種のブランチスタイルは機能ブランチと呼ばれ、これらを使用することを強くお勧めします。
機能ブランチを常にクリーンに保つように努める必要があります。実際には、間違いを犯したことがない場合に行ったであろうコミットを備えた機能ブランチが必要です。git rebase -i
私にとって、それは私が後でそれらの間違いについて学ぶときに間違いを修正するために多くのことを後でコミットすることを意味します。
機能ブランチの準備が整うまでに、次のようになります。
- Xを実行するためのAPIを追加する
- コーナーケースZの既存のAPIYを修正
- XとYを使用して機能Bを追加します(Zの場合にも機能します!)
- 機能Bを改善する:魔法のようなことをするE
それ以外の
- WIP
- WIP2
- APIを追加
- APIを移動してXを実行する
- 機能Bを追加
- 考え直して、Xのパラメーターの名前を変更します
- 機能Bを修正
- XのAPiを修正
- コーナーケースZを修正
- APIYのコーナーケースZも修正
- 魔法のことをするE
- 欠落しているファイルをコミットする
その後、機能ブランチを最新のブランチにリベースするmaster
と、変更が大きくなり、コミットのみFix existing API Y for corner case Z
が競合を引き起こす可能性があります。そのコミットが既存のAPIを変更するための最小限の変更である場合、競合の修正は簡単です。さらに、その競合は、他のコミットが最小限の変更によって触れられた行を正確に変更した場合にのみ発生します。
マージする代わりに機能ブランチとリベース機能ブランチを実行する場合(私の好みのスタイルは、早送りが可能になるようにリベースしてからgit checkout master && git merge --no-ff feature-branch-x
、マージコミットですべてを実行して文書化することです。これにより、ブランチの完全な履歴を保持し、GUIツールを使用できます。必要に応じて機能を簡単にナビゲートするために)これらのブランチをにリベースする前に、機能ブランチをクリーンに保つmaster
必要があります。リベースが簡単になるだけでなく、長期的には履歴を読み取ることができます。
したがって、上記の例ではrebase -i <old-enough-sha1>
、再注文は3 + 4 + 6 + 8、10、1 + 2 + 5 + 7 + 9、11 + 12としてコミットされます。ここで、+
はスカッシュを意味します。Gitでは、既存のコミットを分割して編集することもできますが、通常は、コミットを非常に小さくして、後でそれらの一部を潰す方が簡単です。この例では、元のコミット番号10でさえ、元の最初のコミットの前に終了することに注意してください。これは正常であり、実装が完全ではなかったという現実を反映しています。ただし、バージョン履歴に保存する必要はありません。
あなたの場合、複数のコミットが同じものを追加および削除する機能ブランチがあるように思えます。それらのコミットを単一のコミットとして押しつぶします(変更がない場合は問題ありません)。機能ブランチがクリーンに見える場合にのみ、機能ブランチをマスターにリベースします。ファイルの代わりに変更された行を簡単にgit gui
コミットできるようにするツールやその他のツールの使い方を確実に学びましょう。すべてのコミットは、適切なコレクションを変更する変更である必要があります。新しい機能Xを追加する場合、同じコミットで既存の関数Yを修正したり、Zに関する不足しているドキュメントを追加したりしてはなりません。同じファイルにこれらの変更が加えられた場合でも同様です。私にとって、これは、LinusTorvaldsが「ファイルは重要ではない」と言ったときに意味したようなものです。"。