回答:
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にそれらの競合を自動的に解決させます。
git commit --amend
、ほど強力ではありませんgit rebase -i
。
git commit --amend
(a?)マスターコミットを修正できます。
git push -f origin branchname
git push -f
他の人が同じリポジトリを使用している場合、@ hughesは少し危険ではありませんか?
git commit --amend -c HEAD
。これにより、古いコミットメッセージが事前に入力されたエディターが開き、変更できます。
git commit --amend -m "your new message"
修正したいコミットが最新のものではない場合:
git rebase --interactive $parent_of_flawed_commit
欠陥のあるコミットをいくつか修正したい場合は、最も古いコミットの親を渡します。
エディターが表示され、指定したコミット以降のすべてのコミットのリストが表示されます。
pick
にreword
(またはGitの古いバージョンではedit
)に変更します。書き直したいコミットごとに、Gitはエディターにドロップします。編集するコミットごとに、Gitはシェルにドロップします。シェルにいる場合:
git commit --amend
git rebase --continue
このシーケンスのほとんどは、さまざまなコマンドの出力に応じて説明されます。それは非常に簡単です; 覚える必要はありません– git rebase --interactive
コミットがどれだけ前でもコミットを修正できることを覚えておいてください。
すでにプッシュしたコミットを変更したくないことに注意してください。あるいは、そうするかもしれませんが、その場合は、コミットをプルしてその上で作業を行った可能性のあるすべての人と通信するように細心の注意を払う必要があります。公開されたブランチに誰かがリベースまたはリセットをプッシュした後、どのように回復/再同期しますか?
reword
、代わりにpick
を使用してログメッセージを編集できます。
$parent_of_flawed_commit
と同等$flawed_commit^
です。
-p
(--preserve-merges
)を使用します。
以前のコミットを修正するには、必要な変更を行い、それらの変更をステージングしてから、実行します
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
git rebase -i HEAD~commit_count
また、選択したコミット数に関係なく、コミットメッセージを変更できます。選択したコミットを「ピック」ではなく「リワード」としてマークするだけです。
git reset --hard
コミットされていない変更を破棄します。に置き換え--hard
てください--soft
。
git reset --hard
は、完全に正当なコマンドですが、質問を考えると誤解を招きます。--hard
破棄したい変更をコミットした場合に使用し、コミットメッセージにタイプミスをした場合は使用しません。
すでに述べgit commit --amend
たように、最後のコミットを上書きする方法です。注:ファイルも上書きする場合、コマンドは次のようになります。
git commit -a --amend -m "My new commit message"
git add file.ext
ちょうどそのgit commit --amend
git filter-branch
そのためにも使用できます。
git filter-branch -f --msg-filter "sed 's/errror/error/'" $flawed_commit..HEAD
些細なことほど簡単ではありませんgit commit --amend
が、誤ったコミットメッセージの後に既にマージがある場合は特に便利です。
これは、と欠陥のあるコミットの間のすべてのコミットを書き換えようとするHEAD
ので、msg-filter
コマンドを非常に賢く選択する必要があることに注意してください;-)
$flawed_commit^..HEAD
ではありません$flawed_commit..HEAD
。manページで述べられているように:« コマンドは、コマンドラインで指定された正の参照のみを書き換えます(たとえば、a..bを渡した場合、bのみが書き換えられます)。»
私はこの方法を好みます:
git commit --amend -c <commit ID>
それ以外の場合は、新しいコミットIDを持つ新しいコミットがあります。
-c
いくつかのことを行います。デフォルトでは古いメッセージが使用されますが、著者情報(人物と時間)もコピーされます。-C
メッセージの編集を求めないことを除いて、同じことを行います。
fatal: Option -m cannot be combined with -c/-C/-F/--fixup.
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
が有効であることを確認したい場合はgit show
、これを使用すると、新しいメッセージが表示されます。
最後のコミットメッセージのみを変更する場合は、次のようにします。
git commit --amend
これにより、テキストエディターが表示され、最後のコミットメッセージを変更できます。
最後の3つのコミットメッセージ、またはその時点までのいずれかのコミットメッセージを変更する場合はHEAD~3
、git rebase -i
コマンドに次のように指定します。
git rebase -i HEAD~3
git commit --amend
、それはまた、あなたが使用できると言うgit rebase -i HEAD~commit_count
、あなたがしたすべてのプラグインだった3
ためcommit_count
。
複数のブランチで古いコミットメッセージを変更する必要がある場合(つまり、誤ったメッセージを含むコミットが複数のブランチに存在する場合)は、以下を使用することをお勧めします。
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 add
だけで、今まで私の前にきたgit push
エド。git filter-branch
バージョン履歴を完全に変更したい場合にも使用しますが、OPはこれを望んでいないため、この回答には大きなヘルス警告が必要です-これを自宅で試さないでください、のぞき見してください!!
使用する
git commit --amend
それを詳細に理解するには、優れた投稿は4. Rewrite Git Historyです。また、使用しない場合 についても説明しますgit commit --amend
。
git commit --amend
あなたがあなたの書いた前に、答えはすでに(数回)与えられていました。もう一度投稿したのはなぜですか?「Git履歴の書き換え」へのリンクを追加する場合は、既存の回答の1つを編集するか、コメントを残しておくことができます。
ここにはいくつかのオプションがあります。できるよ
git commit --amend
それがあなたの最後のコミットである限り。
それ以外の場合、最後のコミットでない場合は、インタラクティブなリベースを実行できます。
git rebase -i [branched_from] [hash before commit]
次に、インタラクティブなリベース内で、そのコミットに編集を追加するだけです。表示されたら、a git commit --amend
を実行してコミットメッセージを変更します。そのコミットポイントの前にロールバックする場合は、そのコミットを使用git reflog
して削除することもできます。その後、git 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
EscZZ
):
vimtutor
時間があれば走るh
j
k
l
移動キーに対応 ←↓↑→3j
3行下に移動しますi
挿入モードに入る—入力したテキストはファイルに表示されますc
挿入モードを終了して「通常」モードに戻るu
元に戻すにはr
やり直すdd
、dw
、dl
それぞれ、ライン、単語、または文字を削除するにはcc
、cw
、cl
それぞれ、行、単語、または文字を変更する(同じdd
i
)yy
、yw
、yl
それぞれ、(「ヤンク」)ライン、単語、または文字をコピーしますp
またはP
現在の位置の前後にそれぞれ貼り付ける:w
Enter ファイルを保存(書き込み)するには:q!
Enter 保存せずに終了するには:wq
Enterまたは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
てください—データを破棄できます。
* また、協力しているブランチの履歴を書き換えないでください。
nano
?ここでは、テキストファイルに加える必要のある些細な変更について話しているのであり、「最高の」テキストエディターについて炎上するようなハードコアコーディングではありません。
ddjjpZZ
ます。Vimの基本的な知識について難解なことはありません。nanoよりVimの方が快適になるまでに10分かかります。
私はできる限りGit GUIを使用しています。これにより、最後のコミットを修正するオプションが提供されます。
また、git rebase -i origin/master
マスターの上で行ったコミットを常に提示し、修正、削除、並べ替え、またはスカッシュするオプションを提供する素晴らしいマントラです。最初にそのハッシュを取得する必要はありません。
うわー、これを行う方法はたくさんあります。
これを行うもう1つの方法は、最後のコミットを削除することですが、作業内容が失われないように変更を保持します。その後、修正されたメッセージで別のコミットを実行できます。これは次のようになります。
git reset --soft HEAD~1
git commit -m 'New and corrected commit message'
ファイルの追加や変更を忘れた場合は、常にこれを行います。
の--soft
代わりに指定することを忘れないでください--hard
。そうしないと、そのコミットが完全に失われます。
git commit --amend
は、2ステップのプロセスであることを除いて、まったく同じことを行います。
--amend
作者の情報は保持されますが、質問はメッセージの変更のみを求めます。
古いメッセージ(最新のメッセージだけではない)の編集に役立つWindows / Mac GUIを探している人には、Sourcetreeをお勧めします。以下の手順は以下のとおりです。
まだリモートにプッシュされていないコミットの場合:
Unable to create 'project_path/.git/index.lock': File exists.
、失敗することがあります。問題が正確に何であるか、またはSourcetreeの将来のバージョンで修正されるかどうかはわかりませんが、これが発生した場合は、一度に1つずつリベースすることをお勧めします(低速ですが、信頼性が高いようです)。...または...すでにプッシュされたコミットの場合:
この回答の手順に従います。これは上記と同様ですがgit push origin <branch> -f
、ブランチを強制的にプッシュするには、コマンドライン()からさらにコマンドを実行する必要があります。私はそれをすべて読み、必要な注意を適用することをお勧めします!
最新のコミットを編集したいだけなら、以下を使用してください:
git commit --amend
または
git commit --amend -m 'one line message'
ただし、複数のコミットを続けて編集する場合は、代わりにリベースを使用する必要があります。
git rebase -i <hash of one commit before the wrong commit>
上記のようなファイルに、 edit/e
か、他のオプションの1つを入力して、保存して終了します。
これで、最初の間違ったコミットになります。ファイルに変更を加えると、自動的にステージングされます。タイプ
git commit --amend
保存して終了し、次のように入力します
git rebase --continue
すべての選択が完了するまで、次の選択に移動します。
これらのことにより、特定のコミット後のすべてのSHAハッシュが変更されることに注意してください。
最後のメッセージのみを変更する場合は、--only
フラグまたはそのショートカット-o
をcommit --amend
次のように使用する必要があります。
git commit --amend -o -m "New commit message"
これにより、ステージングされたもので誤ってコミットを強化することがなくなります。もちろん、適切な$EDITOR
設定を行うのが最善です。次に、-m
オプションを省略できます。Gitは、コミットメッセージに古いメッセージを事前に入力します。このようにして、簡単に編集できます。
git commit --amend
です。質問は非常に具体的だったので、より長く!=良いです。-o
旗の決定的な言及はおそらく残りの情報に埋もれるでしょう。また、すでに非常に多くの票を獲得している回答を編集するのも苦手です。
--only
と--amend
、Git 1.3.0以降でwithオプションを使用できるにもかかわらず、1.7.11.3(ea2d4ed35902ce15959965ab86d80527731a177c)で修正されるまで正しく機能しませんでした。したがって、2008年の正解は、おそらく次のようになりますgit stash; git commit --amend; git stash pop
。
最後の間違ったコミットメッセージを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つのコミットに正常に分割しました。
git commit --amend
、まさにそれがで言うどのようなトップは答えを投票しました。さらに、どちらも最初の親コミットにリセットされるためgit reset --soft HEAD^
、この以前の回答のソフトリセットと同じように機能します。
git reset
は、1つのコミットメッセージを複数のコミットメッセージに分割するというアイデアを与えるためだけに、ソリューションを追加することに煩わされています。というのも、使い始めた頃にその問題に直面していたからgit
です。時々、これは本当に役に立ちます。:)
この質問には多くの答えがありますが、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での経験があまりないので、間違った「用語」を使用して何が起こっているのかを説明した場合は、遠慮なく修正してください!)
<nitpick>
Stack Overflowには「スレッド」はありません。ディスカッションフォーラムではないため、「質問」、「回答」、「投稿」しかありません。</nitpick>
。また、Vimのすべてのバージョンが同じであるとは限りません。それらのすべてが挿入モードで文字を削除できるわけではありません(ある意味で正しいでしょうか?)。Vimで常に文字を削除できるようにしたい場合、X
それx
を行います(x
カーソルの前の文字を少し削除し、X
後ろを削除します)。間違えた場合は、u
繰り返し使用して元に戻すことができます。最後に、r
はreword
インタラクティブなリベースエディタでの省略形です。
cw
、最初にタイプします(vimに関する質問ではありませんが、同意します)。
git-rebase-rewordを使用できます
同じように(最後だけでなく)コミットを編集するように設計されています commit --amend
$ git rebase-reword <commit-or-refname>
コミットを修正するためのrebase interactiveのアクションにちなんで名付けられました: "reword"。この投稿とman -sectionインタラクティブモード-を参照してください
例:
$ git rebase-reword b68f560
$ git rebase-reword HEAD^
g c; g rb -i @~9
、新しいが、私はそれをしたい場所にコミットする変更を移動し、(コミットとリベース)commit
にf
(fixup
)、および保存します。それよりも高速なものが必要な場合は、別名を付けることができます git commit --fixup=<commit>; git rebase -i --autosquash <commit>^
タイプミスのあるコミットをプッシュしたことに気づきました。元に戻すために、私は次のことを行いました:
git commit --amend -m "T-1000, advanced prototype"
git push --force
警告:変更を強制的にプッシュすると、リモートブランチがローカルブランチで上書きされます。残しておきたいものを上書きしないようにしてください。また、誰かがあなたとブランチを共有している場合、修正された(書き換えられた)コミットを強制的にプッシュすることについても注意してください。
コードをリモートブランチ(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
これは、すでにプッシュされている場合にコミットメッセージを変更するときのベストプラクティスです。