既存のプッシュされていないコミットメッセージを変更する方法


7664

コミットメッセージに間違ったものを書いた。

メッセージを変更するにはどうすればよいですか?コミットはまだプッシュされていません。


868
gitにやや初心者のために:ローリーがまだプッシュしていないという点は重要です。リベースのように、これは歴史を変えています。誰かが元の履歴と書き換えられた履歴の間にあるレポからクローン/プルした場合、(そのブランチの)書き換え後にプルすることはできません。
Pat Notz

回答:


16132

最新のコミットメッセージの修正

git commit --amend

エディタが開き、最新のコミットのコミットメッセージを変更できます。さらに、次のコマンドを使用して、コマンドラインで直接コミットメッセージを設定できます。

git commit --amend -m "New commit message"

…ただし、これにより、複数行のコミットメッセージや小さな修正を入力するのが面倒になります。

これを行う前にステージングされた作業コピーの変更がないことを確認してください。そうしないと、変更がコミットされます。(ステージングされていない変更はコミットされません。)

すでにリモートブランチにプッシュしたコミットのメッセージを変更する

すでにコミットをリモートブランチにプッシュしている場合は、(上記のように)コミットをローカルで修正した後、次のコマンドを使用してコミットを強制的にプッシュする必要があります。

git push <remote> <branch> --force
# Or
git push <remote> <branch> -f

警告:force-pushingは、リモートブランチをローカルブランチの状態で上書きします。ローカルブランチにないコミットがリモートブランチにある場合、それらのコミット失われます。

警告:すでに他の人と共有しているコミットの修正には注意してください。コミットを改正することは、本質的に書き換え、それらが異なる持っているSHA他の人が昔のコピーは、あなたが書き換えられたことをコミットしている場合は問題となるIDを、。古いコミットのコピーを持っている人は、新しく書き直されたコミットと作業を同期する必要があります。これは時々難しい場合があるため、共有コミット履歴を書き直そうとするときは他の人と調整するようにしてください。完全に。


インタラクティブなリベースを実行する

別のオプションは、インタラクティブなリベースを使用することです。これにより、最新のメッセージでなくても、更新するメッセージを編集できます。

Gitスカッシュを実行するには、次の手順に従います。

// n is the number of commits up to the last commit you want to be able to edit
git rebase -i HEAD~n

コミットを破棄したらe/r、メッセージを編集するためにを選択します。

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

インタラクティブリベースに関する重要な注意事項

あなたが使用している場合git rebase -i HEAD~nがあることができ、より以上のnコミット。Gitは最後のn個のコミットのすべてのコミットを「収集」し、その範囲の間にどこかでマージがあった場合、すべてのコミットも表示されるため、結果はn +になります。

良いヒント:

複数のブランチでこれを行う必要があり、コンテンツを修正するときに競合が発生する可能性がある場合は、セットアップしgit rerereてGitにそれらの競合を自動的に解決させます。


ドキュメンテーション


257
ただしgit commit --amend、ほど強力ではありませんgit rebase -i
Jeffrey Jose

76
@jeffjose、それは間違いなく必要はありません。また、git commit --amend(a?)マスターコミットを修正できます。
ストレッジャー2010

116
すでにプッシュした場合は、もう一度プッシュを強制:git push -f origin branchname
ヒューズ

177
git push -f他の人が同じリポジトリを使用している場合、@ hughesは少し危険ではありませんか?
Armand

91
コミットメッセージ全体を書き直したくない場合は、に進んでくださいgit commit --amend -c HEAD。これにより、古いコミットメッセージが事前に入力されたエディターが開き、変更できます。
サム

2506
git commit --amend -m "your new message"

7
私はgit commit --amend -m「新しいメッセージ」を実行しましたが、Githubにプッシュすると、「プッシュする前にリモートの変更をマージする」が生成されました。プルした後、-amendをコミットし、再度プッシュすると、新しいメッセージは表示されません。代わりに「github.com:[myrepo]のマージブランチ「マスター」」を持っています
Dave Everitt

8
@DaveEverittはおそらく、修正を試みる前にコミットを上流にプッシュしました。
–ThorbjørnRavn Andersen 2013

12
@Kyralessaは真実ではありません。bashでは、完了するまで引用符を閉じない(引用符内の各行の最後でreturnを押す)ことで、複数行のコミットメッセージを簡単に作成できます。
ホブ2013年

