プッシュ後にgit commitメッセージを変更する(誰もリモートからプルしなかった場合)


982

私はgit commitとそれに続くプッシュを行いました。コミットメッセージを変更したいのですが。私が正しく理解している場合、そのような変更を行う前に誰かがリモートリポジトリからプルした可能性があるため、これはお勧めできません。誰も引っ張っていないことを知っているとどうなりますか?

これを行う方法はありますか?


何を試しましたか?コミットメッセージを変更する方法をすでに知っていると想定してプッシュしようとすると、Gitはそれを実現するために何をする必要があるかを教えてくれます。
アンドリューマーシャル

1
「Gitで誤ったコミットメッセージを編集するにはどうすればよいですか(私はプッシュしました)」の回答を参照してください。stackoverflow.com/a/457396/444639
Mike Rylander 2013年

4
宣言-Googleのgit commitに関する質問ランク1!
Manish Shrivastava 2016年


HEADコミットを修正して通常(--forceなしで)プッシュすると、驚くことに失敗しません。HEADコミットメッセージは、変更されたコミットIDで更新されます。これは、HEADを除く他のコミットIDがそのまま残ることを意味します。git 2.8.1バージョンでこの動作に気づきました。
irsis

回答:


1374

歴史の変化

それが最新のコミットである場合は、これを単純に行うことができます。

git commit --amend

これにより、最後のコミットメッセージがエディターに表示され、メッセージを編集できます。(-m古いメッセージを消去して新しいメッセージを使用する場合に使用できます。)

押す

そして、あなたが押すとき、これをしてください:

git push --force-with-lease <repository> <branch>

または、「+」を使用できます。

git push <repository> +<branch>

または使用できます--force

git push --force <repository> <branch>

これらのコマンドを使用するときは注意してください。

  • 他の誰かが変更を同じブランチにプッシュした場合、おそらくそれらの変更を破棄することを避けたいでしょう。--force-with-leaseアップストリームの変更があると中止されるため、このオプションが最も安全です(

  • ブランチを明示的に指定しない場合、Gitはデフォルトのプッシュ設定を使用します。デフォルトのプッシュ設定が「一致」の場合、複数のブランチの変更を同時に破棄する可能性があります。

その後のプル/フェッチ

すでにプルした人​​にはエラーメッセージが表示され、次のような方法で更新する必要があります(自分で変更を加えていない場合)。

git fetch origin
git reset --hard origin/master # Loses local commits

を使用するときは注意してくださいreset --hard。ブランチに変更がある場合、それらの変更は破棄されます。

履歴の変更に関する注意

破棄されたデータは、実際には古いコミットメッセージですが、それを--force知らないため、他のデータも削除されます。したがって--force、「データを破棄したいのですが、どのデータが破棄されているかは確実にわかります」と考えてください。しかし、破棄されたデータがコミットされると、reflogから古いコミットを回復できることがよくあります。データは破棄されるのではなく、実際には孤立しています(孤立したコミットは定期的に削除されます)。

データを破壊していると思わない場合は、近づかないでください--force... 悪いことが発生する可能性があります。

これが--force-with-leaseやや安全な理由です。


13
ローカルのプッシュされていないコミットがある場合、それらは「失われます」(本当に失われたことは孤立していることを意味しますが、それらを回復することは明白ではありません)。
アンドリューマーシャル

1
おそらく--forceをプッシュするときにブランチ名を指定する必要があります。そうしないと、予想以上にプッシュする可能性があります。
user693960 2013年

1
@ user693960:Gitは、ユーザーが設定したものだけをプッシュします。
ディートリッヒエップ2013年

10
単にgit push --force<リポジトリ>と<枝>オプションを指定せずに、あなたの上流のセットを持っている場合は、あまりにも動作します。
ahnbizcad 14

2
例を挙げていただけます<repository>か?ですよoriginね? org/repo?それともrepo
MikeSchinkel

440

言うだけ :

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

その後

git push --force

8
私の場合git push origin <BRANCH-NAME>はうまくいきませんでした、私はgit push --force受け入れられた答えで説明されているように使用する必要がありました。
ガブリエル14

1
これは私にはうまくいきません。私たちを得なければgit push --force、そうでなければプッシュは通過しません。
ahnbizcad 2014

4
@ahnbizcad、動作するはずです。ブランチ名が正しいことを確認してください。
ウィリアム

3
説明の簡潔さを応援します!私は頻繁に使用しています
Vasikos

3
私のブランチを一時的に「保護解除」した後でのみ、これらのコマンドを正常に適用しました。これは、GitLabがホストするプロジェクトで発生しました。この問題が発生した場合は、これらのコマンドを適用する前に、このstackoverflow.com/a/32267118/1423345を参照してブランチの「保護を解除」してください。コミットメッセージの修正が完了したら、もう一度保護できます:)
John

