あなたが望むものを得ることはできませんが、あなたがすることはうまくいくかもしれません。
Gitでは、「スカッシュ」は「コピー」を意味します。より具体的には、「squash merge」は、というマージアクションマージ(動詞としてという単語)を実行するGitのマージ機構を使用しますが、通常のコミットを行います。 ;およびいくつかのコミットが両方の上にある
C3--C6 <-- feature
/
C1
\
C2--C5 <-- master
(master
またはfeature
などの支店名が実際すなわち先端はブランチのコミット、コミットだけを指していることに注意してください:たとえば、あなたがこれを持っていた、と仮定C1
などのブランチ)。 git checkout master && git merge --squash feature
を実行すると、その後になります。
- は枝のコミット共有最後の場所として
C1
を選択してください。
- 現在のブランチの先端に
C5
を選択してください。master
;
feature
の先端にC6
を選択してください。
これらは、マージ処理(「マージ」を動詞として使用)への入力です。次に、Gitはします:
- は
C1
C5
対比較:これは "私たちは何が変更されたか" です。
- と比較してください。
C1
とC6
:これは「変更されたもの」です。
Gitは両方の変更セットを結合しようとします。すべてがうまくいけば、結果はインデックスと作業ツリーに置かれます(コミットのためにステージングされます)。 --squash
を使って自動的に--no-commit
を有効にしたので、Gitはコミットすることなくこの時点で停止しますが、あらかじめロードされたコミットメッセージを作成します。
あなたは今普通は(マージコミット-これはない単語を使用していますコミットのタイプを記述する、形容詞としてをマージ)コミットせた、git commit
を実行することができます。それは普通のコミットしたいだけで何のようになります。
C3--C6 <-- feature
/
C1
\
C2--C5--C7_which_is_3_plus_6 <-- master (HEAD)
この時点でブランチ名feature
を行うための唯一の賢明なことは、それを削除され、元を放棄することはC3
とC6
(彼らは最終的に意志、あるいはおそらく非常にコミットすぐに、ガベージコレクションされます:ブランチを削除すると、ブランチを保護するブランチのreflogも削除されます)。
(true
にmerge.log
を設定するかである数C7
のログメッセージは、あなたがそれになりたいものですが、あなたはGitリポジトリの構成方法に応じて、あなたはそれがC3
とC6
から既存のログ・メッセージを組み合わせることをデフォルトに取得することができます2以上、または--log
を使用してください)。新しいは、元C3
とC6
(マイナスすでにC5
によって複製何も)で行われたものを取ることC7
をコミット
注意。おそらく、このように完全にfeature
を削除しても安全です。
残念ながら、それはあなたが持っているものではありません。あなたは既にマージは、あなたが描いたグラフを与え、feature
の先端から到達可能なコミットがあります
feature
と
master
のマージベースが今
C3--C4--C6 <-- feature
//
C1--C2--C5 <-- master
、C1
をコミットするのではなく、C2
をコミットしていません。これは、master
から開始し、逆方向に作業すると、C5
、次にC2
、次にC1
となります。 feature
から開始して後方に進むと、C6
、次にC4
、次にC3
とC2
の両方が同時に検出されます。 C1
。
これは、C2
ではなく、C1
が、両方のブランチにある両方のブランチのヒントに対して最も近いコミットであることを意味します。その後、master
にするときgit merge --squash
をします使用:
- デフ
C2
C5
VS:私たちは何が変更されましたか。
- diff
C2
対C6
:変更内容
- 変更を組み合わせて、あなたは、新しいが
C7
をコミットすることができますによる暗黙の--no-commit
に停止:
C3--C4--C6 <-- feature
//
C1--C2--C5----C7 <-- master
ここでも、feature
で行う唯一の賢明なことは、それを削除することです。結果はシーケンス...--C1--C2--C5--C7
になります。 これは前とコミットのと同じ順序で、そしてより重要なのは、C7
に関連したツリー(ソースの内容が)限りC4
自体はevil mergeないよう、あなたがC4
せずに取得したいツリーと同じである必要がありますC6
はC4
の部分を元に戻しません。
C4
には、C3
からの変更が含まれており、明らかにC6
には、C6
の変更が含まれているためです。これは、Gitがgit diff C2 C6
を実行したときに、C3
とC6
の両方の変更が見られたことを示しています。これらは、動詞としてのマージの2つの入力の1つの一部です。したがって、新しいC7
には、必要な変更がすべて含まれています。
はそれががが--log
とmerge.log
設定によっては、持っていない何、ログメッセージの自動集団です。しかし、C7
のログメッセージは、C1
のような前回のコミットを見つけたり、git log --pretty=short --no-merges <hash>..feature
を使って好きなように編集することができます。