32
2年前に作成された回答の主なアイデアによく似た回答がどのように表示されるのかわかりません。また、承認された回答は非常に多くの票を獲得します。奇妙な。(答えに問題はありません)
ハッピーコーダー

7
@AmalMurali、まあ。私のポイントは、質問の人気や回答の有用性についてではありませんでした。しかし、この特定の回答は最も古い回答ではなく、受け入れられた回答に対するさらなる洞察も提供していません。受け入れられた回答のセクションのコピーのようです。それが私のポイントでした。乾杯!
ハッピーコーダー

2376

修正したいコミットが最新のものではない場合:

  1. git rebase --interactive $parent_of_flawed_commit

    欠陥のあるコミットをいくつか修正したい場合は、最も古いコミットの親を渡します。

  2. エディターが表示され、指定したコミット以降のすべてのコミットのリストが表示されます。

    1. 修正したいコミットの前pickreword(またはGitの古いバージョンではedit)に変更します。
    2. 保存すると、Gitはリストされたコミットを再生します。

  3. 書き直したいコミットごとに、Gitはエディターにドロップします。編集するコミットごとに、Gitはシェルにドロップします。シェルにいる場合:

    1. 好きなようにコミットを変更してください。
    2. git commit --amend
    3. git rebase --continue

このシーケンスのほとんどは、さまざまなコマンドの出力に応じて説明されます。それは非常に簡単です; 覚える必要はありません– git rebase --interactiveコミットがどれだけ前でもコミットを修正できることを覚えておいてください。


すでにプッシュしたコミットを変更したくないことに注意してください。あるいは、そうするかもしれませんが、その場合は、コミットをプルしてその上で作業を行った可能性のあるすべての人と通信するように細心の注意を払う必要があります。公開されたブランチに誰かがリベースまたはリセットをプッシュした後、どのように回復/再同期しますか?


39
最初のコミット(親がない)のメッセージを変更できますか?
13ren

27
これは他の回答の1つで言及されていますが、ここでメモしておきます。git 1.6.6以降ではreword、代わりにpickを使用してログメッセージを編集できます。
MitMaro 2010年

89
なお、$parent_of_flawed_commitと同等$flawed_commit^です。
Peeja 2010年

67
すでにアップストリームにプッシュしている場合は、決してこれを行わないでください(または一般にリベースしてください)。
Daniel Rinser、

20
不完全なコミットの後にマージがあった場合は-p--preserve-merges)を使用します。
2012年

778

以前のコミットを修正するには、必要な変更を行い、それらの変更をステージングしてから、実行します

git commit --amend

これにより、新しいコミットメッセージを表すファイルがテキストエディターで開きます。最初は、古いコミットメッセージのテキストが入力されています。必要に応じてコミットメッセージを変更し、ファイルを保存してエディタを終了して終了します。

以前のコミットを修正して同じログメッセージを保持するには、次を実行します。

git commit --amend -C HEAD

以前のコミットを完全に削除して修正するには、次のコマンドを実行します。

git reset --hard HEAD^

複数のコミットメッセージを編集したい場合は、

git rebase -i HEAD~commit_count

commit_countを編集するコミットの数で置き換えます。)このコマンドはエディターを起動します。最初のコミット(変更するコミット)を「選択」ではなく「編集」としてマークし、保存してエディターを終了します。コミットする変更を行ってから実行します

git commit --amend
git rebase --continue

注:で開いたエディタから「必要な変更を加える」こともできます git commit --amend


18
git rebase -i HEAD~commit_countまた、選択したコミット数に関係なく、コミットメッセージを変更できます。選択したコミットを「ピック」ではなく「リワード」としてマークするだけです。
ジョー

2
リベースしたくない場合はどうなりますか?古いメッセージを変更したいだけですか?
SuperUberDuper

3
git reset --hardコミットされていない変更を破棄します。に置き換え--hardてください--soft
eel ghEEz 2018

1
同意することgit reset --hardは、完全に正当なコマンドですが、質問を考えると誤解を招きます。--hard破棄したい変更をコミットした場合に使用し、コミットメッセージにタイプミスをした場合は使用しません。
Soren Bjornstad

398

すでに述べgit commit --amendたように、最後のコミットを上書きする方法です。注:ファイル上書きする場合、コマンドは次のようになります。

