回答:
少しの間、HEAD
コミットに何かを追加するふりをしましょう。例では、「2番目のコミットB」です。
上のコミットポップアップにcは、バインディング「a修正」があります。そのキーを押すと、HEAD
コミットに対する段階的な変更が「修正」されます。Gitではコミットは変更できないため、実際には古いコミットが新しいコミットに置き換えられます。古いコミットメッセージのあるバッファがポップアップ表示されるため、追加した変更でメッセージの調整が必要になった場合に変更できます。いつものように、C-c C-cメッセージの編集が終了したらを押します。これはgit commit --amend
、コマンドラインで実行するのと同じです。
HEAD
てコミットメッセージや編集を多くの場合、変更またはメッセージを調整するだけでよいため、Magitには次の2つのバリエーションがあります。
HEAD
コミットメッセージを編集せずに段階的な変更を追加しますHEAD
段階的な変更を追加せずにメッセージを変更しますでないコミットを編集するHEAD
場合、上記は機能しません。これらのコマンドは、HEAD
コミットを常に「変更」(置換)します。Gitはコミットを変更するための単一のコマンドを提供しませんHEAD
が、これはもう少し複雑です。
Magit はそのようなコマンドを提供しますが、複数のステップでこれを行うことが望ましい状況があるため、最初にそれについて説明します。
コミット以外の変更は、HEAD
3つのステップに分割できます。
A
)を作成しHEAD
ます。HEAD
(上記のように)変更して、commitを作成しA'
ます。A
が、の上A'
。これは、インタラクティブなリベースを使用して実行できます。タイプrして、リベースポップアップを表示します。次にm、「コミットの編集」リベースバリアントを呼び出すために入力します。最近のコミットを含むバッファが表示されます。変更するコミットに移動し、入力C-c C-cして選択します。その後、Gitはそのコミットに履歴を巻き戻し、進行中のリベースに関する情報をステータスバッファーに表示します。
HEAD
上記のように変更します。次に、を入力して完了したことをGitに伝えますr r。競合が発生した場合A'
、B
リベースは停止しB
、競合を解決する必要があります。完了したら、を押しr rて続行します。
への変更がA
と競合することがわかっているB
場合は、上記の手順に従ってください。それ以外の場合は、次のアプローチを使用してください。
Gitでは、を使用して「修正コミット」を作成できますgit commit --fixup A
。これにより、新しいコミットが作成され、「別のコミットで行われたはずの」変更が記録されます。そのコミットは新しいものになりHEAD
ます。--squash
バリアントも存在します。違いについては、git-commit
manページを参照してください。
A
コミットと新しいコミットを実際に組み合わせて、その上にA'
再適用するB
には、リベースを使用する必要があります。Magitはそうするための便利なコマンドを提供しr fます。
上記のアプローチとの主な違いは、ここでは最初に新しいコミットを作成し、次にそれを「ターゲット」と組み合わせて再適用するためにリベースすることですB
。上記では、コミットする代わりにリベースすることから始めました。
Magitでは両方--fixup
と--squash
変異体はより入手可能である上、ポップアップをコミットfしてs。しかしMagitもの「インスタント」フィックスアップの変種とスカッシュのコマンドを提供FしてS。これらのバリアントは、「非インスタント」バリアントのような新しいコミットを作成しますが、別のコマンドを呼び出さなくても、rebaseを使用してフィックスアップコミットとターゲットコミットを即座に結合します。
「インスタントフィックスアップは、」( c F)は、本質的に「延長と同じものであるHEAD
(」c e)、任意のコミットのためにそれだけではなく、働くことを除いてHEAD
。
参考文献:
git-commit(1)
git-rebase(1)
git-commit
git-rebase(1)
これらの行があるmanページのリダイレクト:折り畳まれたコミットの推奨コミットメッセージは、最初のコミットのコミットメッセージと「squash」コマンドのコミットメッセージの連結ですが、「fixup」のコミットのコミットメッセージは省略します。コマンド。IOW、前回のコミットのコードを修正したい場合はfixupを使用し、コミットメッセージも修正したい場合はsquashを使用します。
したがって、1つのワークフローは次のとおりです。
それから
自動スカッシュは、すべての!fixupコミットを自動的に適切な場所に移動し、リベースでスカッシュされるように設定します。
i
は私をもたらしますCannot rebase: Your index contains uncommitted changes. Please commit or stash them.
。ただし、コミットされていない変更はありません。:/
Proceed despite merge in rebase range? [c]ontinue, [s]elect other, [a]bort
。私の修正が今後のマージでうんざりする可能性があることを教えようとしていますか?
merge in rebase
:、を参照してくださいgit help rebase
。アップストリームをプルする前に修正を行うことをお勧めします。