2011-10-13 123 views
292

由于asked in this question,我也想知道如何解决冲突git stash pop没有将所有的修改提交(就像“混帐藏匿弹出”没有冲突呢)。如何解决git存储冲突而无需提交?

我目前的做法是非常酷,因为我做这种方式:

git stash pop -> CONFLICT 
git stash drop 
[resolve conflict] 
[add conflict files] 
git reset HEAD <all files that are in commit-mode> 

[更新]答的方式来重现:

mkdir foo; cd foo; git init 
echo "1" > one 
echo "2" > two 
git add -A; git commit -m "first" 
echo "1.1" > one 
echo "2.1" > two 
git stash 
echo "2.2" > two 
git commit -a -m "second" 
echo "Only this file would stay in HEAD without the conflict" > third 
git add third 
git stash pop 
git status 

2016年6月27日:增加了一个新的文件在示例中称为“第三”,以显示像scy这样的解决方案的解决方法仅适用于空HEAD,但不能修复HEAD没有像git stash pop那样的内容而没有冲突的初始问题。

+0

因此,你git add你已解决的冲突文件,有效地在索引中登台,并且你不希望他们在我们的索引? – Romain

+0

是的,这是正确的。我只想当'git stash pop'在没有冲突发生时(但通知哪些文件需要合并)的行为。 – Sven

+2

看起来像这样的答案在这里:http://stackoverflow.com/questions/3945826/git-stash-questions。在选择的答案中,Adam在第4条评论中解释了为什么git会这样做。 – Patrick

回答

72

而不是增加您对解决冲突的更改,您可以使用git reset HEAD file解决冲突而不分段更改。

您可能需要两次运行此命令,但是。一旦将冲突标记为已解决,并且一次解除冲突解决程序所执行的更改即可。

这是可能的,应该有一个复位模式可以做到这些的同时这些东西,虽然没有一个现在。

+2

重置模式是我搜索的模式 - 其他解决方法就像我描述的那样,并且不适用于超过5文件。 – Sven

+19

然后使用“git stash drop”完成“git stash pop”。 – DavidLiu

+2

尽管问题没有明确要求,但更新答案以包含“git stash drop”可能会很有用,因为在冲突情况下存储不会自动丢弃。 –

4

看来,这可能是你正在寻找的答案,我还没有试过这种个人还,但现在看来似乎可以做的伎俩。使用这个命令,GIT将尝试应用以前的更改,而不尝试将它们全部添加到提交中。

git stash apply --index

这里是充分的解释:

http://git-scm.com/book/en/Git-Tools-Stashing

+0

感谢您的提示,但是当我已经做了'git stash pop' - 或者有办法恢复这个并且执行'git stash apply --index'当我发现'git stash pop'会遇到冲突? – Sven

+0

我已经添加了一个关于如何产生这个的例子 - 假设你正在编辑超过10个文件,所以你不知道你在储藏之外修改了哪些文件。 – Sven

+3