git commit -a --amend -m "My new commit message"

4
そして、あなたはすべてのものを追加したくない場合は、あなたが最初に行うことができますgit add file.extちょうどそのgit commit --amend
MalcolmOcean

358

git filter-branchそのためにも使用できます。

git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD

些細なことほど簡単ではありませんgit commit --amendが、誤ったコミットメッセージの後に既にマージがある場合は特に便利です。

これは、と欠陥のあるコミットの間のすべてのコミットを書き換えようとするHEADので、msg-filterコマンドを非常に賢く選択する必要があることに注意してください;-)


4
正規表現が何も見つからない場合にコミットを変更しないこのバージョンはありますか?
sjakubowski 2013年

3
AFAIK filter-branch --msg-filterは、いかなる場合でも新しいコミットを生成します。ただし、ssedが成功したかどうかをmsg-filter内で確認し、フィルター分岐操作が終了したときにこの情報を使用してツリーをrefs / originalにリセットできます。
マーク・

4
@DavidHogueこれは、フィルター分岐メソッドを使用する場合にのみ当てはまります。インタラクティブなリベースを使用する場合、変更されたコミット後のコミットIDは変更されません。
マーク

6
@Markはい、彼らはそうします、彼らは義務付けられています。コミットIDは以前のコミットに依存しています。それらが変わらなければ、gitは役に立たないでしょう。
Miles Rout 2014年

2
必要$flawed_commit^..HEADではありません$flawed_commit..HEAD。manページで述べられているように:« コマンドは、コマンドラインで指定された正の参照のみを書き換えます(たとえば、a..bを渡した場合、bのみが書き換えられます)。»
アンヘル・

319

私はこの方法を好みます:

git commit --amend -c <commit ID>

それ以外の場合は、新しいコミットIDを持つ新しいコミットがあります。


7
私の場合、上記のコマンドを使用すると、実際には新しいコミットIDと、デフォルトのコミットメッセージとして「ブランチのマージ」を示す追加のコミットを使用して新しいコミットが作成されます。
1

46
修正すると、常に新しいコミットIDで新しいコミット作成されます。コミットIDは、コミットメッセージと作成/コミットされたタイムスタンプを含む、コミットの内容のSHAハッシュです。これはGitの機能であり、ハッシュの衝突がなければ、同じIDの2つのコミットがまったく同じコミットで、内容や履歴などがまったく同じです。
Emil Lundberg 2013年

7
エミールに同意する。さらに、ドキュメントを読む-すべての「-c」は、どのコミットのメッセージを新しいコミットのデフォルト/テンプレートとして使用するかをgitに指示しているようです。なので、指定する必要はありません。
Gal

2
-cいくつかのことを行います。デフォルトでは古いメッセージが使用されますが、著者情報(人物と時間)もコピーされます。-Cメッセージの編集を求めないことを除いて、同じことを行います。
ジョセフK.シュトラウス14

1
@SantanuDeyのように、私にはうまくいきませんでした。私は得ましたfatal: Option -m cannot be combined with -c/-C/-F/--fixup.
Andrew Grimm

312

Git GUIツールを使用している場合は、Amend last commitという名前のボタンがあります。そのボタンをクリックすると、最後のコミットファイルとメッセージが表示されます。そのメッセージを編集するだけで、新しいコミットメッセージでコミットできます。

または、コンソール/ターミナルから次のコマンドを使用します。

git commit -a --amend -m "My new commit message"

4
この答えは、この古いもの文字通り同じです。別の回答を提供する前に既存の回答を確認しましたか?
Dan Dascalescu、

284

Gitリベースを使用できます。たとえば、bbc643cdをコミットするように変更して戻す場合は、次を実行します。

$ git rebase bbc643cd^ --interactive

デフォルトのエディターで、コミットを変更する行の「pick」を「edit」に変更します。変更を加えてからステージングします

$ git add <filepattern>

今、あなたは使うことができます

$ git commit --amend

コミットを変更し、その後

$ git rebase --continue

前のヘッドコミットに戻ります。


1
からの変更git commit --amendが有効であることを確認したい場合はgit show、これを使用すると、新しいメッセージが表示されます。
スティーブタウバー

279
  1. 最後のコミットメッセージのみを変更する場合は、次のようにします。

    git commit --amend
    

