1573

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

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

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

  • トップリポジトリでは、公式のGitメッセージを使用して1つのバグに対して1つのコミットを実行する必要があります

では、ブランチをリモートブランチにマージして、すべてのチェックインに対して1つのコミットだけを取得するにはどうすればよいですか(これに対してコミットメッセージを提供したい場合もあります)。

4

15 に答える 15

2548

バグ修正ブランチが呼び出され、それを次bugfixのようにマージするとしmasterます。

git checkout master
git merge --squash bugfix
git commit

これにより、ブランチからすべてのコミットが取得bugfixされ、それらが1つのコミットに押しつぶされて、ブランチとマージされますmaster


説明

git checkout master

masterブランチに切り替えます。

git merge --squash bugfix

ブランチからすべてのコミットを取得bugfixし、現在のブランチとの1つのコミットのためにグループ化します。
(マージコミットは表示されません。コミットを実行する前に手動で競合を解決できます)

git commit

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

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

于 2011-03-15T08:16:45.477 に答える
168

最終的に私にとってこれをクリアしたのは、次のことを示すコメントでした。

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つにまとめたいgit rebase -i origin/master場合、中間コミット(または少なくともgitはそれ自体を理解できません)。を使用すると、機能ブランチ全体をマージするための1回のコミットで必要な結果が得られます。そして、私が行う必要があるのは、最大で1つの手動の競合解決だけです。git merge --squash

于 2014-08-19T15:59:21.243 に答える
109

スカッシュオプションとマージしたい。これは、一度に1つのブランチで実行する場合です。

git merge --squash feature1

単一のコミットと同時にすべてのブランチをマージする場合は、最初にインタラクティブにリベースし、各機能を押しつぶしてから、タコをマージします。

git checkout feature1
git rebase -i master

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

git checkout master
git merge feature1 feature2 feature3 ...

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

お役に立てれば

于 2011-03-15T08:08:50.217 に答える
29

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

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

代わりに、

git merge --squash newFeature && git commit

newFeatureカスタマイズ可能なすべてのブランチコミットを含むコミットメッセージが表示されます。

ここで詳しく説明します:https ://youtu.be/FQNAIacelT4

于 2017-03-17T11:10:32.003 に答える
24

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

git reset --soft HEAD^1
git commit
于 2015-03-13T17:50:29.510 に答える
17

複数のコミットを使用して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
    
于 2018-12-27T00:24:58.317 に答える
17

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

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

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

のスクリーンショット

于 2019-02-22T23:14:10.387 に答える
2

ローカルブランチをプッシュする前に押しつぶすには:

  1. まだチェックアウトされていない場合は、問題のブランチをチェックアウトして作業します。

  2. 保持したい最も古いコミットのshaを見つけます。

  3. そのコミットから新しいブランチ(tmp1)を作成/チェックアウトします。

    git checkout -b tmp1 <sha1-of-commit>

  4. 元のブランチを新しいブランチにマージします。

    git merge --squash <original branch>

  5. 要約コミットメッセージを使用して、マージによって作成された変更をコミットします。

    git commit -m <msg>

  6. 押しつぶしたい元のブランチをチェックアウトします。

    git checkout <branch>

  7. 保持したい元のコミットにリセットします。

    git reset --soft <sha1>

  8. 新しいtmp1ブランチに基づいてこのブランチをリベースします。

    git rebase tmp1

  9. 以上です。すべて問題がないことを確認したら、一時的なtmp1ブランチを削除します。

于 2020-03-30T13:07:28.857 に答える
1

Gitの場合

新しい機能を作成する

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

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

これはコミットせず、最初に確認することができます。

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

于 2017-10-05T14:33:27.247 に答える
1
git checkout YOUR_RELEASE_BRANCH
git pull
git checkout -b A_NEW_BRANCH
git merge --squash YOUR_BRANCH_WITH_MULTIPLE_COMMITS
git commit -am "squashing all commits into one"
git push --set-upstream origin A_NEW_BRANCH
于 2020-08-27T03:23:13.583 に答える
0

エラーが発生した場合:ファイルがマージされていないため、コミットできません。

git checkout master
git merge --squash bugfix
git add .
git commit -m "Message"

すべての競合ファイルを修正しました

git add . 

あなたも使うことができます

git add [filename]
于 2019-12-18T07:37:15.430 に答える
0

機能ブランチが完了し、1回のコミットでマスター、開発、またはその他のターゲットブランチにコミットする準備が整いました

  • マージブランチに移動します:git checkout master && git pull
  • クリーンなローカルマスターから作業ブランチを作成します:git checkout -b work
  • 作業中の機能ブランチをマージスカッシュします:git merge--squashyour_feature_branch。
  • デフォルトまたは新しいメッセージでコミット:git commit(特定のメッセージまたはデフォルトのメッセージで)
  • 機能ブランチに戻ります:git checkout your_feature_branch
  • 機能ブランチを作業ディレクトリにポイントします:git reset --hard work
  • 確認しますが、プッシュする準備ができています:git push -f
  • 次に、必要に応じて作業ブランチをクリーンアップします

マスターをターゲットブランチに置き換えます:開発など

  • マスターから機能ブランチへのコミット数を指定する必要はありません。Gitが世話をします*
于 2020-12-16T21:02:42.247 に答える
0

複数のコミットを行ったブランチの名前がbugfix/123と呼ばれ、これらのコミットを潰したいとします。
まず、develop(またはリポジトリの名前)から新しいブランチを作成します。新しいブランチの名前がbugfix/123_upと呼ばれていると仮定します。gitbashでこのブランチをチェックアウトしてください-

  • git fetch
  • git checkout bugfix / 123_up
  • git merge bugfix / 123 --squash
  • git commit-m"あなたのメッセージ"
  • git push origin bugfix / 123_up

これで、このブランチには、すべての変更を含むコミットが1つだけあります。

于 2021-02-09T14:23:50.700 に答える
-1

私が作成したツールgit-squashを使用して、このプロセスを簡単にすることができます。たとえば、マスターブランチから分岐した機能ブランチのすべてのコミットを潰すには、次のように記述します。

git squash master
git push --force
于 2020-06-01T19:37:50.157 に答える
-1

使用する

git status 

何が起こっているかを確認します。

それで

git checkout master 
git merge --squash bugfix
git add (add which files you want or use wildcard command like ".")

それで

git commit -m "message"

そして今、最後になりましたが、少なくとも

git push -u origin master

ここoriginにあなたが好む他のリモートがあります。

于 2020-08-19T10:28:50.413 に答える