5

コミットをプッシュしたところ、コミットメッセージを変更する必要があることに気付きました。

だから私のローカルレポで私はした:

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

しかし、これをプッシュしようとすると、大量のエラーメッセージが表示されました

Updates were rejected because the tip of your current branch is behind
hint: its remote counterpart. Merge the remote changes (e.g. 'git pull') and try again

メッセージの修正方法が間違っていたのでしょうか? 結局、すべてのリポジトリをリセットしてから、新しいメッセージで再度コミットする必要がありました。

だから私の質問は、すでにプッシュされたもののコミットメッセージを修正する適切な方法は何ですか?

4

2 に答える 2

6

簡単な答え: 適切な方法はありません。

以前のコミットを、似てgit commit --amendいるが変更されたコミットに「置き換える」ことです。元のコミットを実際に変更していません。それはまだそこにありますが、それを参照するものはもう何もなく、何かが参照し始めない限り、最終的にガベージコレクションされます。

これは、ローカルで行う場合は透過的です。しかし、コミットをプッシュした時点では、基本的に手遅れです。あなたはすでにコミットをプルし、そのコミットに基づいて作業を行っている可能性のある他のユーザーと共有しています。そのコミットを別のコミットに置き換えることはできません。

コミット A を作成したとしましょう (コミット B の後):

B - A    <- master

次に、気が変わって A を修正すると、実際には新しいコミット A' が作成されます。現在のブランチは、この新しいコミットを指します。元のコミット A はまだ存在しますが、それを指しているブランチはありません

B - A
  \ 
    A'  <- master

最初に A を押した場合

local                            remote
B - A   <-master                 B - A    <- origin/master

そして修正します。通常のプッシュは許可されません。そのプッシュは早送りマージではないためです。

local                            remote
B - A                            B - A    <- origin/master
  \ 
    A'  <- master

問題を悪化させる:他の人があなたのコミットをすでに使用している可能性があります

local                            remote
B - A                            B - A - C   <- origin/master
  \ 
    A'  <- master

修正を行ってから、強制プッシュを行うことができますgit push -f。しかし、それは元のコミットに基づいて作業を行っている他の開発者に問題を引き起こします。これは、リベースと同じ問題です (acommit --amendは一種のミニ リベースのようなものです)。詳細については、Git Pro ブックの「リベースの危険性」セクションを参照してください。

local                            remote
B - A                            B - A - C
  \                                \
    A'  <- master                    A'   <- origin/master
于 2013-06-18T19:08:37.957 に答える