これにより、テキストエディターが表示され、最後のコミットメッセージを変更できます。

  1. 最後の3つのコミットメッセージ、またはその時点までのいずれかのコミットメッセージを変更する場合はHEAD~3git rebase -iコマンドに次のように指定します。

    git rebase -i HEAD~3
    

6
これ以前の答えは、すでにあなたが使用できると言うgit commit --amend、それはまた、あなたが使用できると言うgit rebase -i HEAD~commit_count、あなたがしたすべてのプラグインだった3ためcommit_count

反対票も投じました。人々は単に既存の答え読むことに煩わされません。
Dan Dascalescu、

261

複数のブランチで古いコミットメッセージを変更する必要がある場合(つまり、誤ったメッセージを含むコミットが複数のブランチに存在する場合)は、以下を使用することをお勧めします。

git filter-branch -f --msg-filter \
'sed "s/<old message>/<new message>/g"' -- --all

Gitは、書き換え用の一時ディレクトリを作成し、さらに古い参照をにバックアップしrefs/original/ます。

  • -f操作の実行を強制します。これは、一時ディレクトリがすでに存在する場合、またはに格納されている参照がすでに存在する場合に必要ですrefs/original。そうでない場合は、このフラグを削除できます。

  • -- フィルターブランチオプションをリビジョンオプションから分離します。

  • --allすべてのブランチタグが確実に書き直されます。

古い参照のバックアップにより、コマンドを実行する前の状態に簡単に戻ることができます。

たとえば、マスターを回復してブランチでアクセスしたいとしますold_master

git checkout -b old_master refs/original/refs/heads/master

3
この回答はOPの質問には対応していません。彼らは、単に行ったばかりのコミットを修正することに純粋に興味があるからです。私は定期的に使用するgit commit --amendコメントを修正または私は忘れてしまったファイルを追加するgit addだけで、今まで私の前にきたgit pushエド。git filter-branchバージョン履歴を完全に変更したい場合にも使用しますが、OPはこれを望んでいないため、この回答には大きなヘルス警告が必要です-これを自宅で試さないでください、のぞき見してください!!
kbro 2013年

226

使用する

git commit --amend

それを詳細に理解するには、優れた投稿は4. Rewrite Git Historyです。また、使用しない場合 についても説明しますgit commit --amend


2
すでに公開リポジトリにプッシュされているコミットメッセージを修正する良い方法はありますか?これまでのところ、私はいったんプッシュされると、私のコミットメッセージのタイプミスとシンクが永遠に生き続けなければならないという結論に達しました。
stackunderflow 2013年

2
つまり、NOPE!あなたが押した何かを撤回する良い方法はありません。すべての撤回は多かれ少なかれ悪いです。独自のプライベートリポジトリのブランチで作業するという規律を採用し、少しずつ追加、少しテスト、微調整しながら複数のコミットを実行する必要があります。次に、ブランチ全体を単一のコミットにマージし、全体的な変更を説明する新しいコミットメッセージを書き込んで、それを校正し、プッシュします。
kbro

1
機能ブランチから戻るときに、単一のコミットを行う必要がないことは明らかです。多くの人は、ターゲットブランチをリベースして(見た目をきれいにするため)、早送りを抑制するオプションとマージします。ただし、突き上げる前に注意するという主旨に同意してください。
ShawnFumo 2013

1
git commit --amendあなたがあなたの書いた前に、答えはすでに(数回)与えられていました。もう一度投稿したのはなぜですか?「Git履歴の書き換え」へのリンクを追加する場合は、既存の回答の1つを編集するか、コメントを残しておくことができます。
Dan Dascalescu、

199

修正する

ここにはいくつかのオプションがあります。できるよ

git commit --amend

それがあなたの最後のコミットである限り。

インタラクティブなリベース

それ以外の場合、最後のコミットでない場合は、インタラクティブなリベースを実行できます。

git rebase -i [branched_from] [hash before commit]

次に、インタラクティブなリベース内で、そのコミットに編集を追加するだけです。表示されたら、a git commit --amendを実行してコミットメッセージを変更します。そのコミットポイントの前にロールバックする場合は、そのコミットを使用git reflogして削除することもできます。その後、git commitもう一度やり直します。


191

最後のコミットの場合は、コミットを修正します。

git commit --amend -o -m "New commit message"

