既存のプッシュされていないコミットメッセージを変更する方法
-
05-07-2019 - |
質問
コミットメッセージに間違ったことを書きました。
メッセージを変更するにはどうすればよいですか?コミットはまだプッシュされていません。
解決
最新のコミットメッセージの修正
git commit --amend
エディターが開き、最新のコミットのコミットメッセージを変更できます。さらに、次のコマンドラインでコミットメッセージを直接設定できます。
git commit --amend -m "New commit message"
<!>#8230;ただし、これにより、複数行のコミットメッセージや小さな修正を入力するのが面倒になります。
これを行う前に、作業コピーの変更がステージングされていないことを確認してください。そうしないと、それらもコミットされます。 (ステージングされていない変更はコミットされません。)
すでにリモートブランチにプッシュしたコミットのメッセージを変更する
すでにリモートブランチにコミットをプッシュしている場合、コミットを強制的にプッシュする必要がある:
git push <remote> <branch> --force
# Or
git push <remote> <branch> -f
警告:強制プッシュは、リモートブランチをローカルブランチの状態で上書きします。ローカルブランチにはないコミットがリモートブランチにある場合、それらのコミットは失われます 。
警告:すでに他の人と共有しているコミットの修正には注意してください。コミットの修正は、本質的に異なる 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
を選択します
インタラクティブリベースに関する重要な注意事項
git rebase -i HEAD~X
を使用する場合、X
コミットよりも多くがあります。 Gitは<!> quot; collect <!> quot;最後のgit rerere
コミットのすべてのコミットで、その範囲内のどこかにマージがあった場合、すべてのコミットも表示されるため、結果はX +になります。
良いヒント:
複数のブランチで実行する必要があり、コンテンツの修正時に競合が発生する可能性がある場合は、 <=> にすると、これらの競合が自動的に解決されます。
ドキュメント
他のヒント
git commit --amend -m "your new message"
修正したいコミットがn <!>#8217; t最新のものでない場合:
-
git rebase --interactive $parent_of_flawed_commit
いくつかの欠陥のあるコミットを修正したい場合は、最も古いコミットの親を渡します。
-
エディターが表示され、指定したコミット以降のすべてのコミットのリストが表示されます。
- 修正したいコミットの前に
pick
をreword
に(またはGitの古いバージョンではedit
に)変更します。 - 保存すると、Gitはリストされたコミットを再生します。
- 修正したいコミットの前に
-
コミットするたびに書き直し、Gitはエディターに戻ります。 編集したいコミットごとに、Gitはシェルにドロップします。 <!>#8217;シェルにいる場合:
- 任意の方法でコミットを変更します。
-
git commit --amend
-
git rebase --continue
このシーケンスの大部分は、さまざまなコマンドの出力によって説明されます。それは非常に簡単です、あなたはそれを覚える必要はありません<!>#8217; t <!>#8211; git rebase --interactive
を使用すると、コミットがどれほど前であっても修正できます。
既にプッシュしたコミットを変更したくないことに注意してください。または多分あなたはそうしますが、その場合、あなたはあなたのコミットを引っ張り、それらの上で仕事をしたかもしれないすべての人と通信するために細心の注意を払う必要があります。 誰かがリベースまたは公開されたブランチへのリセットをプッシュした後、回復/再同期するにはどうすればよいですか
前のコミットを修正するには、必要な変更を行い、それらの変更をステージングしてから実行します
git commit --amend
これにより、新しいコミットメッセージを表すファイルがテキストエディターで開きます。古いコミットメッセージのテキストが入力されて開始されます。コミットメッセージを必要に応じて変更し、ファイルを保存してエディターを終了して終了します。
前のコミットを修正し、同じログメッセージを保持するには、実行します
git commit --amend -C HEAD
以前のコミットを完全に削除して修正するには、実行します
git reset --hard HEAD^
複数のコミットメッセージを編集する場合は、実行
git rebase -i HEAD~commit_count
( commit_count を編集するコミットの数に置き換えます。)このコマンドはエディターを起動します。最初のコミット(変更するコミット)を<!>#8220; edit <!>#8221;としてマークします。 <!>#8220; pick <!>#8221;の代わりに、エディターを保存して終了します。コミットしたい変更を加えてから実行します
git commit --amend
git rebase --continue
注:<!> quot;必要な変更を加える<!> quot; git commit --amend
すでに述べたように、git commit --amend
は最後のコミットを上書きする方法です。注:ファイルを上書きしたい場合、コマンドは
git commit -a --amend -m "My new commit message"
そのためにgit filter-branch
を使用することもできます。
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
簡単な git commit --amend
ほど簡単ではありませんが、誤ったコミットメッセージの後にすでにマージがある場合は特に便利です。
これは、 HEAD
と欠陥のあるコミットとの間のすべてのコミットを書き換えようとすることに注意してください。 >
この方法が好きです。
git commit --amend -c <commit ID>
それ以外の場合、新しいコミットIDを持つ新しいコミットがあります
Git GUIツールを使用している場合、amend last commitという名前のボタンがあります。そのボタンをクリックすると、最後のコミットファイルとメッセージが表示されます。そのメッセージを編集するだけで、新しいコミットメッセージでコミットできます。
またはコンソール/端末から次のコマンドを使用します:
git commit -a --amend -m "My new commit message"
Gitリベースを使用できます。たとえば、bbc643cdをコミットするように変更する場合は、実行します
$ git rebase bbc643cd^ --interactive
デフォルトのエディターで、コミットを変更する行の「pick」を「edit」に変更します。変更を加えてからステージングします
$ git add <filepattern>
今すぐ使用できます
$ git commit --amend
コミットを変更し、その後
$ git rebase --continue
前のヘッドコミットに戻る。
-
最後のコミットメッセージのみを変更する場合は、次のようにします。
git commit --amend
これにより、テキスト出口にドロップされ、最後のコミットメッセージを変更できます。
-
最後の3つのコミットメッセージ、またはそれまでのコミットメッセージのいずれかを変更する場合は、
HEAD〜3
をgit rebase -i
コマンド:git rebase -i HEAD~3
複数のブランチにわたって古いコミットメッセージを変更する必要がある場合(つまり、誤ったメッセージを含むコミットが複数のブランチに存在する場合)、使用することができます。
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
修正
ここにはいくつかのオプションがあります。できます
git commit --amend
最後のコミットである限り。
インタラクティブリベース
それ以外の場合、最後のコミットではない場合、インタラクティブなリベースを行うことができます
git rebase -i [branched_from] [hash before commit]
インタラクティブリベース内で、そのコミットに編集を追加するだけです。起動したら、 git commit --amend
を実行し、コミットメッセージを変更します。そのコミットポイントの前にロールバックする場合は、 git reflog
を使用して、そのコミットを削除することもできます。次に、もう一度 git commit
を実行します。
Git GUIを使用している場合、プッシュされていない最後のコミットを修正できます:
Commit/Amend Last Commit
最後のコミットの場合、コミットを修正するだけです:
git commit --amend -o -m "New commit message"
( -o
(-only
)フラグを使用して、コミットメッセージのみを変更するようにします)
埋もれたコミットの場合、素晴らしいインタラクティブなリベースを使用します:
git rebase -i @~9 # Show the last 9 commits in a text editor
目的のコミットを見つけ、 pick
を r
( reword
)に変更し、ファイルを保存して閉じます。完了!
ミニチュアvimチュートリアル(または8回のキーストロークでリベースする方法 3j
cw
r
Esc ZZ
):
- 時間があれば
vimtutor
を実行します -
h
j
k
l
は移動キー&#8592; &#8595; &#8593; に対応しています&#8594; - すべてのコマンドの前に&quot; range&quot;を付けることができます。
3j
は3行下に移動します -
i
で挿入モードに入ります&#8212;入力したテキストはファイルに表示されます - Esc または Ctrl
c
で挿入モードを終了し、「通常」に戻ります。モード
元に戻すには -
u
- Ctrl
r
をやり直し -
dd
、dw
、dl
行、単語、または文字をそれぞれ削除するには -
cc
、cw
、cl
行、単語、または文字をそれぞれ変更するには(dd
i
と同じ) -
yy
、yw
、yl
行、単語、または文字をそれぞれコピー(&quot;ヤンク&quot;)する -
p
またはP
は、それぞれ現在の位置の前後に貼り付けます -
:w
Enter でファイルを保存(書き込み)します -
:q!
Enter 保存せずに終了するには -
:wq
Enter またはZZ
で保存して終了
テキストを頻繁に編集する場合は、Dvorakキーボードレイアウトに切り替え、タッチ入力を学び、vimを学びます。 努力する価値はありますかはい。
ProTip&#8482 ;:&nbsp; 「危険」を試すことを恐れないでください。履歴を書き換えるコマンド*&#8212; 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
などのオプションに注意してください&#8212;データを破棄できます。
* また、共同作業しているブランチの履歴を書き換えないでください。
できるだけ Git GUI を使用します。これにより、最後に修正するオプションが提供されますコミット:
ファイルの追加または変更を忘れた場合は、常にこれを行います。
覚えて、-hard
の代わりに-soft
を指定します。そうしないと、そのコミットが完全に失われます。
古いメッセージ(最新のメッセージだけでなく)の編集に役立つWindows / Mac GUIを探している方には、 SourceTree 。手順は次のとおりです。
まだリモートにプッシュされていないコミットの場合:
- 現在のすべての変更をコミットまたはスタッシュしたことを確認してください(つまり、[ファイルステータス]タブにファイルがリストされていない)-それ以外の場合は機能しません。
- &quot;ログ/履歴&quot;タブで、編集するコミットの 1つ下のグラフに隣接する線があるエントリを右クリックし、「&lt; commit ref&gt; の子をリベース」を選択します>インタラクティブに...&quot;
- 変更するコミットメッセージの行全体を選択します(つまり、「メッセージ」列をクリックします)。
- 「メッセージを編集」をクリックしますボタン。
- 表示されるダイアログで必要に応じてメッセージを編集し、[OK]をクリックします。
- 他に変更するコミットメッセージがある場合は、手順3〜4を繰り返します。
- [OK]をクリックします。リベースが開始されます。すべてが正常であれば、出力は「正常に完了しました」で終了します。 注: 最近、
'project_path / .git / index.lock'を作成できません:ファイルが存在します。
で失敗することがわかりました。 >複数のコミットメッセージを同時に変更しようとした場合。問題が何であるか、またはSourceTreeの将来のバージョンで修正されるかどうかは正確にはわかりませんが、これが発生した場合は、一度に1つずつリベースすることをお勧めします(より遅いがより信頼性が高いようです)。
...または...すでにプッシュされたコミットの場合:
この回答の手順に従います。これは上記と似ていますが、コマンドからさらにコマンドを実行する必要がありますブランチを強制プッシュする行-すべてを読んで、必要な注意を払ってください!
最新のコミットの使用を編集するだけの場合:
git commit --amend
または
git commit --amend -m 'one line message'
ただし、複数のコミットを連続して編集する場合は、代わりにリベースを使用する必要があります。
git rebase -i <hash of one commit before the wrong commit>
上記のようなファイルにedit / eまたは他のオプションのいずれかを書き込み、保存して終了します。
これで最初の間違ったコミットになります。ファイルを変更すると、自動的にステージングされます。タイプ
git rebase --continue
保存して終了し、入力します
<*>すべての選択が完了するまで次の選択に移動します。
これらのことは、特定のコミット後にすべてのSHAハッシュを変更することに注意してください。
最後のメッセージのみを変更する場合は、-only
フラグまたはそのショートカット -o
を commit --amend
:
git commit --amend -o -m "New commit message"
これにより、ステージングされたもので誤ってコミットを強化することがなくなります。もちろん、適切な $ EDITOR
構成を持つのが最善です。その後、 -m
オプションを省略すると、gitはコミットメッセージに古いメッセージを事前に入力します。これにより、簡単に編集できます。
最後の間違ったコミットメッセージを新しいコミットメッセージで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.
リセットを使用してコミットを小さなコミットに分割する
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つのコミットに正常に分割できました。
この質問には多くの答えがありますが、VIMを使用して古いコミットメッセージを変更する方法を詳細に説明しているものはありません。私は自分でこれをやろうとして立ち往生していたので、ここでは特にVIMの経験がない人のためにこれをどうやってやったかを詳しく書きます!
すでにサーバーにプッシュした5つの最新のコミットを変更したかった。これは非常に「危険な」原因です。すでに他の誰かがこれからプルした場合、コミットメッセージを変更することで物事を台無しにすることができます。ただし、自分の小さなブランチで作業していて、誰もプルしていないことが確実な場合は、次のように変更できます。
5つの最新のコミットを変更したい場合、ターミナルでこれを入力します:
git rebase -i HEAD〜5
* 5は、変更するコミットメッセージの数です。 (したがって、10番目から最後のコミットに変更する場合は10と入力します)
このコマンドを使用すると、VIMに移動して、編集することができます&#8216;編集&#8217;コミット履歴。 次のように、最後の5つのコミットが上部に表示されます:
ピック&lt; commit hash&gt;コミットメッセージ
pick
の代わりに、 reword
を記述する必要があります。 VIMでこれを行うには、 i
を入力します。これにより、INSERTモードになります。 (下部のINSERTという言葉で挿入モードになっていることがわかります。)コミットの場合、 pick
この画面を保存して終了する必要がある場合は、最初に&#8216;コマンドモード&#8217;に移動します。 escボタンを押します。 (下部のINSERTという単語が消えたら、コマンドモードになっていることを確認できます)次に、:
と入力してコマンドを入力します。保存して終了するコマンドは< code> wq 。 :wq
と入力すると、正しいトラックになります。
その後、VIMは書き直したいすべてのコミットメッセージを確認します。ここでは、実際にコミットメッセージを変更できます。これを行うには、INSERTモードに入り、コミットメッセージを変更し、コマンドモードに入り、保存して終了します。これを5回行うと、VIMが終了します!
その後、すでに間違ったコミットをプッシュしている場合、 git push --force
でそれらを上書きする必要があります。 git push --force
は非常に危険なことです。間違ったコミットをプッシュしたため、誰もサーバーからプルしないようにしてください!
コミットメッセージを変更しました!
(おわかりのように、私はVIMの経験が少ないので、間違った 'lingo'を使用して何が起こっているのか説明してくれたら、お気軽に修正してください!)
recommit(修正)
の reci
、 recm
のエイリアスを追加しました。今では gitで実行できますrecm
または git recm -m
。
$ vim ~/.gitconfig
[alias]
......
cm = commit
reci = commit --amend
recm = commit --amend
......
タイプミスを含むコミットをプッシュしたことに気付きました。元に戻すために、次のことを行いました。
git commit --amend -m "T-1000, advanced prototype"
git push --force
警告:変更を強制的にプッシュすると、リモートブランチがローカルブランチで上書きされます。保持したいものを上書きしないようにしてください。また、他の誰かがあなたとブランチを共有している場合、修正された(書き換えられた)コミットを強制的にプッシュすることにも注意してください。 >
次のものを使用します:
-
git status
-
git add --all
-
git commit -am&quot;メッセージは変更についてここに行きます&quot;
-
git pull&lt; origin master&gt;
-
git push&lt; origin master&gt;
コードをリモートブランチにプッシュしていない場合( 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
これは、コミットメッセージが既にプッシュされている場合、コミットメッセージを変更する際のベストプラクティスです。