この質問は、このタスクを達成する方法だけでなく、それを行うことがGitの良いプラクティスか悪いプラクティスかに関するものです。
ローカルでmasterブランチでほとんどの作業を行っているが、topical_xFeatureと呼ばれるトピックブランチを作成していることを考慮してください。 「topical_xFeature」で作業し、マスターブランチで他の作業を行うために前後に切り替えるプロセスで、「topical_xFeature」ブランチで複数のコミットを行ったが、各コミットの間に、押す。
最初、この悪い習慣を考慮しますか?プッシュごとにブランチごとに1つのコミットを続けるのが賢明ではないでしょうか?どのような場合、プッシュが行われる前にブランチで複数のコミットを行うのが良いでしょうか?
Second、topical_xFeatureブランチの複数のコミットをプッシュのためにmasterブランチに持ち込むにはどうすればよいでしょうか?それを心配せずに、複数のコミットがプッシュされるプッシュを行うのは迷惑ですか?繰り返しますが、これを行う方法は?
最初の質問では、いや、複数のコミットを一度にプッシュしても何も問題はありません。多くの場合、作業をいくつかの小さな論理的なコミットに分割したい場合がありますが、シリーズ全体の準備ができたと感じてからプッシュしてください。または、切断された状態でローカルに複数のコミットを行い、再度接続されたときにすべてをコミットする場合があります。プッシュごとに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つのコミットに結合する方法です。
これを実現するには、GITが提供する「squash」の概念を使用することをお勧めします。
以下の手順に従ってください。
1)git rebase -i master(masterの代わりに特定のコミットを使用することもできます)
リベースインタラクティブエディターを開き、すべてのコミットを表示します。基本的に、単一のコミットにマージするコミットを特定する必要がある場所。
これらがあなたのコミットであり、エディターでこのようなものを示していると想像してください。
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つのコミットすべての変更を導入する単一のコミットができます。
これがお役に立てば幸いです。
最初:プッシュごとにブランチごとにコミットを1つだけにすることは何も伝えません:プッシュは、ローカル履歴(つまりコレクション)を公開できる公開メカニズムですコミットの)リモートリポジトリで。
Second:git merge --no-ff topical_xFeature
は、master
をプッシュする前に、トピックが動作する単一のコミットとしてマスターに記録します。
(そのようにして、さらなる進化のためにtopical_xFeature
を保持し、次のマージ--no-ffで単一コミットとしてmaster
に記録できるようにします。topical_xFeature
を取り除くことが目標であれば、 Brian Campbell の answer で詳述されているように、git merge --squash
が正しいオプションです。
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
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