-o--only)フラグを使用して、コミットメッセージのみを変更するようにします)


埋め込みコミットの場合は、すばらしいインタラクティブリベースを使用します。

git rebase -i @~9   # Show the last 9 commits in a text editor

必要なコミットを見つけて()に変更pickし、ファイルを保存して閉じます。できた!rreword



ミニチュアVimチュートリアル(または、8回のキーストロークでリベースする方法3jcwrEscZZ):

  • vimtutor時間があれば走る
  • hjkl 移動キーに対応
  • すべてのコマンドの前に「範囲」を付けることができます。たとえば、3j3行下に移動します
  • i 挿入モードに入る—入力したテキストはファイルに表示されます
  • EscまたはCtrlc挿入モードを終了して「通常」モードに戻る
  • u 元に戻すには
  • Ctrlr やり直す
  • dddwdlそれぞれ、ライン、単語、または文字を削除するには
  • cccwclそれぞれ、行、単語、または文字を変更する(同じddi
  • yyywylそれぞれ、(「ヤンク」)ライン、単語、または文字をコピーします
  • pまたはP現在の位置の前後にそれぞれ貼り付ける
  • :wEnter ファイルを保存(書き込み)するには
  • :q!Enter 保存せずに終了するには
  • :wqEnterまたはZZ保存して終了する

テキストを頻繁に編集する場合は、Dvorakキーボードレイアウトに切り替え、タッチ入力を学び、Vimを学びます。努力する価値はありますか?はい。



ProTip™:履歴を書き換える「危険な」コマンドを実験することを恐れないでください— Gitはデフォルトで90日間コミットを削除しません。あなたはそれらをreflogで見つけることができます:

$ git reset @~3   # Go back three commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started

* などのオプションに注意--hard--forceてください—データを破棄できます。 * また、協力しているブランチの履歴を書き換えないでください。


3
vimの部分は完全にトピックから外れており、難解なエディターの使い方を学ぶ時間を費やすようユーザーに勧める代わりに、デフォルトのgitエディターをユーザーフレンドリーなものに設定する方法など、よりトピックに沿ったものを教えてください。nano?ここでは、テキストファイルに加える必要のある些細な変更について話しているのであり、「最高の」テキストエディターについて炎上するようなハードコアコーディングではありません。
Dan Dascalescu

1
@DanDascalescu:nanoを使用して複数のリベースを実行するよりも、上記の手順を使用してVimを学習する方が速いため。gitがリベース用の独自のインターフェースではなくテキストエディターを開く理由は、Vimが存在するためです。軽量で、ほとんどのシステムにデフォルトでインストールされており、リベースを簡単に実行できるように非常に簡単に学習できddjjpZZます。Vimの基本的な知識について難解なことはありません。nanoよりVimの方が快適になるまでに10分かかります。
Zaz

185

Git GUIを使用している場合は、プッシュされていない最後のコミットを修正できます。

Commit/Amend Last Commit

168

私はできる限りGit GUIを使用しています。これにより、最後のコミットを修正するオプションが提供されます。

そのボックスにチェックを入れます

また、git rebase -i origin/masterマスターの上で行ったコミットを常に提示し、修正、削除、並べ替え、またはスカッシュするオプションを提供する素晴らしいマントラです。最初にそのハッシュを取得する必要はありません。


4
例で表示した画面にどうやって行きますか?
Marwanمروان2014年

2
これは、Windows Git Guiの右下部分です。「最後のコミットの修正」トグルを選択するだけで、最新のコミット情報が表示されます。
wbdarby 2016年

138

うわー、これを行う方法はたくさんあります。

これを行うもう1つの方法は、最後のコミットを削除することですが、作業内容が失われないように変更を保持します。その後、修正されたメッセージで別のコミットを実行できます。これは次のようになります。

git reset --soft HEAD~1
git commit -m 'New and corrected commit message'

ファイルの追加や変更を忘れた場合は、常にこれを行います。

--soft代わりに指定することを忘れないでください--hard。そうしないと、そのコミットが完全に失われます。


5
これgit commit --amendは、2ステップのプロセスであることを除いて、まったく同じことを行います。
ジョセフK.ストラウス14

3
@ JosephK.Straussコミットを修正すると、元のコミットの作成者と日付の情報も保持され、新しいコミッターと日付の情報が別々に保持されると思います。このアプローチがそれを行うかどうかはわかりません。
Everton、2016年

4
@EvertonAgnerあなたは正しいです。--amend作者の情報は保持されますが、質問はメッセージの変更のみを求めます。
ジョセフK.シュトラウス

131

古いメッセージ(最新のメッセージだけではない)の編集に役立つWindows / Mac GUIを探している人には、Sourcetreeをお勧めします。以下の手順は以下のとおりです。

Sourcetreeインタラクティブリベース

まだリモートにプッシュされていないコミットの場合:

  1. 現在の変更をすべてコミットまたは隠していることを確認してください(つまり、[ファイルのステータス]タブにファイルがリストされていない)。それ以外の場合は機能しません。
  2. [ログ/履歴]タブで、編集するコミットのにあるグラフの隣接する行があるエントリを右クリックし、[ <commit ref>の子をインタラクティブにリベース...] を選択します。
  3. 変更するコミットメッセージの行全体を選択します([メッセージ]列をクリックします)
  4. 「メッセージの編集」ボタンをクリックします。
  5. 表示されるダイアログで必要に応じてメッセージを編集し、クリックします OK
  6. 変更する他のコミットメッセージがある場合は、手順3〜4を繰り返します。
  7. クリックOK:リベースが始まります。すべて問題なければ、出力は「正常に完了」で終了します。注:複数のコミットメッセージを同時に変更しようとするとUnable to create 'project_path/.git/index.lock': File exists.、失敗することがあります。問題が正確に何であるか、またはSourcetreeの将来のバージョンで修正されるかどうかはわかりませんが、これが発生した場合は、一度に1つずつリベースすることをお勧めします(低速ですが、信頼性が高いようです)。

...または...すでにプッシュされたコミットの場合:

この回答の手順に従います。これは上記と同様ですがgit push origin <branch> -f、ブランチを強制的にプッシュするには、コマンドライン()からさらにコマンドを実行する必要があります。私はそれをすべて読み、必要な注意を適用することをお勧めします!


すべての回答のうち、これはすべてのgit初心者に最適です^^^(無料のプログラムSourceTreeを使用し、編集するコミットの前に「Rebase children of」をコミットに適用します)
レベル

127

最新のコミットを編集したいだけなら、以下を使用してください:

git commit --amend

または

git commit --amend -m 'one line message'

ただし、複数のコミットを続けて編集する場合は、代わりにリベースを使用する必要があります。

git rebase -i <hash of one commit before the wrong commit>

Gitリベース編集

上記のようなファイルに、 edit/eか、他のオプションの1つを入力して、保存して終了します。

これで、最初の間違ったコミットになります。ファイルに変更を加えると、自動的にステージングされます。タイプ

git commit --amend

保存して終了し、次のように入力します

git rebase --continue

すべての選択が完了するまで、次の選択に移動します。

これらのことにより、特定のコミット後のすべてのSHAハッシュが変更されることに注意してください。


2
git rebase -i <間違ったコミットの前の1つのコミットのハッシュ>は私にとってはうまくいきます。ありがとう。
Viraths

127

最後のメッセージのみを変更する場合は、--onlyフラグまたはそのショートカット-ocommit --amend次のように使用する必要があります。

git commit --amend -o -m "New commit message"

これにより、ステージングされたもので誤ってコミットを強化することがなくなります。もちろん、適切な$EDITOR設定を行うのが最善です。次に、-mオプションを省略できます。Gitは、コミットメッセージに古いメッセージを事前に入力します。このようにして、簡単に編集できます。


1
「トップ」の答えは質問に答えません。それは単にへの一般的な紹介を与えるだけgit commit --amendです。質問は非常に具体的だったので、より長く!=良いです。-o旗の決定的な言及はおそらく残りの情報に埋もれるでしょう。また、すでに非常に多くの票を獲得している回答を編集するのも苦手です。
David Ongaro

2
人々がそれを「正しい」答えとして使用しているという本当の危険があるので、あなたはあなたが一番上の答えを自由に編集することができると言われています。ステージングされたものでコミットを修正することは簡単に起こり得ます-それは私に起こりました、そしてあなたが偶然それをプッシュしたとき、それは本当に迷惑です。しかし、それでも、量は正確性を保証するものではありません。回答数も投票数もありません。
David Ongaro

1
一番上の答えは「正しくない」、「質問に答えない」とまでは言いません。それは間違いなく機能し、質問に答えます。修正しようとするときに、段階的な変更がないことを確認する必要があります。しかし、私はあなたにそのことを人々に警告しなければならないという点について理解しています。時間があれば後で編集します。

1
公平に言う--only--amend、Git 1.3.0以降でwithオプションを使用できるにもかかわらず、1.7.11.3(ea2d4ed35902ce15959965ab86d80527731a177c)で修正されるまで正しく機能しませんでした。したがって、2008年の正解は、おそらく次のようになりますgit stash; git commit --amend; git stash pop
David Ongaro 14

103

最後の間違ったコミットメッセージを1行の新しいコミットメッセージで更新します。

git commit --amend -m "your new commit message"

または、以下のようにGitリセットを試してください:

# You can reset your head to n number of commit
# NOT a good idea for changing last commit message,
# but you can get an idea to split commit into multiple commits
git reset --soft HEAD^

# It will reset you last commit. Now, you
# can re-commit it with new commit message.

リセットを使用してコミットを小さなコミットに分割する

git reset 1つのコミットを複数のコミットに分割するのにも役立ちます。

# Reset your head. I am resetting to last commits:
git reset --soft HEAD^
# (You can reset multiple commit by doing HEAD~2(no. of commits)

# Now, reset your head for splitting it to multiple commits
git reset HEAD

# Add and commit your files separately to make multiple commits: e.g
git add app/
git commit -m "add all files in app directory"

git add config/
git commit -m "add all files in config directory"

ここで、最後のコミットを2つのコミットに正常に分割しました。


3
あなたがしたいすべてがあなたの最後のメッセージがコミット編集している場合は、その目的のためにソフトリセットを使用することで、オーバーキル。ただ、使用git commit --amendまさにそれがで言うどのようなトップは答えを投票しました。さらに、どちらも最初の親コミットにリセットされるためgit reset --soft HEAD^この以前の回答のソフトリセットと同じように機能します。

3
git resetは、1つのコミットメッセージを複数のコミットメッセージに分割するというアイデアを与えるためだけに、ソリューションを追加することに煩わされています。というのも、使い始めた頃にその問題に直面していたからgitです。時々、これは本当に役に立ちます。:)
przbadu 2014