262

最新以外のコミットを編集するには:

ステップ1:影響を受けるgit rebase -i HEAD~n最後のnコミットに対してインタラクティブなリベースを行う。(つまり、コミットメッセージを変更したい場合は、3コミットバックしますgit rebase -i HEAD~3

gitはこれらのコミットを処理するエディターをポップアップします。次のコマンドに注意してください。

#  r, reword = use commit, but edit the commit message

それがまさに必要です!

Step2:メッセージを更新したいコミットに変更pickrます。ここでコミットメッセージを変更しないでください。無視されます。次のステップでそれを行います。エディターを保存して閉じます。

リベースの「計画」を編集しても、ファイルの名前を変更するプロセスが開始されない場合は、次のコマンドを実行してください。

git rebase --continue

インタラクティブセッションに使用するテキストエディターを変更する場合(たとえば、デフォルトのviからnanoに)、次のコマンドを実行します。

GIT_EDITOR=nano git rebase -i HEAD~n

ステップ3:Gitは、r以前に置いたすべてのリビジョンに対して別のエディターをポップアップします。必要に応じてコミットメッセージを更新し、保存してエディタを閉じます。

ステップ4:すべてのコミット後、メッセージが更新されます。git push -fリモコンを更新したい場合があります。


21
承認された回答とは異なり、最新のコミット以外のコミットを変更する可能性があるため、これは承認された回答である必要があります。あなたは私の日を救った。ありがとうございました!
xZero

1
選択してくださいnは最後の3つのコミット用= 3:git rebase -i HEAD~3
HeikoS

リベースの「計画」を編集しても、ファイルの名前を変更するプロセスが開始されない場合は、を実行しgit rebase --continueます。インタラクティブセッションで使用するテキストエディタを変更する場合(デフォルトviからなどnano)、を実行しGIT_EDITOR=nano git rebase -i HEAD~nます。
ジェイミーバーチ

これを編集して、もう少し情報を追加しました。ぜひご覧ください。これが私がやりたいことの答えでしたが、ヘッダーがないのでスクロールしました。
2019年

@JamieBirchからの有用なコメントを回答に含めるよう提案された編集を行いました。
Notts90はモニカ

44

コンソールで次の2つの手順を使用します。

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

その後

git push -f

完了:)


Thx、それは最後のコメントを修正するためのステップだけですか、それとも古いコメントにも使用できますか?
ジェイ

@Jay返信が遅くなって申し訳ありません。これらの手順は、最後のコミットメッセージを修正するためのものです。
アブドゥルリズワン2018年

19

複数参照で使用するpush --forceと、結果としてすべてが変更されることに注意してくださいgit repoがpushするように構成されている場所に注意してください。幸い、更新する単一のブランチを指定することにより、プロセスをわずかに保護する方法があります。git manページから読んでください:

--forceはプッシュされるすべての参照に適用されるため、push.defaultをmatchingに設定したり、remote。*。pushで構成された複数のプッシュ宛先で使用したりすると、現在のブランチ以外の参照(ローカルの参照を含む完全にリモートの相手の背後にあります)。1つのブランチのみにプッシュを強制するには、refspecの前に+を使用してプッシュします(例:git push origin + masterはマスターブランチに強制的にプッシュします)。


3
非常に重要な注意。
peterh-2017年

サーバーに対するForcePush権限がないため、強制応答は機能しません。代わりに、以前のコミットメッセージを変更するコミットを実行したいと思います。コミットのコメントセクションに「コミットメッセージが変更されました」と書くことができます。
ヌレッティン2017

11

古い最後のではなく、コミット変更したい場合は、使用する必要がありますrebaseここで説明したように、コマンド、Githubのヘルプページ、上を改正高齢のメッセージまたは複数のメッセージのコミットセクションを



8
git commit --amend

次に、現在のウィンドウでメッセージを編集および変更します。その後は

git push --force-with-lease

2

