web-dev-qa-db-ja.com

Gitは、競合することなくブランチ内のすべてのコミットを押しつぶします

私たちの一般的な開発ワークフローは、ブランチbをチェックアウトし、それに束をコミットしてから、それらすべてのコミットを1つにまとめることです(まだbにあります)。

ただし、すべてのコミットを潰すためのrebase -iプロセス中に、複数のステップで競合が頻繁に発生します。

基本的に、ブランチをbでの最終コミット時のリポジトリの状態を表す1つのコミットに変更したい

いくつか検索しましたが、探しているものが正確に見つかりませんでした。マージする前に押しつぶされた機能ブランチをテストしたいので、merge --squashはしたくありません。

31
Andy Ray

コミット情報が必要ない場合は、ソフトリセットを実行できます。その後、ファイルはそのまま残り、コミットすると、このコミットはリセットしたコミットの上になります。

リセットするコミットを見つけるには:

git merge-base HEAD BRANCH_YOU_BRANCHED_FROM

次に

git reset --soft COMMIT_HASH

次に、コミットを作り直します。おそらく次のようになります。

git commit -am 'This is the new re-created one commit'

これはRasmusからの回答に似ていますが、常に機能する3つのステップに分かれています。

$ git merge feature1
$ git reset --soft HEAD@{1}
$ git commit -c feature1

説明:

  1. 競合をマージして解決する
  2. 変更を段階的に維持しますが、古いヘッドにリセットします
  3. 機能ブランチの最新のコミットからのコミットメッセージと作成者を使用して、すべての変更をコミットします
5
ColinM