错误:无法撤消变基:您已取消暂存的更改


138

我已经开始与几个朋友进行项目合作,他们使用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.

我的猜测是我弄乱了代码,现在它要我提交或放弃(这是存储的含义吗?)所做的更改。这是怎么回事吗?如果是这种情况,我想放弃我可能进行的任何更改,而只从git存储库中获取更新的代码。

对我能做什么有任何想法吗?

Answers:


173

这样做git status,这将向您显示哪些文件已更改。由于您已声明不想保留更改,所以您可以执行git checkout -- <file name>或放弃git reset --hard更改。

在大多数情况下,git会告诉您如何进行更改。例如,您的错误消息表明git stash您所做的更改。如果您想保留它们,那就是这样。拉动之后,您便可以这样做,git stash pop并且您的更改将重新应用。

git status 还具有如何摆脱更改的方法,具体取决于文件是否已暂存以提交。


1
这似乎有工作,但现在我面临的另一个错误(开始不要混淆未来访港一个新的问题):stackoverflow.com/questions/23518247/...
user3597950

我确实每次都这样,只是最近一次。以前,拉取不影响您当前更改的文件是可以的,但是现在,它需要存储所有已更改的内容。我什至无法推动,我被迫使用git push -f
Karma Blackshaw

@KarmaBlackshaw您不需要强行推动。如果必须强制执行操作,则意味着您的本地历史记录和远程历史记录是不同的,并且与此答案所涵盖的问题不同。
Schleis

这个问题的范围确实提供了不同的内容。但是我确实找到了一种方法,可以删除当前分支并从develop中创建一个新分支。我想这是我的分支配置了一些错误的东西。
卡玛·布莱克肖

91

如果要在执行基准调整时保留所做的工作更改,可以使用--autostash。从文档中

在开始变基之前,如有必要,将本地修改存储起来(请参阅git-stash [1]),并在完成后应用存储。

例如:

git pull --rebase --autostash

7
这是现代答案。
adl

13
如果希望将自动隐藏功能设置为默认行为,则可以设置。git config --global rebase.autoStash true 然后,您无需通过该开关。
Zoredache

1
这就是我想要的!(请注意,命令行开关从git 2.9起可用,但该选项rebase.autostash从2.6起可用)。
jjmontes


6
为什么这不是默认值?
尼克,

49

通常,使用rebase拉动是一个好习惯。

但是,如果索引不干净,即您所做的更改尚未提交,则无法执行此操作。

您可以这样做,假设您想保留更改:

  1. 通过以下方式存储您的更改: git stash
  2. 从大师那里带基地
  3. 使用以下git stash apply stash@{0}或更简单的方法重新应用您在(1)中保存的更改:git stash pop

1
这似乎有工作,但现在我面临的另一个错误(开始不要混淆未来访港一个新的问题):stackoverflow.com/questions/23518247/...
user3597950

6
@nehemiahjacob也git stash pop可以应用最近隐藏的更改,并避免记住较长的更改apply stash@{0}
2014年

我必须一直这样做。有没有更简单的方法?
Alper

@alper通常您在另一个(功能)分支上工作。根据我的经验,我仅在完成工作后才获取数据并根据master进行修改,因此无需隐藏/弹出。如果您发现自己虽然在开发工作流程中做了很多工作,则始终可以在自己的别名.bashrc(或使用的任何别名)中:alias stashpull='git stash; git pull; git stash pop'
Kostas Rousis,2016年

@KostasRousis我有那个确切的别名,哈哈。我称它为“ sppgit”
luizfls,


16

这对我有用:

git fetch
git rebase --autostash FETCH_HEAD

1
自动隐藏,这为我节省了另外两个命令。这应该是IMO的正确答案。
Erik Berkun-Drevnig's

10

你总是可以做

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

并且您将得到(a)如果您有未提交的更改与上游更改冲突,则没有任何更改,或者(b)与隐藏/拉动/应用相同的效果:重新设置基础以使您获得HEAD的最新更改,并保留未提交的更改照原样。


6

当未暂存的更改是因为git试图修复文件上的eol约定(通常是我的情况)时,没有大量的隐藏,检出或重置操作将使其消失。

但是,如果意图实际上是重新设置基础并忽略未暂存的更改,那么我要做的是在本地删除分支,然后再次将其检出。

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

瞧!它还没有使我失望。


2

如果要自动存储更改并为每个重新存储取消存储更改,可以执行以下操作:

git config --global rebase.autoStash true

1
这是使最新版本的Git能够像Git过去一样工作的唯一答案。为什么在人们--autostash可以自动添加时才添加?
Andrew Koster
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.