我在两台机器上克隆了相同的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.如何修复它(使其失败时,文件被修改)?
3条答案
按热度按时间wlzqhblo1#
首先检查第二台计算机上的
git config pull.rebase
是否设置为true。否则,拉取将使用
git merge
,如果Makefile
不是被拉取(和合并)的修改的一部分,则可以使用git merge
。Already up to date
应该表示没有要从第二台计算机提取的内容:检查两台计算机上的git log --decorate --oneline --graph
,以确认本地存储库是否引用了相同的历史记录。f4t66c6m2#
配置不同?一台计算机/存储库具有
pull.rebase = true
(或=merges
/=interactive
),另一台没有。请检查git config -l
和git config pull.rebase
如果没有
pull.rebase
,默认情况下将执行合并,如果未暂存的文件没有被合并的任何一方更改,则合并将成功。对于rebase,在实际执行rebase之前无法知道这一点,这就是为什么它在一台机器上成功,而在另一台机器上不成功。myss37ts3#
不同之处在于,在第二个
pull
上,没有新的提交要引入。git pull
是两个命令git fetch
和git rebase
的组合(在您的情况下,否则为git merge
)。所以git执行一个fetch来查看远程端上的最后一次提交是什么,然后检查这些提交是否和本地端上的相同,如果不相同,git尝试执行一个rebase,如果有未暂存的修改,就会抛出一个错误。
使用此答案https://stackoverflow.com/a/3879077/498699
您可以使用
git diff-index --quiet HEAD --
来查看是否有修改,然后在进行拉取或任何您想做的操作之前将其隐藏。