git:メッセージの入力中にコミットを中止する


131

私はコミットの最中です。コミットメッセージをvimに入力しました。今、何かを変える必要があることを思い出しました。私がやりたいことを達成する他のオプションがあることを理解していますが、コミットを中止する方法があるかどうかを知りながら、これまでに入力したコミットメッセージを保存します。

回答:


85

はい。コミットメッセージを別のファイルに書き込みます(:w /some/other/path.txt)。次に、保存せずにエディターを終了し:q!ます()。以前にファイルを元のパスに保存した場合は、すべてを削除し、空のファイルを最初に書き込みます(空のコミットメッセージはコミットを中止します)。

ここで、「実際に」コミットする準備ができたら、代替パスに保存したメッセージファイルを使用します。

または、コミットメッセージをvimのバッファの1つにコピーします。

あなたが本当にこれをする必要がないこと注目に値しcommit --amendます:コミットが行われた後にコミットを変更することができますので、簡単な解決策はあなたが得たものでコミットを生成し、プッシュする前にそれを修正することです。壊れた状態でコミットを完了しreset HEAD~(作業コピーがコミット前の状態にリセット)、作業コピーを修正してcommit -a -c HEAD@{1}から、古いコミットメッセージを使用することもできます。


7
注:「:q!」を使用してvimを終了する 自動入力されたマージ競合メッセージがある場合、コミットを中止しません。代わりに、コミットは続行され、メッセージには競合があったファイルはリストされません。
stephenbez 2016年

write the empty file (an empty commit message will abort the commit)一部は魅力のように働きました、ありがとう!
СашаДавиденко

182

エディターがエラーコードで終了できる場合-Gitはコミットを中止します。VIMを使用する場合は、次のように入力します。

:cq

ゼロ以外のエラーコードで終了し、コミットを中止します。


5
これはcommit --amend、既存のコミットメッセージとを削除する必要がある場合と同様に、を中止するための優れたトリックです:wq
Alex Jasmin、2015年

2
ナイストリック!ただし、問題は、コミットメッセージを削除するのではなく、保存する方法でした。
Elijah Lynn

それで、svnはこれをどのように管理しますか?終了コード以外に何を見ているのですか?
Chaim Geretz、2016年

1
インタラクティブなリベース、
つまり

リベース中ではgit commit --amendなく私がやったときに私の命を救ったgit rebase --continue
Weishi Zeng 2018

68

コミットメッセージを書き込むためにvimを開いている場合は、で始まらない行を削除するだけで、gitはコミットを中止します

Aborting commit due to empty commit message.

11
これは、git commit --amendを中止したい場合に特に便利です。
edsko 2014

1
問題は、コミットを中止して、コミットメッセージを保存する方法でした。#で始まらない行を削除すると、コミットメッセージは削除されますが、コミットメッセージは保存されません。これが非常に多くの賛成票を持っているかわかりません。
Elijah Lynn

2
ggdGメッセージのすべてのコンテンツを切り取り、次に実行したvimときにP、以前に切り取ったテキストだけを表示できます。
oromoiluig

nanoを使用して動作し、すべての行をctrl + kすると、保存して終了します
Juh_

9

コミットを中止することもできますが、別の方法として、後でコミットを修正することもできます。現在の作業をコミットしてから、必要な変更を加えgit addてから、実行しgit commit --amendます。コミットメッセージエディターに戻ります。保存すると、追加の変更と新しいコミットメッセージが含まれるようにコミットが修正されます。


7

はい、可能です。コミットするには、エディターはコミットメッセージをファイルに書き込み、.git/COMMIT_EDITMSGステータスコード0で終了する必要があります。

したがって、VI / VIMを使用している場合は、次のことを実行することをお勧めします...

  1. コミットメッセージを書いてください。
  2. でコミットメッセージを保存します:w(デフォルトでは現在のコンテンツがに保存されます.git/COMMIT_EDITMSG
  3. エラーでエディターを終了します :cq
  4. ...あなたがしなければならないことをしてください...ステージングエリアへのファイルの追加/削除さえも。
  5. 既存のコミットメッセージの編集を続行します git commit -eF .git/COMMIT_MESSAGE

-F /path/to/file/パス/に/ファイル任意のコンテンツを持つエディタを移入します。ただし、デフォルトで-e編集用のフラグを追加しない限り、これは即座にコミットを実行します。


これは機能しますが、1)CWDが.gitフォルダーがある場所を想定しているため2)git worktreesを使用しており、git worktreesでは、.gitは実際の.gitフォルダーがある場所を示すファイルです。
Alexander Bird

@AlexanderBirdこれは真実ではありません...手順5)で古いコミットメッセージを取得したい場合は、次のように相対パス(/foo/bar/プロジェクトのルートからの相対パスなど)を指定するだけです。git commit -eF ../../.git/COMMIT_MESSAGE
Rudolf Tucek 2017年

@AlexanderBirdクール、gitの複数の作業ツリーの機能でまだ気づいていません。ヒントのTHX!これの唯一の欠点は、一般的な概要を頭に置いておく必要があるため、実際のコードに集中できないことです。そして、「私がやめたところ」のコミットメッセージをピックアップするためだけに、それは少し重いです:)
ルドルフ・トゥセク

1
@AlexanderBirdは、:wdo :sav committmpand ではなくgit commit -eF committmp
Hashbrown

0

私は通常、IntelliJ提供された端末を使用してコミットを行います。残念ながら私のコミットは手動です:

git commit -m'my message' // etc

したがって、安全だと私が思う唯一のことは、ターミナルウィンドウを閉じることだけです。保存する場合はテキストをハイライトし、コピーしてターミナルウィンドウを閉じます。


-2

@bdonlanの回答はこの質問そのものに適していますが、より良い解決策が必要となる状況を指摘しておきます。

最後のコミットに変更を加えたいとしましょう。だからあなたは@bdolanが示唆したように行います:

git add files
git commit --amend

新しいメッセージの書き込み中に、それらのファイルをそのコミットに追加したことを後悔していると想像してください。問題はすでに保存されたコミットメッセージでスタックしてて、エディターを終了すると(保存の有無にかかわらず)、それらの変更が最後のコミットに追加されます。これらのアクションの前の状態に戻すには、最後のコミット分割する必要があります-避けたいと思います。

トリックは、エディターで保存し、エディターを終了することです。エディターには、行が1行だけある#か、行がまったくありません。終了すると、次のメッセージが表示されます。

Aborting commit due to empty commit message.

そして、あなたは最後のコミットをまったく変更していません。


あなたの言っていることが問題であると私が理解した場合、あなたは正しくありません。ここに示すように:git commit; vim ....; git commit --amend; git reset HEAD@{1}。つまり、修正を「取り消す」場合、以前のコミットを分割する必要ありませ。修正前にHEADであったコミットオブジェクトはとして保存されHEAD@{1}ます。また、ゼッタはすでにすべての非コメント行を削除することを提案しました。
Alexander Bird
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.