Git / Gitエクステンションの「スカッシュ」と「フィックスアップ」の違いは何ですか?


111

私はしばらくの間Git Extensionsを使用しています(それは素晴らしいです!)が、以下に対する簡単な答えは見つかりませんでした。

時々、コミットメッセージをタイプするとき、タイプミスをします。私の友人は次の方法でそれを修正する方法を教えてくれました(Gitエクステンション):

コミットを右クリック>詳細設定>修正コミット

ここに画像の説明を入力してください

次に、「修正」チェックボックスをオンにして、メッセージと出来上がりを書き換えます!私のコミットメッセージは修正されました。

しかし、この他のオプション「スカッシュコミット」...私はいつもそれが何をするのか疑問に思っていましたか?!

私の質問は:

Git / GitエクステンションでのSquashコミットFixupコミットの正確な違いは何ですか?彼らは一種の... 私に「似ている」ここに画像の説明を入力してください ここに画像の説明を入力してください

回答:


153

Git Extensionsが具体的に何を行うかはわかりませんgit rebaseが、自動的にスカッシュするか、スカッシュでコミットを修正するオプションがあります!またはフィックスアップ!それぞれプレフィックス:

   --autosquash, --no-autosquash
       When the commit log message begins with "squash! ..." (or "fixup!
       ..."), and there is a commit whose title begins with the same ...,
       automatically modify the todo list of rebase -i so that the commit
       marked for squashing comes right after the commit to be modified,
       and change the action of the moved commit from pick to squash (or
       fixup).

スカッシュとフィックスアップの違いは、リベース中に、squash操作によってfixup元のメッセージとスカッシュコミットのメッセージを組み合わせるように求められるのに対し、操作では元のメッセージが保持され、フィックスアップコミットからのメッセージが破棄されることです。


6
詳細についてrebase、Git docsでsquash / fixupを参照してください

これは素晴らしい答えです。なぜcommit commitメッセージが出るのかといつも思っていました。
jedd.ahyoung

66

簡単に言えば、一連のコミットをリベースするときに、各コミットがとしてマークされるとsquash、そのメッセージをpickまたはrewordコミットメッセージの一部として使用する機会が与えられます。

fixupそのコミットからのメッセージを使用すると、破棄されます。


その間どのメッセージが保持されfixupますか?
IgorGanapolsky

2
@IgorGanapolsky gitツリーの次のコミットからのメッセージ。基本的に、コミットを「マージ」します。
アレクサンダーハロルドダロシャ

15

以下からのgit-リベースDOC、「対話モード」セクション

2つ以上のコミットを1つにまとめたい場合は、2番目以降のコミットの「pick」コマンドを「squash」または「fixup」に置き換えます。コミットの作成者が異なる場合、折りたたまれたコミットは最初のコミットの作成者に帰属します。折りたたまれたコミットの推奨コミットメッセージは、最初のコミットのコミットメッセージと「squash」コマンドのコミットメッセージを連結したものですが、「fixup」コマンドのコミットのコミットメッセージは省略しています。


13

場合質問は違い何であるsquashfixupやったときにgitではgitのリベース--interactiveを、その答えはコミットメッセージ

s, squash <commit> =コミットを使用しますが、以前のコミットにマージします

f, fixup <commit>=「スカッシュ」に似ていますが、このコミットのログメッセージを破棄します


例えば:

pick 22a4667 father commit message
squash 46d7c0d child commit message # case 1
# fixup 46d7c0d child commit message # case 2

ケース1でリベースした後のコミットメッセージは次のようになります。

father commit message

child commit message

一方、ケース2のコミットメッセージは次のとおりです。

father commit message
# no sub messages

1

私はgit拡張をいじってみましたが、多くのコミットを1つにまとめることができませんでした。それを行うには、コマンドラインに頼らなければならず、この投稿は役に立ちました

git rebase -i Head~2

これはインタラクティブなリベースであり、次の点に注意してください。

  • 〜2は、現在のヘッドを含め、この操作に関与させたいコミットの数を示します
  • その後のインタラクティブな編集ウィンドウを編集し、最初の項目を「選択」のままにして、後続の行を「スカッシュ」に置き換える必要があります。上のリンクの手順は、これが不透明である場合、より明確になります。

リンク先の投稿は、スカッシュとフィックスアップについて私が見た中で最も明確な説明です。ありがとう!
Simon Tewsi、

0

どうしてgitに聞いてみませんか?でリベースするとgit-bash、次のようになります。

pick 512b1d7 (some comment)
# Rebase 621b2e4..512b1d7 onto 621b2e4 (1 command)
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command> = run command (the rest of the line) using shell
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# These lines can be re-ordered; they are executed from top to bottom.
#
# If you remove a line here THAT COMMIT WILL BE LOST.
D:/code/fenixito-legacy-api/.git/rebase-merge/git-rebase-todo [unix] (11:57 23/10/2019)                                         1,1 start
"D:/code/xxx/.git/rebase-merge/git-rebase-todo" [UNIX] 27L, 1170C

ご覧のように:

s、squash =コミットを使用しますが、以前のコミットにマージします

f、fixup = "squash"に似ていますが、このコミットのログメッセージを破棄します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.