87

この質問には多くの答えがありますが、Vimを使用して古いコミットメッセージを変更する方法を非常に詳細に説明しているものはありません。私がこれを自分でやろうとして動けなくなったので、ここでは、特にVimの経験がない人のために、これをどのように実行したかを詳しく説明します。

私はすでにサーバーにプッシュした5つの最新のコミットを変更したいと思っていました。これはかなり「危険」です。誰かがすでにこれをプルしている場合、コミットメッセージを変更することで混乱する可能性があるためです。ただし、自分の小さなブランチで作業していて、誰もそれをプルしていないことが確実な場合は、次のように変更できます。

5つの最新のコミットを変更し、ターミナルに次のように入力するとします。

git rebase -i HEAD~5

* 5は、変更するコミットメッセージの数です(10番目を最後のコミットに変更する場合は、10と入力します)。

このコマンドでVimに移動し、コミット履歴を「編集」できます。次のように、最後の5つのコミットが上部に表示されます。

pick <commit hash> commit message

代わりpickに書く必要がありますreword。これをVimで入力するには、と入力しiます。それはあなたがにに行かせる挿入モード。(一番下のINSERTという単語で挿入モードになっていることがわかります。)変更するコミットについては、reword代わりに次のように入力します。pick

次に、この画面を保存して終了する必要があります。まず、Escボタンを押して「コマンドモード」に切り替えます(下部のINSERTという単語が消えた場合は、コマンドモードになっていることを確認できます)。次に、と入力してコマンドを入力できます:。保存して終了するコマンドはwqです。入力した:wq場合、正しい方向に進んでいます。

