web-dev-qa-db-ja.com

ブランチのないタグに対してGitコミット

ブランチを作成せずにタグ付きバージョンのソースコードをチェックアウトした場合、Gitはどのブランチにも関連付けられていないことを示しています。変更を加えてチェックインさせていただきます。これらの変更はどこに行きますか? 「マスター」に切り替えると、それらは消えて(マスターにあったもので上書きされ)、再び見つけることができないようです。何ができますか? Gitが本質的に匿名のブランチであるものに対して変更をコミットできるようにした場合、確かにそれらを取り戻すことができますか?

56
Andrew

コミットはどのブランチにもありませんなので、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

Git checkoutがすべてのプロジェクトファイルを特定のコミットとして配置することに気づくまで、これは最初は少し奇妙に思えました私のファイルシステム(作業ディレクトリ)に。実際には、作業ディレクトリはローカルGitリポジトリのブラウザとして機能します。したがって、変更はリポジトリで上書きされていません。マスターをチェックアウトしたときに、作業ディレクトリに表示されません。

79
Paul

はい、彼らはreflogsにいます。

次のように、いつでもブランチに名前を付けることができます。

git checkout -b my-branch-name
8
Dustin

または、SHA1を見つけて(上記のようにgit reflogを使用して)、次のようにして、新しいブランチなしでコミットをマスターにマージして戻すことができます。

git checkout master
git merge SHA1
5
gjvis

2番目の質問に答えるには、git reset --hard yourtagnameを使用します

何が起こるかについては、基本的にタグ名でブランチを分岐し、同じブランチにとどまっていました。古いフォークでのあなたのコミットはまだそこにあります...彼らはただ見るのが難しいです。古いフォークを見つけるには、reflogを使用する必要がある場合があります。

0
Clintm