包含未隐藏更改的Git拉取成功

dgtucam1  于 2023-03-11  发布在  Git
关注(0)|答案(3)|浏览(107)

我在两台机器上克隆了相同的repo,两台机器都有完全相同的git版本(2.34.1)。
在机器1上:

git pull
echo '# comment' >> Makefile
git pull

正如预期的那样,在上述命令中,第一个pull成功,第二个pull失败,并显示:

error: cannot pull with rebase: You have unstaged changes.
error: please commit or stash them.'

在机器2上(aws/ec2示例,使用只读SSH密钥,如果这些是相关的话),我重复了完全相同的命令集(并使用git status确认Makefile已修改,但我得到的不是Already up to date.错误
1.行为差异的原因可能是什么?
1.如何修复它(使其失败时,文件被修改)?

wlzqhblo

wlzqhblo1#

首先检查第二台计算机上的git config pull.rebase是否设置为true。
否则,拉取将使用git merge,如果Makefile不是被拉取(和合并)的修改的一部分,则可以使用git merge
Already up to date应该表示没有要从第二台计算机提取的内容:检查两台计算机上的git log --decorate --oneline --graph,以确认本地存储库是否引用了相同的历史记录。

f4t66c6m

f4t66c6m2#

配置不同?一台计算机/存储库具有pull.rebase = true(或=merges/=interactive),另一台没有。请检查git config -lgit config pull.rebase
如果没有pull.rebase,默认情况下将执行合并,如果未暂存的文件没有被合并的任何一方更改,则合并将成功。对于rebase,在实际执行rebase之前无法知道这一点,这就是为什么它在一台机器上成功,而在另一台机器上不成功。

myss37ts

myss37ts3#

不同之处在于,在第二个pull上,没有新的提交要引入。
git pull是两个命令git fetchgit rebase的组合(在您的情况下,否则为git merge)。
所以git执行一个fetch来查看远程端上的最后一次提交是什么,然后检查这些提交是否和本地端上的相同,如果不相同,git尝试执行一个rebase,如果有未暂存的修改,就会抛出一个错误。
使用此答案https://stackoverflow.com/a/3879077/498699
您可以使用git diff-index --quiet HEAD --来查看是否有修改,然后在进行拉取或任何您想做的操作之前将其隐藏。

相关问题