How to resolve git stash conflict without commit?
正如在这个问题中所要求的,我也想知道如何解决冲突的
我目前的方法非常不酷,因为我这样做:
1 2 3 4 5 | git stash pop -> CONFLICT git stash drop [resolve conflict] [add conflict files] git reset HEAD |
[更新]一种重现它的方法:
1 2 3 4 5 6 7 8 9 10 11 12 13 | 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-06-27:在示例中添加了一个名为"third"的新文件,以显示scy解决方案的解决方法仅适用于空HEAD,但不解决HEAD不具有相同内容的初始问题 对于没有冲突的
不要按照其他答案
好吧,你可以关注他们:)。但我不认为执行提交然后重置分支以删除该提交和其他答案中建议的类似解决方法是解决此问题的干净方法。
清洁解决方案
以下解决方案似乎对我来说更清晰,Git本身也提出了这个解决方案 - 尝试在存储库中执行带有冲突的
1 2 3 | Unmerged paths: (use"git reset HEAD <file>..." to unstage) (use"git add <file>..." to mark resolution) |
那么让我们做Git建议的事情(不做任何无用的提交):
转换为命令行:
1 2 3 4 5 6 7 | $ git stash pop # ...resolve conflict(s) $ git reset $ git stash drop |
默认行为的说明
将冲突标记为已解决的方法有两种:
解决冲突后将文件添加到索引是故意的。这样,您可以区分更改与先前存储的更改以及解决冲突后所做的更改。如果你不喜欢它,你总是可以使用
合并工具
我强烈建议使用任何3向合并工具来解决冲突,例如: KDiff3,Meld等,而不是手动完成。它通常自动解决所有或大多数冲突。节省大量时间!
假设您有这种情况,您可以隐藏更改以从原点拉出。可能是因为您的本地更改在某些设置文件中只是
1 2 3 4 5 6 7 | # 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") |
好的。我决定采用Git的建议:我解决了冲突并承诺:
1 2 3 | vim src/js/globals.tpl.js # type type type … git commit -a -m WIP # (short for"work in progress") |
现在我的工作副本处于我想要的状态,但是我创建了一个我不想拥有的提交。如何在不修改我的工作副本的情况下摆脱该提交?等等,有一个流行的命令!
1 | git reset HEAD^ |
我的工作副本尚未更改,但WIP提交已消失。这正是我想要的! (请注意,我在这里没有使用
但还有一件事:
1 | git stash drop |
并做了。
您可以使用
但是,您可能必须运行此命令两次。一旦将冲突标记为已解决并且一次取消暂停冲突解决例程所发生的更改。
有可能应该有一个同时完成这两件事的重置模式,尽管现在还没有。
1 | git checkout stash -- . |
为我工作。
注意:这可能很危险,因为它不会尝试将存储中的更改合并到工作副本中,而是使用存储文件覆盖它。因此,您可能会丢失未提交的更改。
1 2 | git add . git reset |
看起来这可能是你正在寻找的答案,我还没有尝试过这个,但看起来它似乎可以解决问题。使用此命令,GIT将尝试按原样应用更改,而不尝试将所有更改添加到提交中。
这是完整的解释:
http://git-scm.com/book/en/Git-Tools-Stashing
我找到的最快的方法是解决冲突,然后执行
当你把你的工作藏起来,在那里重新申请你的工作,你所做的承诺,以及
如果成功应用,则删除存储。检查一下
根据git stash问题,在解决冲突后,
在阅读此评论后,我了解到更改会自动添加到索引中(按设计)。这就是
它不是最好的方法,但它的工作原理:
1 2 3 4 | $ git stash apply $ >> resolve your conflict << $ >> do what you want to do with your code << $ git checkout HEAD -- file/path/to/your/file |