次に、Vimは言い換えたいすべてのコミットメッセージを調べ、ここで実際にコミットメッセージを変更できます。これを行うには、挿入モードに入り、コミットメッセージを変更し、コマンドモードに入り、保存して終了します。これを5回行うと、Vimは終了します。

次に、間違ったコミットをすでにプッシュしている場合は、git push --forceそれらを上書きする必要があります。これgit push --forceは非常に危険なことなので、間違ったコミットをプッシュしたため、サーバーからプルされないように注意してください。

これでコミットメッセージが変更されました!

(ご覧のとおり、私はVimでの経験があまりないので、間違った「用語」を使用して何が起こっているのかを説明した場合は、遠慮なく修正してください!)


4
<nitpick>Stack Overflowには「スレッド」はありません。ディスカッションフォーラムではないため、「質問」、「回答」、「投稿」しかありません。</nitpick>。また、Vimのすべてのバージョンが同じであるとは限りません。それらのすべてが挿入モードで文字を削除できるわけではありません(ある意味で正しいでしょうか?)。Vimで常に文字を削除できるようにしたい場合、Xそれxを行います(xカーソルの前の文字を少し削除し、X後ろを削除します)。間違えた場合は、u繰り返し使用して元に戻すことができます。最後に、rrewordインタラクティブなリベースエディタでの省略形です。

