41

何が起こったかは次のとおりです。

私は 2 つのリモート git ブランチを持っています:masterfeature1. なぜかブランチに使わないといけないのですが、いつ使うgit push --forceとブランチもプッシュしてしまうのfeature1かわかりませんでした。その後、ローカルブランチをリモート リポジトリにプッシュしたところ、問題が発生しました。git push --forcemastermaster

幸いなことに、私のローカル ブランチはリモートからそれほど遠くありません。基本的に、私のリモートmasterには、ローカルの前にマージされた 2 つのプル リクエストがありますmaster

私の問題は次のとおりです。プルリクエストを再度開いて再マージできますか? マージリクエストのコミット版があることに気がついたので、単純にプルリクエストを新規作成すると何かおかしくないか心配です。理想的には、2 つのリクエストのマージをやり直したいだけです。

この災害から回復する他の方法はありますか? --force私はそれが本当に、本当に悪い選択であることを学びました。:(

更新、何が起こったかの例:

次のブランチがあります。

master
feature1
origin/master
origin/feature1

GitHub の を使用して 2 つのプル リクエストを統合しますAuto merge pull requestsmaster次に、ローカル マシンでブランチをフェッチしませんでした。したがって、私origin/masterのバージョンはリモート マスターより 2 つ遅れていると思います。

その後、誤って を使用git -f pushしてリモート ブランチを上書きし、リモート リポジトリのプル リクエストからのコミットを失いました。

他の貢献者の履歴を台無しにすることなく、どうすれば回復できますか?

4

2 に答える 2

88

github を使用する場合は、GHugo の回答を参照してください。これは、github を使用した簡単な手順を示しています。社内 (またはその他の非 github) インストールを使用している場合は、読み進めてください。

古いコミットmasterにリセットして別のpush -f. 通常、関連する手順は次のようになります。

# work on local master
git checkout master

# reset to the previous state of origin/master, as recorded by reflog
git reset --hard origin/master@{1}

# at this point verify that this is indeed the desired commit.
# (if necessary, use git reflog to find the right one, and
# git reset --hard to that one)

# finally, push the master branch (and only the master branch) to the server
git push -f origin master

ただし、これによりリモートmasterが最後に取得された状態git fetchまたは同等の状態に復元されることに注意してください。最後にフェッチした後に他の人がプッシュしたコミットはすべて失われます。ただし、これらのコミットは引き続きreflog で使用できるため、上記のような手順を使用して復元できます。

于 2012-09-24T17:06:35.807 に答える