2012-05-10 20 views
1

新しい開発者が大きなgitリポジトリに夢中になり、 彼のすべての変更を捨てることができます。Git分岐が分岐した - 変更を元に戻す

私の問題:私たちのgit hosterはpush --forceを許可していないので、最初にプルする必要があります。

私がそうした場合、私はたくさんのマージと競合があり、解決には何の意味もありません。 他の人が行った変更を元に戻すための最良の方法は何ですか?

+0

あなたのgitホストは何ですか? – CharlesB

+0

http://beanstalkapp.com – theduke

答えて

1

にあります。

私は同じ状況にある他の人のために私のソリューションをここに掲載しています。 これはおそらく簡単な方法なので、ご存じの方は、お気軽に投稿してください。


まず、すべての変更をコミットして、作業ディレクトリがきれいになるようにします。変更が残っていないことをgit statusで確認してください。

次に、新しい一時ブランチを作成して変更を保存します。

git branch tmp 

最後に、あなたとリモートブランチが分岐したことがわかります。 63da978a9a4620790b75dfbae86d658a65dc3e25のようなコミットハッシュが必要です。

見つかったら、マスターブランチをそのコミットにリセットします。

git reset --hard COMMIT 

変更をリモートから引き出します。競合は発生しません。

git pull origin master 

これで、破棄する必要があるコミットを元に戻すことができます。すべての変更を使用してTMPブランチをマージバック:あなたはすべての権利を行っている場合は

git revert COMMIT1 

は、プロセスを完了するだけで1最後のステップがあります。

git merge tmp 

ここでも、競合が発生しましたなかったはずです。

これで、もう一度プッシュできる最新のブランチが作成されました。ハレイ!

git push origin master 
0

競合を回避するには、をマージしないでください(git pull)。とにかく

あなたがプッシュ--forceを使用できない場合、唯一の選択肢は私が必要なものを行うための方法を発見したgit revert

1

試すことができるトリックがあります。

git push origin :master 

これにより、masterというブランチが効果的に削除されます。いいことは、あなたはそれを行う許可を必要としないことです(私が知っている、奇妙なことです)。

ことを行うのならば、あなたはそれがあなたのリポジトリ上にあるように正確masterブランチを再作成します

git push origin master:master 

これを行うことができます。

競合/マージを処理する必要はありません。 これは決して使用されるべきではありません(あなたの場合を除いて、それは簡単な方法です)。

このトリックでは、この開発者が行ったすべてのコミットを取り除くことができます(それらのトレースは一切ありません)。


は、その行うには、「通常」の方法があります:

  • を戻します枝
  • プッシュの上に障害のあるコミットを戻すのフェッチを
  • リベース支店でのあなたの仕事
+0

悲しいことに、私のGitのホスティング業者は、マスターブランチのリモート削除も防止しているので、私の場合はうまくいきません。 – theduke

+0

ああ、それは変だけど、マージされていないブランチは削除できますか? (あなたの質問には関係ありません、ちょうど好奇心から外れています) –