1
vimで単語を変更するにはcw、最初にタイプします(vimに関する質問ではありませんが、同意します)。
Yaroslav Nikitenko、2015

あなたはその嫌悪を使う必要はありません。gitエディターはnano、Midnight Commanderのmceditのように、適切でユーザーフレンドリーなものに設定できます
Dan Dascalescu、

79

git-rebase-rewordを使用できます

同じように(最後だけでなく)コミットを編集するように設計されています commit --amend

$ git rebase-reword <commit-or-refname>

コミットを修正するためのrebase interactiveのアクションにちなんで名付けられました: "reword"。この投稿man -sectionインタラクティブモード-を参照してください

例:

$ git rebase-reword b68f560
$ git rebase-reword HEAD^

6
これには、外部プログラムのインストールが必要です。私の意見では、組み込みのツールとエイリアスをより効果的に使用することを学ぶ方が良いでしょう。:私のように入力しg c; g rb -i @~9、新しいが、私はそれをしたい場所にコミットする変更を移動し、(コミットとリベース)commitffixup)、および保存します。それよりも高速なものが必要な場合は、別名を付けることができます git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
Zaz

79

私は、エイリアスを追加したrecirecmのためのrecommit (amend)それ。今、私はそれを行うことができますgit recmgit recm -m

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......

57

タイプミスのあるコミットをプッシュしたことに気づきました。元に戻すために、私は次のことを行いました:

git commit --amend -m "T-1000, advanced prototype"
git push --force

警告:変更を強制的にプッシュすると、リモートブランチがローカルブランチで上書きされます。残しておきたいものを上書きしないようにしてください。また、誰かがあなたとブランチを共有している場合、修正された(書き換えられた)コミットを強制的にプッシュすることについても注意してください。


7
gitでは何も「上書き」されません。この場合、ブランチポインターは新しいコミットに設定され、参照が残っていない場合は古いコミットが古くなり、数週間後にクリーンアップされる可能性があります。(それまでは、他の人はそれを見つけて参照することができます(たとえば、reflogを調べることによって)。)
David Ongaro 14

51

私は以下を使用するのが好きです:

  1. git status
  2. git add --all
  3. git commit -am "message goes here about the change"
  4. git pull <origin master>
  5. git push <origin master>

46

コードをリモートブランチ(GitHub / Bitbucket)にプッシュしていない場合は、コマンドラインでコミットメッセージを次のように変更できます。

 git commit --amend -m "Your new message"

特定のブランチで作業している場合は、次のようにします。

git commit --amend -m "BRANCH-NAME: new message"

間違ったメッセージでコードをすでにプッシュしていて、メッセージを変更するときは注意する必要がある場合。つまり、コミットメッセージを変更してもう一度プッシュしようとすると、問題が発生します。スムーズにするには、次の手順に従います。

それを行う前に私の全体の答えを読んでください。

git commit --amend -m "BRANCH-NAME : your new message"

git push -f origin BRANCH-NAME                # Not a best practice. Read below why?

重要な注意:強制プッシュを直接使用すると、他の開発者が同じブランチで作業しているコードの問題が発生する可能性があります。したがって、これらの競合を回避するには、強制プッシュを行う前に、ブランチからコードをプルする必要があります。

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull origin BRANCH-NAME
 git push -f origin BRANCH-NAME

これは、すでにプッシュされている場合にコミットメッセージを変更するときのベストプラクティスです。

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