强制git stash覆盖添加的文件


223

我有一些在git中未跟踪的文件。我进行了一些更改并想提交它们,但意识到我忘记了首先检入未修改的文件。所以我藏了文件,然后添加了未修改的版本。

然后,当我将存储空间应用于存储库时,由于已经添加了文件,因此发生冲突。

如何应用存储,并强制使用存储中的版本优先于存储库中的原始版本?

谢谢


7
丑陋的解决方案,直到有人提出更好的解决方案:git rm在执行操作之前,使用删除新文件git stash apply
汤姆(Tom)

那会不会失去历史呢?添加未修改版本的原因是保留历史记录。
Stefan

1
不,它不会丢失历史记录。如果删除文件,请稍加修改将其添加回去,然后提交,git将其视为仅一个小修改。
汤姆(Tom)

Answers:


364

使用git checkout代替git stash apply

$ git checkout stash -- .
$ git commit

这会将当前目录中的所有文件还原到其隐藏版本。


如果对工作目录中的其他文件进行了更改,则应保留这些更改,这是一种比较宽松的选择:

$ git merge --squash --strategy-option=theirs stash

如果索引中有更改,或者合并将接触具有本地更改的文件,则git将拒绝合并。可以使用以下方式从存储中检出单个文件:

$ git checkout stash -- <paths...>

或与

$ git checkout -p stash

在我的用例中,这些都不起作用。结果和我的解决方案在这里stackoverflow.com/a/26685296/496046-这也应该解决您的情况,@ AlexanderBird
tremby 2014年

2
git checkout stash -- .当我运行该命令时,它实际上什么也没做。
Rotsiser Mho,2015年

3
@RotsiserMho Git在提供确认消息方面不是很好。您确定它什么也不做吗?对我来说很好。
Sinjai

5
我必须git checkout stash -- .在包含所做更改的最高父文件夹中运行,否则它将仅将更改应用于我运行命令的文件夹。
狮子座

1
@Leo:是的,因为.指定了当前目录(您可以使用其他路径替换它,而不必更改目录)。我更新了我的答案以使其更清楚。
汤姆(Tom)

13

git stash show -p | git apply

然后git stash drop如果您想放置藏起来的物品。


2
注意:您应该在存储库的根目录中,这样才能正常工作,否则您将得到this
Ruslan '18

@PengheGeng正如您所看到的,我在NetEmmanuel
Hasan TBT

@Ruslan我在回购协议的根目录中得到了这一点
Leo

6

强制git stash pop运行此命令

git stash show -p | git apply && git stash drop

1

TL; DR:

git checkout HEAD path/to/file
git stash apply

长版:

由于要覆盖未提交的更改,因此收到此错误。使用撤消这些更改git checkout HEAD。您可以使用撤消对特定文件的更改git checkout HEAD path/to/file。消除冲突原因后,您可以照常申请。

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.