4

設定

次のような単純なリポジトリを想像してみましょう。HEADを指していることがわかります。master

$ git log --decorate --graph
* commit 99d20608088ba9c74b57e36a1b0b79ff2be42d68 (HEAD, master)
| Author: Saaman <user@domain.com>
| Date:   Wed Apr 17 16:53:50 2013 +0200
|
|     My third commit
|
* commit a4a040c8b5c3923a2ba0f652caae0540f84c4c98
| Author: Saaman <user@domain.com>
| Date:   Wed Apr 17 16:53:27 2013 +0200
|
|     My second commit
|
* commit c5d20f203c11acbb9238ab77581e27a15ccde25e
  Author: Saaman <user@domain.com>
  Date:   Wed Apr 17 16:52:58 2013 +0200

      My first commit

$ git reflog
99d2060 HEAD@{0}: commit: My third commit
a4a040c HEAD@{1}: commit: My second commit
c5d20f2 HEAD@{2}: commit (initial): My first commit

活動

それでは、いくつかのチェックアウト操作を実行しましょう

$ git checkout master
Already on 'master'

$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to master
99d2060 HEAD@{1}: commit: My third commit
a4a040c HEAD@{2}: commit: My second commit
c5d20f2 HEAD@{3}: commit (initial): My first commit

$ git checkout HEAD

$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to master
99d2060 HEAD@{1}: commit: My third commit
a4a040c HEAD@{2}: commit: My second commit
c5d20f2 HEAD@{3}: commit (initial): My first commit

reflogはそれを示しています

  • チェックアウトHEADしても reflog にエントリが作成されない
  • チェックアウトするmasterと、reflog に新しいエントリが挿入されます (からにHEAD移動したことを示します) 。mastermaster

他のことを試してみましょう

$ git checkout head
Note: checking out 'head'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, 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 99d2060... My third commit

$ git reflog
99d2060 HEAD@{0}: checkout: moving from master to head
99d2060 HEAD@{1}: checkout: moving from master to master
99d2060 HEAD@{2}: commit: My third commit
a4a040c HEAD@{3}: commit: My second commit
c5d20f2 HEAD@{4}: commit (initial): My first commit

reflog が表示されるようになりました

  • head同じ SHA 99d2060 に解決されました
  • HEAD現在は切り離されています
  • 新しいエントリが reflog に挿入されました (からにHEAD移動したことを示します) 。masterhead

質問

私はこれらの行動を理解するのに苦労しています。

  • チェックアウト(で指しているブランチ) がHEAD行うのに、チェックアウトしても reflog に何も生成されないのはなぜですか?masterHEAD
  • headチェックアウト(小文字) がデタッチHEADされるのに、git は同じコミットに正常にピールできるのはなぜですか?

注:これらのテストは、Windows/msysgit で実行されています。

4

1 に答える 1

1

コードを分析した後、ここにいくつかの答えがあります:

  • git checkout HEADHEAD が分離されているかどうかに関係なく、何もログに記録しません。
  • 「マスター」から「マスター」への移動は、ブランチもそのターゲットも変更されないため、実際には有用な情報ではありません。ログを埋めるには少し役に立たない情報ですが、まったく無害です。
  • git checkout headLinux では動作しません。ファイル システムでは大文字と小文字が区別されないため、Windows でのみ機能します。
于 2013-04-23T08:18:55.383 に答える