web-dev-qa-db-ja.com

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

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

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

7673
Laurie Young

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

git commit --amend

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

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

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

これを行う前に、作業コピーの変更stagedがないことを確認してください。そうしないと、それらもコミットされます。 (Unstaged変更はコミットされません。)

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

すでにコミットをリモートブランチにプッシュしている場合、 プッシュを強制的にプッシュする必要があります で:

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

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

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


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

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

Git squashを実行するには、次の手順を実行します。

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

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

enter image description here

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

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

良いヒント:

複数のブランチでそれを行う必要があり、コンテンツを修正するときに競合に直面する可能性がある場合は、 git rerere を設定し、gitにそれらの競合を自動的に解決させます。


ドキュメンテーション

15489
EfForEffort
git commit --amend -m "your new message"
2458
lfx_cool

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

  1. git rebase --interactive $parent_of_flawed_commit

    いくつかの欠陥のあるコミットを修正したい場合は、それらのうち最も古いものの親を渡してください。

  2. あなたが与えたもの以降のすべてのコミットのリストを含むエディタが表示されます。

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

  3. reword にしたいコミットごとに、Gitはあなたをエディタに戻します。 edit にしたいコミットごとに、Gitはあなたをシェルに入れます。シェルにいる場合:

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

このシーケンスの大部分は、あなたが行っているさまざまなコマンドの出力によってあなたに説明されます。それは非常に簡単です、あなたはそれを暗記する必要はありません - git rebase --interactiveはどれほど前にコミットしてもコミットを修正できることを忘れないでください。


すでにプッシュしたコミットを変更したくないということに注意してください。それとも多分あなたはそうしますが、その場合あなたはあなたのコミットを引っ張り、それらの上で仕事をしたかもしれないすべての人とコミュニケーションするために細心の注意を払わなければならないでしょう。 誰かがリベースを発行した後、または公開されたブランチにリセットした後に、どのようにして回復または再同期化するのですか?

2330

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

git commit --amend

これにより、新しいコミットメッセージを表すファイルがテキストエディタで開きます。それはあなたの古いコミットメッセージからのテキストで埋められ始めます。必要に応じてコミットメッセージを変更し、ファイルを保存してエディタを終了します。

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

git commit --amend -C HEAD

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

git reset --hard HEAD^

複数のコミットメッセージを編集したい場合は、実行してください。

git rebase -i HEAD~commit_count

(交換する commit_count このコマンドは、エディタを起動します。最初のコミット(変更したいもの)を「pick」ではなく「edit」としてマークしてから、保存してエディタを終了します。コミットしてから実行したい変更を行います。

git commit --amend
git rebase --continue

注:git commit --amendによって開かれたエディターからも「必要な変更を加える」ことができます。

762
Fatih

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

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

そのためにgit filter-branchを使うこともできます。

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

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

これはHEADと欠陥のあるコミットの間の全てのコミットを書き換えようとするので、あなたはmsg-filterコマンドを非常に賢明に選ぶべきです;-)

352
Mark

私はこのように好む。

git commit --amend -c <commit ID>

そうでなければ、新しいコミットIDを持つ新しいコミットがあるでしょう。

312
krevedko

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

またはコンソール/端末からこのコマンドを使用します。

git commit -a --amend -m "My new commit message"
310
Akhilraj N S

Git rebasing を使うことができます。たとえば、bbc643cdをコミットするように修正したい場合は、次のコマンドを実行します。

$ git rebase bbc643cd^ --interactive

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

$ git add <filepattern>

今すぐ使えます

$ git commit --amend

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

$ git rebase --continue

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

282
Shoaib Ud-Din
  1. 最後のコミットメッセージだけを修正したい場合は、次のようにします。

    git commit --amend
    

    それはあなたをあなたのテキストエクサイターに落として、あなたに最後のコミットメッセージを変更させるでしょう。

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

    git rebase -i HEAD~3
    
275
Heena Hussain

古いコミットメッセージを複数のブランチにまたがって変更する必要がある場合(つまり、誤ったメッセージを含むコミットが複数のブランチに存在する場合)、次のようにします。

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

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

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

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

  • --allは、すべての branch tags が書き換えられることを確認します。

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

あなたのマスターを回復し、ブランチold_masterでアクセスしたいとします。

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

つかいます

git commit --amend

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

221
skin

修正する

ここにはいくつかの選択肢があります。できるよ

git commit --amend

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

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

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

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

それから対話的なリベースの中で、あなたは単にそのコミットに編集を加えるだけです。起動したらgit commit --amendを実行してコミットメッセージを修正します。そのコミットポイントの前にロールバックしたい場合はgit reflogを使用してそのコミットを削除することもできます。それからあなたはgit commitをもう一度やるだけです。

195
wallerjake

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

Commit/Amend Last Commit
183
gulchrider

最後のコミットであれば、コミットを修正するだけです。

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

(コミットメッセージだけを確実に変更するために-o--only)フラグを使う)


これが埋め込みコミットの場合は、素晴らしいインタラクティブリベースを使用してください。

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

