12

以下を使用して、マスターブランチを友人のリポジトリから作業ディレクトリのbranch_aにマージしました。

git pull my_friend master

マージされたバージョンにエラーがあることを発見しました。開発を続けるために、マージ前の最後のコミットに戻したいと思います。
私は試した:

git reset --hard HEAD

しかし、それは私を合併直後の状態に戻しました。(プルコマンドはコミットしますか?!)
私も試しました:

git revert HEAD

しかし、次のエラーを受け取りました:

致命的:コミット2d72d8f367b987d8c16f5cb1a543a6886acdcf83はマージですが、-mオプションが指定されていません。

私は何をすべきか?

4

3 に答える 3

31

HEAD現在のコミット(通常、現在チェックアウトされているブランチの先端)を指します。すでにマージをコミットしているのでHEAD、マージコミットを指しています。その前にコミットに戻りたい場合は、次を使用します。

git reset --hard HEAD^

「の^最初の親」を意味します。通常のコミットの場合はそれが唯一の親であり、マージコミットの場合は、マージしたときにチェックアウトしたコミット(つまり、マージしたブランチの前のヒント)です。

そしてもちろん、本当に迷子になった場合は、を開いてgitk、リセット先のコミットのSHA1をコピーして貼り付けるか(git reset --hard SHA1)を右クリックして、内でリセットしますgitk

ちなみに、revertそれが何をしていると思うかを意味するわけではありません(svnの方法で使用しているように聞こえますか?しかし、私はsvnを使用したことがありません)。git revert逆差分を適用することにより、前のコミットをキャンセル(元に戻す)するコミットを作成するために使用されます。すでに公開されている以前のコミットを1つ元に戻す場合に使用します。

于 2010-08-24T12:55:00.017 に答える
2

プルコマンドはコミットしますか?

はい、そうです。fetchプルはラッパーmergeです。マージする前に他の人の変更を確認したい場合は、fetch

于 2010-08-24T13:11:29.197 に答える
2

プル後、HEADは最新のコミットに移動されました。これは、最後に作業したコミットではなく、2つのブランチをまとめるマージコミットです。だから、これはreset HEAD何も変更しない理由です。

revert HEADマージコミットの変更を元に戻す新しいコミットを作成しようとしているため、これも実行したいことではありません。(これがエラーが表示される理由です。2つの親コミットのどちらに戻りたいかをgitに通知しないと、マージコミットを元に戻すことはできません。)

私はあなたが欲しいものは次のとおりだと思います:

git reset [--hard] HEAD^

マージコミットのにコミットにリセットされます。

于 2010-08-24T12:55:30.587 に答える