如果你看这篇文章的底部[这里](http://stackoverflow.com/questions/2840816/git-stash-blunder-git-stash-pop-and-ended-up-with-merge-conflicts)它说,如果你运行'git stash pop'并且它以冲突结束,那么隐藏不会被删除......所以你可以运行'git reset --hard'来撤销弹出窗口,然后尝试我建议的解决方案。 –

223

假设你有这种情况下,你藏在为了从原点拉你的变化。可能是因为您的本地更改仅在某些设置文件中为debug: true。现在你拉着,有人在那里引入了新的环境,造成了冲突。

git status说:

# On branch master 
# Unmerged paths: 
# (use "git reset HEAD <file>..." to unstage) 
# (use "git add/rm <file>..." as appropriate to mark resolution) 
# 
# both modified:  src/js/globals.tpl.js 
no changes added to commit (use "git add" and/or "git commit -a") 

好。我决定去什么混帐建议:我解决冲突,并承诺:

vim src/js/globals.tpl.js 
# type type type … 
git commit -a -m WIP # (short for "work in progress") 

现在我的工作拷贝是我想要的状态,但我已经创建了一个承诺,我不希望有。如何在不修改工作副本的情况下摆脱该提交?等等,这里有一个受欢迎的命令!

git reset HEAD^ 

我的工作副本没有被更改,但WIP提交消失了。这正是我想要的! (请注意,我没有使用--soft在这里,因为如果在你的藏匿自动合并后的文件,它们是自动上演这样的话你会最终这些文件被reset后再次上演。)

但还有剩下一两件事:为git stash pop手册页提醒我们:“应用状态可能无法与冲突;在这种情况下,它不会从藏匿列表中删除您需要解决的冲突。然后手动拨打git stash drop。“这就是我们现在所做的:

git stash drop 

并完成。

+3

这也适用于'git stash apply'对我来说,谢谢。 – 2rs2ts

+24

在故意不得不提交重置HEAD^...的东西只会影响工作树时,会有很多继承丑陋。 – nus

+3

为什么不只是解决冲突,然后'git添加<解决冲突文件>'后面跟'git reset HEAD'? – BoltzmannBrain

2

git stash branch会的作品,为您创建一个新的分支,检出 提交你就当你藏起来你的工作,重新应用你的工作在那里,然后 下降藏匿,如果它成功的应用。检查this

9
git checkout stash -- . 

为我工作。

注意:这可能是危险的,因为它不尝试从藏匿的修改合并到你的工作拷贝,但覆盖它与藏文件,而不是。因此,您可能会失去未提交的更改。

+1

我会说这**覆盖了工作副本中的**文件与存储中的文件。所以你会失去所有未提交的变更。所以没有必要在做'git stash pop'之前(这是试图**将隐藏文件合并到你的工作副本)。如果你没事的话,你可以使用'git checkout stash - 。'而不是'git stash pop'。 –

+2

-1它覆盖您对当前文件的更改。我的意思是,如果这就是你想要的,那么很好,但很可能大部分时间你都不想要。 – phoenix

165

我不认为做了一个提交,然后重置分支以删除其他答案中提出的提交和类似的解决方法是解决此问题的简单方法。

以下解决方案似乎是更清洁,我和它也通过Git的本身建议 - 在仓库中有冲突执行git status

Unmerged paths: 
    (use "git reset HEAD <file>..." to unstage) 
    (use "git add <file>..." to mark resolution) 

让我们做什么混帐表明没有做任何承诺:

  1. 手动(或使用某种GUI合并工具)可以解决冲突。
  2. 使用git reset将冲突标记为已解决并且不会改变这些更改。你可以在没有任何参数的情况下执行它,Git将从索引中删除所有内容。您以前不必执行git add
  3. 最后,删除存储与git stash drop,因为Git不会这样做的冲突。

所以:

$ git stash pop 

# ...manually resolve conflict(s) 

$ git reset 

$ git stash drop 

注:将文件添加到索引之后解决冲突是故意的。通过这种方式,您可以区分以前存储的更改和冲突解决后所做的更改。如果你不喜欢它,你总是可以使用git reset从索引中删除所有内容。

另一个备注:我强烈建议使用任何3路合并工具来解决冲突,例如, KDiff3。它通常自动解决大部分冲突。

+3

我发现这比接受的答案更自然。它也适用于'git stash apply'。 – Benjamin

+0

当你做'git stash pop'时不需要'git stash drop' –

+15

@kamalpal当'git stash pop'因为冲突而失败时似乎需要。 –

1

根据git stash questions,修复冲突后,git add <file>是正确的行为。

在阅读this comment之后,我了解到这些更改会自动添加到索引(按设计)。这就是为什么git add <file>完成冲突解决过程。

2

我找到的最快方法是解决冲突,然后做git add -u,然后做git reset HEAD,甚至不涉及提交。

-1
git add . 
git reset 

git add .将上演告诉混帐,你已经解决了冲突

git reset将unstage所有的暂存文件,而无需创建的所有文件提交

+0

这实际上并不是一个糟糕的答案,它非常像'git add -u',然后'git reset' – ebob

0

它不是最好的方式做到这一点,但它作品:

$ git stash apply 
$ >> resolve your conflict << 
$ >> do what you want to do with your code << 
$ git checkout HEAD -- file/path/to/your/file