2016-06-29 5 views
3

ローカルブランチestimationに複数のコミットを行い、リモートブランチestimationにプッシュしました。複数のコミットを戻す

ここで、最後の3つのコミットを完全に削除します。

私はgit reset HEAD^git reset HEAD --hardを3回試みましたが、変更をプッシュしようとしたときに、HEADの先端が整列していないと不平を言いました。

どうすればよいですか?

はEDIT:

歴史は、次のようになります。

commit e572aab4e18

commit e21e7310bc4

commit 4f372a513da

commit 31a4ac607ae

commit a1a6e3f02dd

私がトップ4を削除し、バックcommit a1a6e3f02ddに行くと同じHEAD上のローカルとリモートの両方のブランチを作りたいと思います。

+0

この回答を探すことができます:http://stackoverflow.com/a/1470452/1475228 –

答えて

3

まず:あなただけがを共有していないブランチのためにこれを行う必要があります。ブランチが他の人によってチェックアウトされている場合、このプロセスはローカルコピーをリモートと同期させず、コミットをもうブランチに送ることはできません。これは並べ替えることができますが、潜在的に混乱です。

xxxxxxx Bad commit #3 
yyyyyyy Bad commit #2 
zzzzzzz Bad commit #3 
wwwwwww This and everything before it are fine 

あなたはwwwwwwww後にコミットをドロップすると、一致するリモートブランチを修正したい:

は私が正しくあなたを理解していれば、あなたはこのような状況にいる、ということを考えます。

まず、外科手術をしている枝をバックアップしてください。厄介な場合は元に戻してから、削除したいブランチに戻ってください。

git checkout -b broken-estimation 
git checkout estimation 

git logを実行して、保存したい最初のコミットのSHA1を見つけます。あなたはSHA1が、それにブランチをリセットすることを持っていたら:kkkkkkは最初のSHA1です

git reset --hard kkkkkkk 

あなたは枝の上に残しておきたいコミット。

git logを再度実行して、このブランチの先端として目的のSHA1を確保してください。 git log出力に表示される最初のコミットである必要があります。十分なコミットを整理していない場合は、git reset --hardを適切なSHA1に戻して、より多くのコミットを削除してください。 git reset --hard kkkkkkk続い

git checkout -B estimation broken-estimation 

と先端にあなたがしたいコミットのSHA1を見つけるために、git logをやり直し、:

あなたはあまりにも多くのコミットを削除した場合、あなたが取ったバックアップからestimation枝を復元(コミット後に望ましくないコミットを削除するには、kkkkkkkが実際に欲しいSHA1です)。

希望の状態に支店を持ってたら、古いバージョンの交換、リモートに固定ブランチをプッシュすることができます:あなたはあなたの修理が正しいことを特定できたら

git push -f the_proper_remote estimation 

は、あなたが枝のバックアップコピーを削除することができます。

git branch -d broken-estimation 
+0

これは完璧に機能しました。 –

5

すでにコミットを押された場合(と力押しを行うと、リモートリポジトリ内のデータを上書きしたくない、あなたが行うことができますカップルの事があります):

あなたはgit revertの代わりに使用することができますgit reset

$ git revert ~4..HEAD 

それとも、git checkoutを使用して、変更をコミットすることができます。

$ git checkout ~3 -- . 
$ git commit 

を10は3回の個別の復帰コミットを行います。 git checkoutメソッドを使用すると、1回のコミットで変更を元に戻すことができます。あなたのケースでは

、あなたはこれを行うことができます:

$ git reset --hard $REMOTE/$BRANCH 
$ git checkout a1a6e3f02dd -- . 
$ git commit 
+0

ありがとうMipadi。私は少し混乱していますので、私はより多くの情報を提供しました。あなたはそれを見てみることができます –

+0

@ chintans:私の答えを更新しました。 – mipadi

+0

ありがとう、しかし私のブランチは 'a1a6e3f02dd'ですが、私は4つのコミットをすべて完全に削除して、私のローカルリモートbrachが両方とも' a1a6e3f02dd'を指し示しているようにしたいと思います。 –

0

は、次の3つのコマンドでそれを行うことができます。

まず、リモートブランチの歴史を書き換える:

git push origin +a1a6e3f02dd:estimation 

注意してください、 "+"は "強制押し"になります。このコマンドは、 "a1a6e3f02ddを起点/推定ブランチの先端にします。"

git checkout estimation 
get reset --hard origin/estimation 

すれば完了です。それが終わったらだ

は、あなたは自分の地元の「推定」ブランチはリモート1と同期して取得する必要があります!しかし、あらかじめ注意してください。 'git reset -hard'は、あなたがそのプロジェクトに持っているコミットされていない作業を爆破します。

「見積もり」ブランチで作業している人がいて、すでに4つの「悪い」コミットをブランチに引き込んだ人がいる場合は、少し混乱が生じます。しかし、私の経験では、「共有支店の歴史を書き直すことはありません」という警告と勧告はすべて誇張されています。それは再提出する必要があります:の寿命が長い共有ブランチの履歴を書き換えないでください。

関連する問題