我有一个脚本可以刷新最新提交的索引,但 git 还可以暂存新旧提交之间更改的文件,这是我不期望的。
步骤如下:
从远程仓库获取最新更改
git fetch origin master
Git 参考现在如下所示:
❯ git show-ref | grep -E "master$"
79ba3075fcf4263273dfd222cdd7773624c80913 refs/heads/master
688e154cf3bc04198b401789e75e4d496f7344b6 refs/remotes/gerrit/master
c87fb2b5bc576a23e9af600745210d7b9cab30d2 refs/remotes/origin/master
使用最新的远程参考更新本地参考。
git update-ref refs/heads/master refs/remotes/origin/master
现在本地参考也更新了,这是我们所期望的
❯ git show-ref | grep -E "master$"
c87fb2b5bc576a23e9af600745210d7b9cab30d2 refs/heads/master
688e154cf3bc04198b401789e75e4d496f7344b6 refs/remotes/gerrit/master
c87fb2b5bc576a23e9af600745210d7b9cab30d2 refs/remotes/origin/master
现在我希望 git status 报告本地分支与远程分支是最新的,因为本地引用已更新为远程引用。 但我看到 git 还暂存了新旧提交之间更改的文件。
git status | wc -l
3196
我不明白为什么会发生这种情况。我当前的分支是同一个“master”。 我没有通过网络或命令手册得到任何线索。知道原因是什么吗?
这里的问题是,您假设最终的工作树和索引看起来与您正在处理和调整的分支的新位置完全相同。
如果您正在处理
branch-X
并且调整了 branch-Y
的引用,那么当您运行 git checkout branch-Y
时,git 会将 HEAD
的指针移动到该分支,并使索引看起来像 指向的提交branch-Y
并相应地调整工作树。
但是,如果你在
branch-Y
上并且你 move 那个分支 到不同的提交(不会弄乱索引和工作树,就像你期望 update-ref
所做的那样),git 会考虑(一如既往)索引和分支现在指向的提交之间的差异(可能是很多,因为索引看起来很像分支指向的上一个提交)并且索引和工作树之间的差异......而这一切仅仅是因为update-ref
不会弄乱索引或工作树。
如果您想让工作树和索引也类似于分支新位置的内容,您应该考虑使用git reset --hard
来代替执行以下三件事:
git reset --hard
将消除索引或工作树周围任何未提交的更改。