如何检出远程/跟踪分支的最新版本(HEAD)?

10
在git中,如何检出我远程/跟踪分支的HEAD版本? 基本上,我想在git中执行“svn checkout”。 我认为我找到的最接近的东西是“git fetch”,但是从手册中,我不知道如何使用它来检出一个特定的文件?
3个回答

17

首先需要注意的是,远程仓库可以有多个分支;此外,对于本地开发和本地分支,HEAD表示当前所在的分支,对于远程,则是远程跟踪分支(符号引用)remote/HEAD表示远程默认分支。没有“分支的HEAD”这种东西;HEAD是指向分支(有时指向提交)的指针。

其次,Git操作(正如Novelocrat所写)在整个树级别上(仓库中的所有文件)。在Git中,你可以checkout一个分支(尽管你也可以将某个分支的文件版本checkout到工作目录中,但这是比较少见的操作)。


在Git中,你只能在本地分支的顶端创建新的提交。你不能直接在远程跟踪分支上创建提交,因为它们旨在跟随远程仓库的分支(如果这样做你会在fetch时丢失你的工作)。

因此,简单的"git checkout origin"(假设远程名称为origin),这是"git checkout origin/HEAD"的快捷方式,通常是"git checkout origin/master",将会把远程跟踪分支的状态检出到未命名分支中,这就是所谓的分离HEAD。如果你只想查看/浏览远程跟踪分支状态,这是一个不错的解决方法。

如果你使用"git checkout --track origin/master",会创建名为master的本地分支,它将跟随远程跟踪分支origin/master。请注意,git-clone会自动为远程origin的默认分支(origin/HEAD,通常是origin/master)设置此类本地分支(通常是master),所以你不必这样做。然后,在分支master上进行简单的"git pull"将获取(如果需要),并尝试将你的本地更改与远程存储库中相应分支中的更改合并。如果在远程没有更改,则处于"更新"状态,并且你的本地分支不会更改;如果在你的本地分支中没有更改,但在远程中有更改,则本地分支只是向前移到远程跟踪分支的状态,这称为"快进"。在这里,你可以将"git pull"视为非常粗略等效于"svn update"。
你还可以使用"git reset --hard origin"强制将你的本地分支回滚到远程跟踪分支的状态。请注意,--hard在这里表示强制覆盖工作目录,因此任何未提交的更改都将丢失!请谨慎使用。
最后,如果你想从远程跟踪分支中检出单个文件(即在工作目录中具有与远程跟踪分支相同的文件版本),可以简单地使用git-checkout的'pathspec'形式,即"git checkout origin -- file"。如果你只想查看文件在远程跟踪分支中的样子,请使用"git show origin:path/to/file"。
希望对你有所帮助。

4

Git 没有获取单个文件的概念。它总是通过网络移动提交。

一旦你使用 git clone 克隆了某个远程仓库,你可以使用 git checkout remotename/branch 命令,在你的工作副本中检出该分支上最新的文件版本。 如果你想要修改它们,你应该使用 git checkout -b <yourbranchname> remotename/branch 命令开始一个本地分支。 这可能更好地完成。

git branch --track mybranchname remotename/branchname
git checkout mybranchname

这样您的本地分支将“跟踪”远程分支,并默认从该分支进行推送和拉取。


1
有时您可能会遇到“分离的HEAD”问题:
$ git checkout origin/master
Note: checking out 'origin/master'.

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 c3ff60a rename

然后列出所有的分支,您将看到:
$ git branch -a
* (HEAD detached at origin/master)
  master
  remotes/origin/HEAD -> origin/master
  remotes/origin/master

如果您想要检出由remotes/origin/HEAD引用的分支,即remotes/origin/HEAD -> origin/master,您可以执行以下操作:
HEAD_BRANCH="$(git branch -r | grep 'HEAD')"
HEAD_BRANCH="${HEAD_BRANCH#*origin/HEAD -> *origin/}"
git checkout "$HEAD_BRANCH"

这样你就可以检出远程/跟踪分支的“HEAD”版本。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接