假设远程是origin
,分支是master
,并且说您已经master
签出,可以尝试以下操作:
git fetch origin
git reset --hard origin/master
这基本上只是将当前分支指向HEAD
远程分支。
警告:如评论中所述,这将丢弃您的本地更改并用 origin 上的任何内容覆盖。
或者您可以使用管道命令来执行基本相同的操作:
git fetch <remote>
git update-ref refs/heads/<branch> $(git rev-parse <remote>/<branch>)
git reset --hard
编辑:我想简要解释一下为什么会这样。
该.git
文件夹可以保存任意数量的存储库的提交。由于提交哈希实际上是对提交内容的一种验证方法,而不仅仅是一个随机生成的值,它用于匹配存储库之间的提交集。
分支只是指向给定哈希的命名指针。这是一个示例集:
$ find .git/refs -type f
.git/refs/tags/v3.8
.git/refs/heads/master
.git/refs/remotes/origin/HEAD
.git/refs/remotes/origin/master
这些文件中的每一个都包含一个指向提交的哈希:
$ cat .git/refs/remotes/origin/master
d895cb1af15c04c522a25c79cc429076987c089b
这些都是 git 内部的存储机制,独立于工作目录工作。通过执行以下操作:
git reset --hard origin/master
git 会将当前分支指向与 origin/master 指向的相同的哈希值。然后它强制更改工作目录以匹配该哈希处的文件结构/内容。
要在工作中看到这一点,请继续尝试以下操作:
git checkout -b test-branch
# see current commit and diff by the following
git show HEAD
# now point to another location
git reset --hard <remote>/<branch>
# see the changes again
git show HEAD