78

私はまだ Git の (基本的な?) 細かい点を学ぼうとしていますが、なんとかトラブルに巻き込まれました。HEAD でいくつかの間違いを犯したことに気付き、古いコミットをチェックアウトして、そこからコーディングを開始しました。プッシュしようとすると、現在のコミットが遅れており、HEAD とマージする必要があると言われました。Git では「git pull」を推奨しています。ただし、HEADには無視したいコードがあります。この問題を解決するにはどうすればよいですか? 助けてくれてありがとう。

フローチャート:

-------- HEAD (bad) ---------------------- + (behind conflict, requires
     \                                    /   merge with HEAD, which is
      \------- Current commit (good) ----/    bad and needs to be ignored)
4

8 に答える 8

99

できることは次のとおりです。

git checkout <branch-to-modify-head>
git reset --hard <commit-hash-id-to-put-as-head>
git push -f

プッシュを強制しない場合、git は次のエラーをスローします: 現在のブランチの先端が遅れているため、更新は拒否されました。

これにより git 履歴が改ざんされることに注意してください。別の方法として、不要なコミットを元に戻す方法があります。そうすれば、履歴を保持できます。

git revert commit-id

乾杯

于 2014-11-30T05:30:18.233 に答える
28

リポジトリが他の人によって使用されていない場合はgit push -f、リモートブランチを上書きするために安全に行うことができます。

于 2012-12-19T16:01:19.333 に答える
19

私がそれを行う方法は次のとおりです。

git reset --hard <commit-SHA>
git push origin HEAD:<name-of-remote-branch>

これは git が推奨する方法git push -fであり、開発チームの他の全員にとっては少し問題があるかもしれません

于 2016-01-20T12:55:25.673 に答える
9

ANeves の言う通り、"git push -f" は、リポジトリを使用している唯一の人であるためにのみ機能します。これは、ほとんどの人にとって受け入れられる解決策ではありません。

現在のコミット履歴は次のとおりです。

---A-B < HEAD (bad)
    \
     C < my_branch (good)

これにはあなたが望む解決策があります: Git の別のブランチのブランチを「マージ」ではなく「上書き」するにはどうすればよいですか?

要点をまとめると、

git checkout my_branch
git merge -s ours HEAD

これにより、HEAD のブランチのすべての変更が削除され、次のようになります。

--A-B-D < HEAD, my_branch (both good)
   \ /
    C

この場合、D は事実上 C と同じであり、親が異なるだけです。

于 2012-12-20T01:39:00.270 に答える