必要なコミットを見つけ、pickrreword)に変更して、ファイルを保存して閉じます。完了しました。



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

  • 時間がある場合はvimtutorを実行してください。
  • hjkl 移動キーに対応 
  • すべてのコマンドの前に「範囲」を付けることができます。 3j 3行下に移動
  • i 挿入モードに入ります - あなたがタイプしたテキストはファイルに現れます
  • Esc または Ctrlc 挿入モードを終了して「通常」モードに戻る
  • u 元に戻すには
  • Ctrlr やり直す
  • dd、 dw、 dl 行、単語、または文字をそれぞれ削除します。
  • cc、 cw、 cl 行、単語、または文字をそれぞれ変更します。 ddi
  • yy、 yw、 yl 行、単語、文字をそれぞれコピー( "yank")する
  • p または P 現在位置の前後にペーストする
  • :wEnter ファイルを保存(書き込み)する
  • :q!Enter 保存せずに終了する
  • :wqEnter または ZZ 保存して終了する

テキストをたくさん編集する場合は、Dvorakキーボードレイアウトに切り替えて、タッチタイプを学び、そしてvimを学びましょう。 努力する価値はありますか? はい。



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

$ git reset @~3   # go back 3 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のようなオプションには気をつけてください - データを捨てることもできます
*また、協力しているブランチの履歴を書き換えないでください。

172
Zaz

私は Git GUI をできる限り使用していますが、最後のコミットを修正する選択肢があります。

Tick that box

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

165
Havard Graff

うわー、だからこれを行うにはたくさんの方法があります。

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

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

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

--softの代わりに--hardを指定するにはRememberを使います。そうでなければコミットを完全に失います。

135
Radu Murzea

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

SourceTree interactive rebase

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

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

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

この回答 の手順に従います。これは上記と似ていますが、コマンドラインからさらにコマンドを実行してブランチを強制プッシュします。すべてを読んで必要な注意を払ってください!

128
Steve Chambers

最新のコミットを編集したいだけなら:

git commit --amend

または

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

しかし、いくつかのコミットを続けて編集したい場合は、代わりにリベースを使用してください。

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

git rebase editing

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

さて、あなたは最初の間違ったコミットにいるでしょう。ファイルに変更を加えると、それらは自動的にステージングされます。タイプ

git commit --amend

保存して終了して入力

git rebase --continue 

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

これらのことは、その特定のコミットの後にあなたのすべてのSHAハッシュを変えることに注意してください。

124

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

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

これはあなたが誤って段階的なものであなたのコミットを強化しないことを確実にします。もちろん、適切な$EDITOR設定をするのが最善です。それから-mオプションを省略することができ、gitはコミットメッセージを古いもので事前に埋めます。このようにして簡単に編集することができます。

123
David Ongaro

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

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

あるいは、以下のようにgit resetを試してください。

# 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.

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

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 seperately 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つのコミットに分割しました。

99
przbadu

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

私はすでにサーバーにプッシュした5つの最新のコミットを変更したいと思いました。他の誰かがすでにこれから引っ張ってきた場合、コミットメッセージを変更することで混乱する可能性がある場合、これは非常に「危険な」原因です。しかし、あなたがあなた自身の小さなブランチに取り組んでいて、誰もそれを引っ張っていないと確信しているなら、あなたはそれをこのように変えることができます:

最新の5つのコミットを変更したいとしましょう。それから端末にこれを入力します。

git rebase -i HEAD~5 * 5は変更したいコミットメッセージの数です。 (したがって、10回目を最後のコミットに変更したい場合は、10を入力します)

このコマンドはあなたをVIMに導きますあなたはあなたのコミット履歴を '編集'できます。このようにして、最後の5つのコミットが上部に表示されます。

pick <commit hash> commit message

pickの代わりにrewordを書く必要があります。これをVIMで行うには、iと入力します。これにより、INSERTモードに入ります。 (一番下の単語「INSERT」で挿入モードになっていることがわかります)コミットの場合は、タイプをrewordではなくpickに変更します。

その後、この画面を保存して終了する必要があります。最初にescボタンを押して「コマンドモード」に入ります。 (一番下のWordのINSERTが消えたらコマンドモードであることを確認できます)それから:と入力することでコマンドを入力できます。保存して終了するコマンドはwqです。 :wqと入力しても、正しいことはわかります。

それからVIMあなたが書き換えたいすべてのコミットメッセージに行きます、ここであなたは実際にコミットメッセージを変更することができます。これを行うには、INSERTモードに入り、コミットメッセージを変更し、コマンドモードに入り、保存して終了します。これを5回実行すれば、あなたはVIMから抜け出します。

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

コミットメッセージを変更しました。

(ご覧のとおり、私はVIMの経験が少ないので、何が起こっているのかを説明するために間違った「専門用語」を使用した場合は、遠慮なく訂正してください。)

82
Marijn

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

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

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

それはコミットを修正するための対話式リベースのアクションにちなんで名付けられました: "reword"。 この記事を見る そして man - セクション対話モード -

例:

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

recommit (amend)の代わりにrecirecmというエイリアスを追加しました。これでgit recmまたはgit recm -mでそれを実行できます。

$ vim ~/.gitconfig

[alias]

    ......
    cm = commit
    reci = commit --amend
    recm = commit --amend
    ......
76
Chu-Siang Lai

私は、タイプミスを犯してコミットしたことに気づきました。元に戻すために、私は次のようにしました。

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

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

54
neoneye

私は以下を使うのが好きです。

  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>
49
Kedar Adhikari

リモートブランチ( 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?

重要な注意: 直接プッシュを使うと、他の開発者が同じブランチに取り組んでいるというコードの問題が発生する可能性があります。そのため、これらの衝突を避けるために、 force Push を作成する前に、ブランチからコードを取得する必要があります。

 git commit --amend -m "BRANCH-NAME : your new message"
 git pull Origin BRANCH-NAME
 git Push -f Origin BRANCH-NAME

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

43
Prabhakar