3

コマンドを使用して、Gitで6つのコミットに戻る必要がありました

git checkout idofthecommit

私がやってきたことは、コミット、コミット、コミットを続けることでした。私は本当の新しいブランチを作成していないので、外部リポジトリに git push すると

git push origin master

すべてが最新であることがわかります。

これは、実際にはマスターに変更を加えていないことを意味します。

行っているコミットを master ブランチに移動するにはどうすればよいですか?

4

1 に答える 1

6

実行したコマンドの説明が正しければ、これまで作業してきたものにブランチを作成して、信頼できる名前付き参照を作成します ( git branch WIP HEAD)。次に、マスター ( ) に対してリベースし、マスターgit rebase masterをチェックアウトして WIP にマージします。

これを簡単にテストして状況を再現し、必要なコマンドとその機能を調べることができます。これgit graphはにエイリアス化されてgit log --graph --oneline --decorate --abbrev-commitおり、きれいな git ログを生成するだけです。

8 つのコミットでデモ リポジトリを作成し、6 つをチェックアウトして、さらにいくつかのコミットを作成します。

$ cd /tmp && git init demo && cd demo
$ for msg in one two three four five six seven eight; do echo $msg>file && git add file && git commit -m $msg; done
$ git checkout HEAD~6
$ for msg in nine ten eleven; do echo $msg>file && git add file && git commit -m $msg; done

それでは、これを見てみましょう:

$ git graph --all
* e81b31c (HEAD) eleven
* c005e75 ten
* c567d25 nine
| * 4d28c3d (master) eight
| * 380f715 seven
| * 9966c80 six
| * 6b2f757 five
| * e43d079 four
| * ce0ff34 three
|/
* 8d5a6e1 two
* 1f880ae one

つまり、これは 8d5a6e1 から取られた機能ブランチのように見えます。唯一の特別な点は、唯一の参照が HEAD であることです。ここでブランチ参照を追加すると、通常のフィーチャー ブランチになります。

この作業ブランチにブランチ タグを付ける前に誤って master または他のブランチをチェックアウトすると、この新しいコミット チェーンの先頭への参照が失われます。これでブランチが失われました。この場合、reflog を使用してそのチェーンの最後のコミットを見つけ、そのコミットへのブランチ参照を追加する必要があります。これは、上記のデモ リポジトリから確認できます。

$ git reflog
e81b31c HEAD@{0}: commit: eleven
c005e75 HEAD@{1}: commit: ten
c567d25 HEAD@{2}: commit: nine
8d5a6e1 HEAD@{3}: checkout: moving from master to HEAD~6
4d28c3d HEAD@{4}: reset: moving to 4d28c3d
....

reflog から、いくつかのコミットが戻っていることがわかります。HEAD~6 をチェックアウトし、さらに 3 つのコミットを追加しました。その後、発行git branch recover-commits e81b31cしてその一連のコミットを指すブランチを取得し、それらを回復できます。

于 2013-01-27T10:03:28.053 に答える