0

私はgitに関する知識がほとんどありません。悪く考えたくない。今日、変更を git にプッシュし始め、競合を解決したいと考えました。だから、私が今日やったことは次のとおりです。

git pull origin master               # 1
git commit -m "message"              # 2
git push origin master               # 3

git reset --hard origin/master       # 4  resulted in fatal error.

git add *                            # 5
git commit -a -m "my second commit"  # 6
git fetch origin master              # 7
git merge -s recursive \
            -X theirs origin/master  # 8 resulted in message 'up-to-date'
git pull origin/master               # 9 resulted in message 'up-to-date'

その後、ローカル リポジトリで行ったすべての変更が失われていることに気付きました。

戻る方法はありますか?

4

1 に答える 1

3

仕事を取り戻す

恐れる必要はありません: あなたのコミットはなくなったのではなく、単に参照されていないだけです!

まず、作業コピーがクリーンであることを確認してください。つまり、の出力は、git statusローカルの変更やステージングされたファイルがないことを示しています。その場合は、git stash作業中に変更を脇に置いておくために実行してください。

今実行します:

git reflog

現在のブランチが最近指し示したコミットの名前 (sha ハッシュ) とメッセージのリストが表示されます。メッセージ「message」(または不正なマージの前の最後のコミット) を含むコミットの名前を探します。そのコミットの sha をコピーし、次のコマンドでそのコミットをポイントmasterします。

git reset --hard <sha>

作業コピーを見回してください。あなたはあなたの仕事を取り戻すべきです!まだそこにない場合は、reflog に戻り、作業を含む適切なコミットが見つかるまで履歴をさかのぼります。これで、必要に応じて再マージし、必要に応じて作業を元に戻すことoriginができます。

最初に変更を行った場合は、現在の状態に満足したらstashed元に戻してください。git stash pop

何が悪かったのか

この名前は、リモート トラッキング ブランチorigin/masterと呼ばれる特別な種類のブランチを指します。基本的に、これは別の git リポジトリにあるブランチの最新の既知の状態と同期される読み取り専用のミラーです。この場合、リモートのブランチです。しかし、実際にいつ更新されるかのルールは少し複雑です。masterorigin

git pull origin masterまたはのような完全に指定されたコマンドを実行するgit fetch origin masterと、git はからコミットをフェッチしますが、更新ではなく、という特別な参照にコミットの名前を保存します。リモート追跡ブランチを最新の状態に保つには、代わりに引数なしで実行してください。masteroriginFETCH_HEADorigin/mastergit fetch

つまり、reset(#4) と(#8) の両方が!mergeの古いコミットをターゲットにしていた可能性があります。master

やりたいこと

アップストリームの作業を最新の状態に保つには:

# Update all remote-tracking branches with the lastest changes
git fetch
# Merge them in
git merge origin/master

作品を共有するには:

git push origin master
于 2013-11-11T16:12:03.347 に答える