152

この質問は、このタスクを達成する方法だけでなく、そうすることは Git の良い習慣なのか悪い習慣なのかにも関係しています。

ローカルでは master ブランチでほとんどの作業を行っていますが、「topical_xFeature」と呼ぶトピック ブランチを作成しました。「topical_xFeature」で作業し、マスター ブランチで他の作業を行うために行ったり来たりしている過程で、「topical_xFeature」ブランチで複数のコミットを行ったことがわかりましたが、各コミット間で何も行っていません。押す。

まず、この悪い習慣について考えていただけますか? プッシュごとにブランチごとに 1 つのコミットに固執する方が賢明ではないでしょうか? プッシュが行われる前にブランチに複数のコミットがあるとよいのはどのような場合ですか?

2 番目に、topical_xFeature ブランチの複数のコミットをマスター ブランチに移動してプッシュするにはどうすればよいでしょうか? それを気にせず、複数のコミットがプッシュされる場所で単にプッシュを行うのは面倒ですか、それとも何らかの方法でコミットを 1 つにマージしてからプッシュする方が面倒ではありませんか? 繰り返しますが、これを行う方法は?

4

6 に答える 6

153

最初の質問については、いいえ、一度に複数のコミットをプッシュしても問題はありません。多くの場合、作業をいくつかの小さくて論理的なコミットに分割したいと思うかもしれませんが、シリーズ全体の準備ができたと感じてから、それらを押し上げてください。または、切断中にローカルでいくつかのコミットを行っていて、再度接続したときにすべてをプッシュする場合があります。プッシュごとに 1 つのコミットに制限する理由はありません。

私は通常、各コミットを、動作に必要なすべてを含む単一の論理的で首尾一貫した変更に保つことをお勧めします (したがって、コードが壊れた状態のままになることはありません)。2 つのコミットがあり、最初のコミットだけを適用するとコードが壊れてしまう場合は、2 番目のコミットを最初のコミットに押し込むことをお勧めします。ただし、それぞれが合理的な変更を行う 2 つのコミットがある場合は、それらを別々のコミットとしてプッシュしても問題ありません。

複数のコミットを一緒にスカッシュしたい場合は、 を使用できますgit rebase -i。ブランチtopical_xFeatureにいる場合は、 を実行しますgit rebase -i master。これにより、エディター ウィンドウが開き、一連のコミットが先頭にpick. 最初のものを除くすべてを に変更できますsquash。これにより、Git にこれらの変更をすべて保持するように指示されますが、それらは最初のコミットに押しつぶされます。それが終わったら、機能ブランチをチェックアウトしmasterてマージします。

git checkout topical_xFeature
git rebase -i master
git checkout master
git merge topical_xFeature

topical_xFeatureまたは、すべてをに押しつぶしたいだけの場合masterは、次のようにすることもできます。

git checkout master
git merge --squash topical_xFeature
git commit

どちらを選ぶかはあなた次第です。一般的に、複数の小さなコミットがあることを心配することはありませんが、余分なマイナー コミットに煩わされたくない場合があるため、それらを 1 つに押しつぶすだけです。

于 2011-04-19T19:52:37.087 に答える
75

これは、コードをプッシュする前に、複数のコミットを 1 つのコミットに結合するための一般的な方法です。

これを実現するには、GIT が提供する ' squash ' の概念を使用することをお勧めします。

以下の手順に従ってください。

1) git rebase -i master ( masterの代わりに特定のコミットを使用することもできます)

rebase インタラクティブ エディターを開くと、すべてのコミットが表示されます。基本的に、単一のコミットにマージするコミットを特定する必要がある場所。

これらがあなたのコミットであり、エディターにこのようなものが表示されていると想像してください。

pick f7f3f6d changed my name a bit    
pick 310154e updated README formatting and added blame   
pick a5f4a0d added cat-file  

これらのコミットは、log コマンドを使用して通常表示される順序とは逆の順序でリストされることに注意してください。つまり、古いコミットが最初に表示されます。

2)最後にコミットされた変更については、'pick' を 'squash'に変更します。以下に示すようなもの。そうすることで、最後の 2 つのコミットが最初のコミットとマージされます。

pick f7f3f6d changed my name a bit         
squash 310154e updated README formatting and added blame   
squash a5f4a0d added cat-file

組み合わせるコミットがたくさんある場合は、短い形式を使用することもできます。

p f7f3f6d changed my name a bit         
s 310154e updated README formatting and added blame   
s a5f4a0d added cat-file

編集用に「i」を使用すると、エディタで挿入できるようになります。結合する前のコミットがないため、最上位 (最も古い) コミットは押しつぶすことができないことに注意してください。したがって、選択または「p」する必要があります。'Esc' を使用して挿入モードを終了します。

3) 次に、次のコマンドで エディターを保存します。:wq

それを保存すると、以前の 3 つのコミットすべての変更を導入する単一のコミットが作成されます。

これがあなたを助けることを願っています。

于 2012-11-28T11:58:06.357 に答える
12

まず: プッシュごとにブランチごとにコミットを 1 つだけ持つように指示するものはありません。プッシュは、リモート リポジトリでローカル履歴 (つまり、コミットのコレクション) を公開できる公開メカニズムです。

2番目git merge --no-ff topical_xFeatureプッシュする前に、トピックの作業を単一のコミットとしてマスターに記録しますmaster
(そうすれば、次のマージ --no-ff で 1 つの新しいコミットとしてtopical_xFeature記録できる、さらなる進化に備えることができます。Brian Campbellで詳しく説明されているように、 取り除くことが目標である場合は、正しいオプションです。の答え。)master
topical_xFeaturegit merge --squash

于 2011-04-19T19:51:40.703 に答える