新しいコードに取り組んでいる間、変更を追跡するために多くの小さなコミットを行います。ただし、私の会社では、各機能を 1 回のコミットとしてコミットすることを好みます。したがって、解決策は、(ローカル) ブランチ全体を単一のコミットに押しつぶすことです。
すべてのコミットを使用git rebase --interactive
して変更せずにブランチ全体をスカッシュするにはどうすればよいですか?pick
squash
新しいコードに取り組んでいる間、変更を追跡するために多くの小さなコミットを行います。ただし、私の会社では、各機能を 1 回のコミットとしてコミットすることを好みます。したがって、解決策は、(ローカル) ブランチ全体を単一のコミットに押しつぶすことです。
すべてのコミットを使用git rebase --interactive
して変更せずにブランチ全体をスカッシュするにはどうすればよいですか?pick
squash
私の好みの方法は、2 ライナーです (以下のステップ 1 と 4 を除く)。利点は、コミット ID を知る/記録する必要がないこと、関連するすべてのステップを実行するための単純なエイリアスを作成できること、実際にブランチ全体をorigin /master に移動して master への実際のマージを高速化できることです。 -forward であり、競合が発生することはありません。
まず、私の仮定:
my-feature-branch
。master
このブランチは、いくつかのコミットによって分岐しています。これはチェックアウトされたブランチです。master
トラックのリモート ブランチorigin/master
my-feature-branch
の現在の状態の上にある単一のコミットにすべてのコミットを押しつぶしたい(ローカルではなく、古い可能性があります)master
git reset --hard
) 。私のプロセスは次のとおりです。
フェッチ、origin/master
現在のものです:
$ git fetch
を指すようにリセットして、ローカル ブランチのすべてのコミットを破棄します。origin/master
$ git reset --mixed origin/master
ブランチの以前の状態からのすべての古い変更をインデックスにマージします
$ git merge --squash HEAD@{1}
変更をコミットする - Git は、押しつぶされたコミットからのすべてのコミット メッセージを含むコミット メッセージをエディターに事前入力します。
私が言及した単純なエイリアスは次のようになります。
alias squash="git fetch; git reset --mixed origin/master; git merge --squash HEAD@{1}"
ブランチを開始する直前にコミットのハッシュを見つけて、クリップボードにコピーします。次に、そのハッシュにリセットします。
$ git reset [hash]
次に、単一のメッセージで変更を再追加して再コミットします。
$ git add -A
$ git commit -m 'EVERYTHING SQUASHED'
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
これがこの質問に対する正しい答えだとは思いません。
しかし、私は通常、次のコマンドを使用してリモートのアップストリーム マスターにプル リクエストを送信する前に、自分のブランチをスカッシュします。
git rebase -i master
ただし、選択してスカッシュするものを選択する必要があります。