2012-03-21 4 views
192

私はちょうどgit rebaseでいくつかのコミットを押しつぶし、git push --force(悪いですが、私が知っている)でした。強制更新後のGitプル

他のソフトウェアエンジニアは異なる履歴を持ち、git pullを実行するとGitがマージされます。 rm my-repo; git clone [email protected]:my-repo.gitを実行する以外は、これを修正する方法はありますか?

私はgit push --forceの反対のようなものが必要ですが、git pull --forceは意図した結果が得られませんでした。新しいコミットを受信するには

+10

彼らは彼らのブランチを削除し、全体のレポを削除しなくても、あまりにもそれを再作成することができます: '[フォースGitリポジトリのgitのチェックアウトのマスター&& gitのブランチ-Dテスト&& gitのチェックアウト-bテスト起源/ test' – Florian

+1

可能な重複にしますプルでローカルファイルを上書きする](http://stackoverflow.com/questions/1125968/force-git-to-overwrite-local-files-on-pull) – gpoo

答えて

318

git fetch 

をリセットあなたはgit resetを使用して、ローカルブランチのコミットをリセットすることができます。

インデックスと作業ツリーをリセットします

:ドキュメントがそれを置くように、しかし注意してください

git reset origin/master --hard 

:ローカルブランチのコミットを変更するには

。 <コミット以降の作業ツリー内の追跡されたファイルへの変更は破棄されます。

ローカルで変更したものを実際に保持したい場合は、代わりに--softをリセットしてください。ブランチのコミット履歴は更新されますが、作業ディレクトリ内のファイルは変更されません(コミットできます)。あなたが他のどのの上、お近くのコミットを再生することができ

リベース

git rebaseを使用して/ブランチにコミット:

git rebase -i origin/master 

これにより、各を適用する方法を選択することができ、対話型モードでリベースを呼び出しますあなたが一番上にリベースしている履歴にない個々のコミット。

削除したコミット(git push -f)が既にローカル履歴にプルされている場合、再適用されるコミットとしてリストされます。リベースの一部として削除する必要があります。ブランチの履歴に追加され、次のプッシュでリモート履歴に再び表示されます。

上記のコマンド(またはその他のコマンド)の詳細と例については、ヘルプgit command --helpを使用してください。

+0

ローカルコミットを既に行った場合はどうなりますか? – iblue

+0

@iblueすべての変更を失うか、コミット履歴を削除するか、ファイルの変更を維持するか、新しいヘッドの上に各コミットを適用するかを選択します。最も簡単なオプションはおそらくソフトリセットです。 – AD7six

+0

@iblueあなたの同僚が 'git reabse origin/master 'を使う時、彼らはすでにコミットしていますが、gitはあなたのコミットをコミットの裏に書きます。 – Tim

11

これは、あなたが望んでいないコードをすでに持っているブランチを修正することはありません(その方法については下記を参照してください)が、あるブランチを引っ張り、それをきれいにしたい「先読み」の起源/いくつかの分岐の)その後、単に:

git checkout some-branch # where some-branch can be replaced by any other branch 
git branch base-branch -D # where base-branch is the one with the squashed commits 
git checkout -b base-branch origin/base-branch # recreating branch with correct commits 

注:すべて注2

それらの間& &を置くことによって、これらを組み合わせることができます:フロリアンはコメントでこれを述べたが、誰読み込み回答を探すときにコメントしますか?

注3:汚染されたブランチがある場合は、新しい "ダムブランチ"に基づいて新しいブランチを作成し、チェリーピックだけをコミットすることができます。

例:

git checkout feature-old # some branch with the extra commits 
git log     # gives commits (write down the id of the ones you want) 
git checkout base-branch # after you have already cleaned your local copy of it as above 
git checkout -b feature-new # make a new branch for your feature 
git cherry-pick asdfasd # where asdfasd is one of the commit ids you want 
# repeat previous step for each commit id 
git branch feature-old -D # delete the old branch 

今特色-新しい余分な(おそらく悪い)なしで、あなたのブランチがコミットです!

+0

これは私が本当に欲しかったものです。誰かがマスターブランチをrebasedしましたが(神がどんな理由を知っているか)、私はコミットしたかったり何かをしたいと思っていました。だから私がしなければならなかったのは、私のローカル支店(これは本当に変だと感じました)を削除し、もう一度チェックアウトすることでした。ありがとう! –

+0

@ peter-mortensen編集はhttps://stackoverflow.com/help/editingに従って相当量にする必要があります。 –