为什么 git update-ref 也会在新旧提交之间暂存文件?

问题描述 投票:0回答:1

我有一个脚本可以刷新最新提交的索引,但 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”。 我没有通过网络或命令手册得到任何线索。知道原因是什么吗?

git git-rebase git-update-ref
1个回答
0
投票

这里的问题是,您假设最终的工作树和索引看起来与您正在处理和调整的分支的新位置完全相同。

如果您正在处理

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

 将消除索引或工作树周围任何未提交的更改。

© www.soinside.com 2019 - 2024. All rights reserved.