错误:无法使用rebase拉取:您有未暂存的更改。

251

我和几个朋友开始合作一个项目,他们使用Heroku Git仓库。

几天前我克隆了该仓库,由于他们最近进行了一些更改,所以我试图获取最新的更新。

我按照此处所述的方式运行了git pull --rebase命令(这是正确的方法吗?): https://devcenter.heroku.com/articles/sharing#merging-code-changes

我收到了以下错误信息:

$ git pull --rebase
Cannot pull with rebase: You have unstaged changes.
Please commit or stash them.

我猜测是我把代码弄乱了,现在它要求我提交或放弃更改(这就是 stash 的意思吗?)。是这种情况吗?如果是,我想放弃我可能做的任何更改,并从 git 仓库中获取更新后的代码。

你有什么想法吗?

12个回答

303
如果你在进行变基操作的时候想要保留你的工作更改,你可以使用--autostash。从文档中得知:

在开始变基之前,如果需要,把本地修改储存起来(参见git-stash[1]),并在完成后应用这个储藏。

例如:

git pull --rebase --autostash

23
这是现代的答案。 - adl
76
如果您想让自动存储成为默认行为,可以设置 git config --global rebase.autoStash true,然后您就不需要传递开关了。 - Zoredache
1
这正是我在寻找的!(请注意,命令行开关可从git 2.9开始使用,但选项“rebase.autostash”可从2.6开始使用)。 - jjmontes
这对于 git rebase --interactive 也非常有效! - Dan Dascalescu
19
为什么这不是默认设置? - Nick
显示剩余3条评论

243

运行 git status 命令,它将显示哪些文件已更改。由于您声明不想保留更改,可以使用 git checkout -- <文件名>git reset --hard 命令来摆脱更改。

在大多数情况下,Git 会告诉您如何处理更改。例如,您的错误消息建议您使用 git stash 命令来保存更改。如果您想要保留更改,则在拉取后,您可以运行 git stash pop 命令重新应用更改。

git status 命令还展示了如何根据文件是否暂存进行更改回退的方法。


1
这似乎已经起作用了,但现在我面临另一个错误(为了不混淆未来的访问者,我开始了一个新问题):http://stackoverflow.com/questions/23518247/error-git-pull-rebase-permission-denied-publickey-fatal-could-not-read-f - user3597950
我最近每次都遇到这个问题。以前,拉取不影响你当前更改的文件是可以的,但现在需要将你所做的任何更改都存储起来。我甚至不能推送,只能使用 git push -f - Karma Blackshaw
1
@KarmaBlackshaw,你不应该需要强制推送。如果你必须进行强制推送,那意味着你的本地历史记录和远程历史记录不同,这与本答案涵盖的问题不同。 - Schleis
这确实不同于这个问题提供的范围。但我通过删除当前分支并从develop创建一个新分支找到了一种方法。我猜是我的分支配置有些问题。 - Karma Blackshaw
使用 "git status" 命令检查本地工作区。使用 "git checkout -- <file>..." 命令放弃工作目录中的更改。此外,"git pull --rebase" 也可以。 - Vittore Marcas

64

在一般情况下,使用rebase拉取是一个好的做法。

然而,如果你的索引不干净,即你做了未提交的更改,则不能这样做。

可以通过以下方法解决,假设你想保留更改:

  1. 使用git stash存储你的更改
  2. 用rebase从主分支拉取
  3. 使用git stash apply stash@{0} 或简单的 git stash pop重新应用之前存储的更改(第1步)

1
这似乎已经起作用了,但现在我面临另一个错误(为了不混淆未来的访问者,我开始了一个新问题):http://stackoverflow.com/questions/23518247/error-git-pull-rebase-permission-denied-publickey-fatal-could-not-read-f - user3597950
6
您也可以使用"git stash pop"命令来应用最近的存储更改,避免记忆较长的"apply stash@{0}"命令。请注意,这不会改变原有的含义。 - Kostas Rousis
我必须一直这样做。有更简单的方法吗? - Alper
@alper 通常你会在另一个(功能)分支上工作。根据我的经验,只有在提交了我的工作后,我才会获取并将其变基到主分支,因此无需进行存储/弹出操作。如果你发现在开发工作流程中经常这样做,你可以在你的.bashrc(或者你使用的任何其他文件)中创建一个别名:alias stashpull='git stash; git pull; git stash pop' - Kostas Rousis
@KostasRousis 我也有完全相同的别名,哈哈。我叫它“sppgit”。 - luizfls
谢谢。我从来没有费心去学习git stash,总是在想要拉取时手动提交任何更改或将它们放入不同的分支中。 - thomasrutter

62

如果您希望自动隐藏您的更改并在每次变基时取消隐藏它们,则可以执行以下操作:

git config --global rebase.autoStash true

5
这是唯一的答案,可以使最新版本的Git与过去一直保持相同的工作方式。为什么要让用户添加--autostash,而不是自动实现呢? - Andrew Koster
这几乎使得git变得可用。无论如何,它更接近mercurial的合理方式。 - swpalmer

47

首先运行git status命令

查看是否有未提交的更改。 要丢弃它们,运行以下命令

请注意运行此命令将使您失去更改。

git reset --hard

这似乎已经起作用,但现在我面临另一个错误(开了一个新问题,以免混淆未来的访问者):http://stackoverflow.com/questions/23518247/error-git-pull-rebase-permission-denied-publickey-fatal-could-not-read-f - user3597950
我仍然收到一个错误:致命错误:无法快进,中止。 - IgorGanapolsky

23

这对我有效:

git fetch
git rebase --autostash FETCH_HEAD

3
啊,自动暂存,这能让我少输入两个命令。在我看来,这应该是正确的答案。 - Erik Berkun-Drevnig
1
你也可以在全局的git配置中将其设置为默认值,参见这里 - agirault

11

您始终可以执行

git fetch && git merge --ff-only origin/master

如果您有未提交的更改与上游更改冲突,那么您将得到(a)没有更改或(b)与stash / pull / apply相同的效果:将您置于HEAD最新更改并保留未提交的更改。


7

当未暂存的更改是因为git试图在文件上修复eol约定时(这总是我的情况),无论多少次存储或检出或重置都不会使其消失。

但是,如果意图是真的要重新设置基础并忽略未暂存的更改,则我所做的是在本地删除分支,然后再次检查它。

git checkout -f anyotherbranchthanthisone
git branch -D thebranchineedtorebase
git checkout thebranchineedtorebase

看啊!它从未让我失望过。


1
步骤1:git stash // 将您的本地更改存储在安全的位置
步骤2:git pull // 拉取最新的更改
步骤3:git stash pop // 将存储文件移动到您的分支
要验证,请运行:git status

0

请按照以下步骤操作:

从 feature/branch 分支(输入以下命令):

git checkout master

git pull

git checkout feature/branchname

git merge master


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接