別のオプションは、エラーを含むコミットオブジェクトを参照する追加の「エラータコミット」(およびプッシュ)を作成することです。新しいエラータコミットも修正を提供します。エラータコミットは、実質的なコード変更はないが重要なコミットメッセージのあるコミットです。たとえば、readmeファイルにスペース文字を1つ追加し、重要なコミットメッセージでその変更をコミットするか、gitオプションを使用します--allow-empty。それは確かにリベースより簡単で安全です、それは本当の履歴を変更せず、ブランチツリーをクリーンに保ちます(amend最新のコミットを修正する場合にも適していますが、古いコミットにはエラッタコミットが適している場合があります)。このようなことはめったに起こらないため、間違いを文書化するだけで十分です。将来、git logで機能キーワードを検索する必要がある場合、元の(誤った)コミットは、元のコミット(元のタイプミス)で間違ったキーワードが使用されたために表示されない可能性があります-ただし、キーワードは表示されますエラータコミットでは、タイプミスがあった元のコミットが示されます。次に例を示します。

$ git log
コミット0c28141c68adae276840f17ccd4766542c33cf1d
著者:最初の最後 
日付:2018年8月8日水曜日15:55:52 -0600

    エラータのコミット:
    このコミットには実質的なコードの変更はありません。
    このコミットは、以前のコミットメッセージに対する修正を文書化するためにのみ提供されます。
    これは、コミットオブジェクトe083a7abd8deb5776cb304fa13731a4182a24be1に関係します。
    元の誤ったコミットメッセージ:
        背景色を赤に変更
    修正(*ハイライトされた変更*):
        背景色を*青*に変更しました

コミット032d0ff0601bff79bdef3c6f0a02ebfa061c4ad4
著者:最初の最後 
日付:2018年8月8日水曜日15:43:16 -0600

    暫定コミットメッセージ

コミットe083a7abd8deb5776cb304fa13731a4182a24be1
著者:最初の最後 
日付:2018年8月8日水曜日13:31:32 -0600

    背景色を赤に変更

ロブ、これは有望に見えます。「エラッタコミット」を実行するために必要なコマンドを表示できますか。この投稿のみがこれらの条件でGoogleに表示されます。
ジム

1
「エラッタコミット」とは、以前の誤ったコミットを参照し、以前の間違いを文書化して修正を提供するメッセージを含む通常のコミットのことです。 git commit -m “fixed feature A”(gitがこれにe3ab7312のコミットIDを与えると仮定しましょう... ...(後でメッセージが正しくないことに気付いたので、readmeファイルにスペースを追加するなど、ファイルに重要でない変更を加えるか、—allow-emptygitオプションを使用してください)。 .. git commit -m “Errata commit for previous commit e3ab7312... original message should have been ‘fixed feature *B*’'' '
rob_7cc '11

1
...後で「機能B」への参照をgitログで検索する必要がある場合、エラータコミットが表示されますが、エラータコミットメッセージには、完全な追跡可能性を提供する元のコミットIDへの参照が含まれます。ところで「エラータコミット」という用語は特別なものではありません(gitには「エラータ」コマンドもオプションもありません)...エラー/タイプミスがあった以前のコミットを修正するのは、通常のコミットの私の専門用語です。
rob_7cc 2018

ロブ、それはうまくいった。SHAを使用することで、元のコミットを指す正しい説明を含む新しい空のコミットを追加できました。現在、両方がモジュールの「git chain」に表示されています。ありがとう!
ジム

ご利用いただきありがとうございます。同じテクニックを使用して、コミットメッセージの誤りを修正します。別の方法として、最近発見しました。git notes これは「エラッタコミット」と同じ目的を果たします。コミットメッセージには、単純にすべてのエラーを注釈にコミットする前のにメモを追加したり修正: https://git-scm.com/docs/git-notes
rob_7cc

0

これは私にはかなりうまくいきます、

git checkout origin / branchname

すでにブランチにいる場合は、プルまたはリベースすることをお勧めします

git pull

または

git -c core.quotepath=false fetch origin --progress --prune

後で簡単に使用できます

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

または、テキストエディターを開きたい場合は、

git commit --amend

コメントが多い場合は、テキストエディタを使用することをお勧めします。コマンドで好みのテキストエディターを設定できます

git config --global core.editor your_preffered_editor_here

とにかく、コミットメッセージの変更が完了したら、メッセージを保存して終了します。

そして実行する

git push --force

これで完了です


0

bitbucketパイプラインを使用している場合の同じ問題の追加情報

メッセージを編集

git commit --amend

サーバーにプッシュ

git push --force <repository> <branch>

次に、パイプラインのプッシュコマンドに--forceを追加します。

git ftp push --force

これにより、以前のコミットが削除され、現在のコミットがプッシュされます。

最初のプッシュ後に--forceを削除します

私はそれをbitbucketパイプラインで試してみました

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