web-dev-qa-db-ja.com

Git merge --squashの使い方

私はリモートGitサーバーを持っています、これが私が実行したいシナリオです:

  • それぞれのバグ/機能ごとに異なるGitブランチを作成します

  • 私はそのGitブランチのコードを非公式のGitメッセージでコミットし続けます

  • トップリポジトリでは、公式のGitメッセージを使って1つのバグに対して1つのコミットをしなければなりません

それでは、どのようにして私のブランチをリモートブランチにマージして、すべてのチェックインに対して1つのコミットしか得られないようにすることができます(私はこのためのコミットメッセージも提供したいです)。

952
SunnyShah

あなたのバグ修正ブランチがbugfixと呼ばれていて、それをmasterにマージしたいとします。

git checkout master
git merge --squash bugfix
git commit

これはbugfixブランチからすべてのコミットを取り出し、それらを1つのコミットにまとめ、それをあなたのmasterブランチとマージします。


説明

git checkout master

あなたのmasterブランチに切り替えます。

git merge --squash bugfix

bugfixブランチからすべてのコミットを受け取り、それをあなたの現在のブランチとマージします。

git commit

マージされた変更から単一のコミットを作成します。

-mパラメータを省略すると、コミットを確定する前に、圧縮されたコミットからのすべてのメッセージを含むコミットメッセージのドラフトを変更できます。

1577
abyx

私のために最後にこれを片付けたのは コメント であることを示していました:

git checkout main
git merge --squash feature

することと同等です:

git checkout feature
git diff main > feature.patch
git checkout main
patch -p1 < feature.patch
git add .

機能ブランチを105個のコミット(!!)でマージして、それらすべてを1つにまとめるときは、 each の中間のコミットについてマージの競合を個別に解決する必要があるため、git rebase -i Origin/masterはしたくありません(あるいは少なくともgitが自分自身を理解することができないもの)。 git merge --squashを使用すると、機能ブランチ全体をマージするための1回のコミットで、必要な結果が得られます。そして、私はせいぜい1つの手動紛争解決をするだけでよいです。

98
Dan Kohn

あなたはスカッシュオプションとマージしたいです。それはあなたが一度にそれを一つのブランチにしたいのであればです。

git merge --squash feature1

単一のコミットと同時にすべてのブランチをマージしたい場合は、まず対話的にリベースし、各機能を縮小してからタコをマージします。

git checkout feature1
git rebase -i master

1つのコミットにまとめてから、他の機能についても繰り返します。

git checkout master
git merge feature1 feature2 feature3 ...

この最後のマージは一度に多数のブランチをマージするため、「タコのマージ」です。

お役に立てれば

93
Adam Dymitruk

mainにすでにgit merge bugfixがある場合、マージコミットを次のようにして1つにまとめることができます。

git reset --soft HEAD^1
git commit
21
qwertzguy

カスタムコミットでnewFeatureブランチをmasterにマージします。

git merge --squash newFeature && git commit -m 'Your custom commit message';

もしそうなら、あなたは

git merge --squash newFeature && git commit

あなたはカスタマイズ可能な全てのnewFeatureブランチコミットを含むコミットメッセージを受け取るでしょう。

8

この質問は特にGithubに関するものではないことは知っていますが、Githubは広く使用されており、これが私が探していた答えなので、ここで共有します。

Githubには、リポジトリに対して有効になっているマージオプションに応じて、スカッシュマージを実行する機能があります。

スカッシュマージが有効になっている場合は、ドロップダウンの[マージ]ボタンの下に[スカッシュとマージ]オプションが表示されます。

Screenshot of "Squash and merge" Github feature

2
Aaron

Feature/task1で複数のコミットを行ったとします。

  1. あなたのプロジェクトブランチ(project/my_project)に行ってください。

    git checkout project/my_project
    
  2. 新しいブランチを作成する(feature/task1_bugfix)

    git checkout -b feature/task1_bugfix
    
  3. --squashオプションでマージする

    git merge --squash feature/task1
    
  4. 単一のコミットを作成する

    git commit -am "add single comments"
    
  5. あなたの枝を押す

    git Push --set-upstream Origin feature/task1_bugfix
    
1
Farid Haq

Gitの場合

新しい機能を作成する

ターミナル/シェル経由:

git checkout Origin/feature/<featurename>
git merge --squash Origin/feature/<featurename>

これはコミットしません、あなたが最初にそれをレビューすることを可能にします。

それからコミットして、この新しいブランチから機能を終了し、古いもの(あなたが開発したもの)を削除/無視します。