web-dev-qa-db-ja.com

プッシュする前に複数のコミットを1つにまとめる

この質問は、このタスクを達成する方法だけでなく、それを行うことがGitの良いプラクティスか悪いプラクティスかに関するものです。

ローカルでmasterブランチでほとんどの作業を行っているが、topical_xFeatureと呼ばれるトピックブランチを作成していることを考慮してください。 「topical_xFeature」で作業し、マスターブランチで他の作業を行うために前後に切り替えるプロセスで、「topical_xFeature」ブランチで複数のコミットを行ったが、各コミットの間に、押す。

最初、この悪い習慣を考慮しますか?プッシュごとにブランチごとに1つのコミットを続けるのが賢明ではないでしょうか?どのような場合、プッシュが行われる前にブランチで複数のコミットを行うのが良いでしょうか?

Second、topical_xFeatureブランチの複数のコミットをプッシュのためにmasterブランチに持ち込むにはどうすればよいでしょうか?それを心配せずに、複数のコミットがプッシュされるプッシュを行うのは迷惑ですか?繰り返しますが、これを行う方法は?

119
Todd Hopkinson

最初の質問では、いや、複数のコミットを一度にプッシュしても何も問題はありません。多くの場合、作業をいくつかの小さな論理的なコミットに分割したい場合がありますが、シリーズ全体の準備ができたと感じてからプッシュしてください。または、切断された状態でローカルに複数のコミットを行い、再度接続されたときにすべてをコミットする場合があります。プッシュごとに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

どちらを選択するかはあなた次第です。一般に、複数の小さなコミットを心配することはありませんが、余分なマイナーコミットを気にしたくない場合があります。

128
Brian Campbell

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

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

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

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

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

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

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つのコミットすべての変更を導入する単一のコミットができます。

これがお役に立てば幸いです。

62
Kondal Kolipaka

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

Secondgit merge --no-ff topical_xFeatureは、masterをプッシュする前に、トピックが動作する単一のコミットとしてマスターに記録します。
(そのようにして、さらなる進化のためにtopical_xFeatureを保持し、次のマージ--no-ffで単一コミットとしてmasterに記録できるようにします。
topical_xFeatureを取り除くことが目標であれば、 Brian Campbellanswer で詳述されているように、git merge --squashが正しいオプションです。

11
VonC

Masterブランチに切り替えて、最新であることを確認します。

git checkout master

git fetchこれは、Git設定に応じて、Origin/masterの更新を受信するために必要になる場合があります

git pull

機能ブランチをマスターブランチにマージします。

git merge feature_branch

マスターブランチをOriginの状態にリセットします。

git reset Origin/master

Gitはすべての変更をステージングされていない変更と見なします。これらの変更を1つのコミットとして追加できます。追加追跡されていないファイルも追加します。

git add --all

git commit

参照: https://makandracards.com/makandra/527-squash-several-git-commits-into-a-single-commit

8
shiva kumar

1)まず、すべてのコミットを実行するコミットを選択します。

git reflog
5976f2b HEAD@{0}: commit: Fix conflicts
80e85a1 HEAD@{1}: commit: Add feature
b860ddb HEAD@{2}: commit: Add something

2)選択したヘッドにリセットします(HEAD @ {2}を選択しました)

git reset b860ddb --soft

3)gitステータス(念のため)

4)新しいコミットを追加する

git commit -m "Add new commit"

注:HEAD@{0}HEAD@{1}は1つのコミットにマージされるようになりました。これは複数のコミットに対しても実行できます。

git reflogが再び表示されるはずです:

git reflog
5976f2b HEAD@{0}: commit: Add new commit
b860ddb HEAD@{1}: commit: Add something
3
Eddy Ekofo