ブランチを作成せずにソース コードのタグ付きバージョンをチェックアウトすると、Git はどのブランチにも関連付けられていないことを示します。変更を加えてチェックインさせていただければ幸いです。それらの変更はどこに行きますか?「マスター」に戻すと、それらは消え (マスターにあったものによって上書きされ)、再び見つけることができないようです。何を与える?Git で、本質的に匿名のブランチに対して変更をコミットできる場合、それらを元に戻すことができるでしょうか?
4 に答える
コミットはどのブランチにもないため、SHA1 を使用してその特定のコミットをチェックアウトしない限り、作業ディレクトリに表示されません。reflog
リポジトリからチェックアウトした内容の変更を追跡する を調べると、コミットを見つけることができます。タグが次のXXX
ようなものである場合は、次のように表示されます。
$ git reflog
7a30fd7... HEAD@{0}: checkout: moving from master to XXX
ddf751d... HEAD@{1}: checkout: moving from 96c3b0300ccf16b64efc260c21c85ba9030f2e3a to master
96c3b03... HEAD@{2}: commit: example commit on tag XXX, not on any branch
7a30fd7... HEAD@{3}: checkout: moving from master to XXX
checkout
これは、作業ディレクトリでコミットを確認するために 必要な SHA1 を示しています。
$ git checkout 96c3b03
Note: moving to "96c3b03" which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 96c3b03... example commit on tag XXX, not on any branch
$ git checkout -b newbranch
$ git branch #lists all branches
feature1
master
* newbranch
checkout
gitがすべてのプロジェクト ファイルを特定のコミットの時点でファイル システム (作業ディレクトリ) に配置することに気付くまで、これは最初は少し奇妙に思えました。実際には、作業ディレクトリはローカル Git リポジトリのブラウザーとして機能します。したがって、変更はリポジトリで上書きされていません。マスターをチェックアウトしたときに作業ディレクトリに表示されていないだけです。
はい、reflog に含まれます。
次のように、いつでもブランチに名前を付けることができます。
git checkout -b my-branch-name
または、(上記のように git reflog を使用して) SHA1 を見つけて、新しいブランチなしでコミットをマスターにマージして戻すことができます。
git checkout master
git merge SHA1
2 番目の質問に答えるには、git reset --hard yourtagname を使用します。
何が起こるかというと、基本的にタグ名でブランチをフォークし、同じブランチにとどまりました。古いフォークのコミットはまだそこにあります...見にくいだけです。古いフォークを見つけるには、reflog を使用する必要がある場合があります。