21

新しいコードに取り組んでいる間、変更を追跡するために多くの小さなコミットを行います。ただし、私の会社では、各機能を 1 回のコミットとしてコミットすることを好みます。したがって、解決策は、(ローカル) ブランチ全体を単一のコミットに押しつぶすことです。

すべてのコミットを使用git rebase --interactiveして変更せずにブランチ全体をスカッシュするにはどうすればよいですか?picksquash

4

7 に答える 7

18

私の好みの方法は、2 ライナーです (以下のステップ 1 と 4 を除く)。利点は、コミット ID を知る/記録する必要がないこと、関連するすべてのステップを実行するための単純なエイリアスを作成できること、実際にブランチ全体をorigin /master に移動して master への実際のマージを高速化できることです。 -forward であり、競合が発生することはありません。

まず、私の仮定:

  • あなたは というブランチで作業していますmy-feature-branchmasterこのブランチは、いくつかのコミットによって分岐しています。これはチェックアウトされたブランチです。
  • ローカルmasterトラックのリモート ブランチorigin/master
  • オリジン/マスターmy-feature-branchの現在の状態の上にある単一のコミットにすべてのコミットを押しつぶしたい(ローカルではなく、古い可能性があります)master
  • すべての変更がコミットされました。ステージングされていない変更はありません (変更中に失われますgit reset --hard) 。

私のプロセスは次のとおりです。

  1. フェッチ、origin/master現在のものです:

    $ git fetch
    
  2. を指すようにリセットして、ローカル ブランチのすべてのコミットを破棄します。origin/master

    $ git reset --mixed origin/master
    
  3. ブランチの以前の状態からのすべての古い変更をインデックスにマージします

    $ git merge --squash HEAD@{1}
    
  4. 変更をコミットする - Git は、押しつぶされたコミットからのすべてのコミット メッセージを含むコミット メッセージをエディターに事前入力します。

私が言及した単純なエイリアスは次のようになります。

alias squash="git fetch; git reset --mixed origin/master; git merge --squash HEAD@{1}"
于 2014-12-29T23:26:18.547 に答える
6

ブランチを開始する直前にコミットのハッシュを見つけて、クリップボードにコピーします。次に、そのハッシュにリセットします。

$ git reset [hash]

次に、単一のメッセージで変更を再追加して再コミットします。

$ git add -A
$ git commit -m 'EVERYTHING SQUASHED'
于 2014-12-29T23:08:37.597 に答える
2

git 構成ファイル~/.gitconfigを編集し、エイリアス セクションに以下を追加します。

[alias]
    squash = "!f(){ CUR=`git rev-parse HEAD` && git reset --soft ${1} && git commit -m \"$(git log --format=%B ${1}..${CUR})\"; };f"

このエイリアスは現在の HEAD コミット ハッシュを取得し、指定したコミットにリセットして、すべてのコミット メッセージを保持する新しいコミットを作成します。

使用法:

git squash <refspec>

refspec は、コミット ハッシュ、ブランチ名、タグ名、HEAD^ HEAD~3

于 2014-12-29T17:24:33.850 に答える
0

これがこの質問に対する正しい答えだとは思いません。

しかし、私は通常、次のコマンドを使用してリモートのアップストリーム マスターにプル リクエストを送信する前に、自分のブランチをスカッシュします。

git rebase -i master

ただし、選択してスカッシュするものを選択する必要があります。

于 2015-11-08T08:40:47.657 に答える