开发者

Simpler explanation of path for GIT checkout command

In the git documentation for the checkout command the following text is found:

...If no paths are given, git checkout will also update HEAD to set the specified branch as the current branch....

Can anyone give a simpler explanation of what this means? I'm开发者_JAVA技巧 sorry if it seems simple, and reading through that page, I can't seem to come up with what it means exactly. Sorry if this seems basic..

In particular I am confused on how checkout is updating HEAD. I usually envision checkout affecting the working directory -- is this an ability unique to git in that you are updating your local copy of the repository for the purposes of working with it later?


Version A: (specifying only the branch)

git checkout <branch>

Gets all files for that <branch> and places HEAD (a pointer to "where am I now") at the branch specified.

Version B: (specifying a path only)

git checkout <file>

Gets the latest version of <file> and leaves HEAD alone.


HEAD is a pointer to the commit your working copy was checked out from. so if you checkout a branch (or commit or tag) then HEAD is set to that commit.

this information is stored in the textfile .git/HEAD, you can simply look at its content:

$ cat .git/HEAD
# refs: refs/heads/master


It means that git checkout branchname will

  1. Check out the files from the tip of that branch into your working directory, and
  2. Set your HEAD to the tip of that branch, so that you are now "on" it.

Example:

 jb@apto % git branch         
 * develop
   master
   next
 jb@apto % git checkout master
 Switched to branch 'master'
 jb@apto % git branch
   develop
 * master
   next


If you are in a DETACHED HEAD mode (see this question), you could easily reset HEAD to the master branch:

Simpler explanation of path for GIT checkout command

Here a 'git checkout' would reset HEAD to the tip of master branch.
(More in "A Visual Git Reference")
It will also update both the index and the working directory.
So it is not just about resetting the pointer 'HEAD'.


With Git 2.23+ (August 2019), use git switch instead of the confusing git checkout, coupled with git restore (for files only)

git switch master

That would switch HEAD back to master.

You can still reference a commit directly (detached HEAD) with git switch --detach <acommit>.
No more checkout (which deals both with branches and files).

0

上一篇:

下一篇:

精彩评论

暂无评论...
验证码 换一张
取 消

最新问答

问答排行榜