簡単な答え: 適切な方法はありません。
以前のコミットを、似て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