一度にいくつかのバグに取り組むことが絶対に必要ですか?「同時に」とは、「複数のバグのためにファイルを同時に編集すること」を意味します。あなたが絶対にそれを必要としない限り、私はあなたの環境で一度に1つのバグだけに取り組むでしょう。そうすれば、ローカルのブランチとリベースを使用できます。これは、複雑なスタッシュ/ステージを管理するよりもはるかに簡単です。
マスターがコミットBにいるとします。ここで、バグ#1に取り組みます。
git checkout -b bug1
今、あなたはブランチのバグ1にいます。変更を加えて、コミットし、コードのレビューを待ちます。これはローカルであるため、他の人に影響を与えることはなく、git diffからパッチを作成するのは簡単です。
A-B < master
\
C < bug1
これで、bug2に取り組んでいます。でマスターに戻りgit checkout master
ます。新しいブランチを作成しgit checkout -b bug2
ます。変更を加え、コミットし、コードのレビューを待ちます。
D < bug2
/
A-B < master
\
C < bug1
あなたがレビューを待っている間に、他の誰かがマスターでE&Fをコミットしたとしましょう。
D < bug2
/
A-B-E-F < master
\
C < bug1
コードが承認されたら、次の手順でコードをマスターにマスターできます。
git checkout bug1
git rebase master
git checkout master
git merge bug1
これにより、次のようになります。
D < bug2
/
A-B-E-F-C' < master, bug1
次に、ローカルのbug1ブランチをプッシュして削除すると、すぐに使用できます。ワークスペースでは一度に1つのバグですが、ローカルブランチを使用すると、リポジトリで複数のバグを処理できます。これにより、複雑なステージ/スタッシュダンスが回避されます。
コメントでctoteの質問に答えてください:
さて、各バグの隠し場所に戻って、一度に1つのバグのみを処理できます。少なくとも、ステージングの問題を回避できます。しかし、これを試してみて、私は個人的にそれが面倒だと思います。Stashesはgit logグラフでは少し乱雑です。さらに重要なことに、何かを台無しにすると元に戻すことはできません。ダーティな作業ディレクトリがあり、スタッシュをポップした場合、そのポップを「取り消す」ことはできません。既存のコミットを台無しにすることははるかに困難です。
ですからgit rebase -i
。
あるブランチを別のブランチにリベースする場合、インタラクティブに行うことができます(-iフラグ)。これを行うと、コミットごとに実行する処理を選択するオプションがあります。Pro GitはすばらしいHTML形式の本で、リベースとスカッシュについての素晴らしいセクションがあります。
http://git-scm.com/book/ch6-4.html
便宜上、彼らの例を逐語的に盗みます。次のコミット履歴があり、バグ1をマスターにリベースしてスカッシュしたいとします。
F < bug2
/
A-B-G-H < master
\
C-D-E < bug1
入力すると次のようになります git rebase -i master bug1
pick f7f3f6d changed my name a bit
pick 310154e updated README formatting and added blame
pick a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
ブランチのすべてのコミットを1つのコミットに押しつぶすには、最初のコミットを「ピック」として保持し、後続のすべての「ピック」エントリを「スカッシュ」または単に「s」に置き換えます。コミットメッセージを変更する機会も得られます。
pick f7f3f6d changed my name a bit
s 310154e updated README formatting and added blame
s a5f4a0d added cat-file
#
# Commands:
# p, pick = use commit
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
だから、ええ、つぶしは少し面倒ですが、スタッシュを多用するよりも、それをお勧めします。