如何在没有提交的状况下解决git stash冲突?

正如在这个问题中要求的那样 ,我也想知道如何解决冲突的git stash pop而不添加对提交的全部修改(就像“git stash pop”而没有冲突)。 git

我目前的方法很是不酷,由于我这样作: vim

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-06-27:在示例中添加了一个名为“third”的新文件,以显示scy解决方案的解决方法仅适用于空HEAD,但不解决HEAD不具备相同内容的初始问题对于没有冲突的git stash popapp


#1楼

假设您有这种状况,您能够隐藏更改以从原点拉出。 多是由于您的本地更改只是debug: true在某些设置文件中为debug: true 。 如今你拉,有人在那里引入了新的设置,形成了冲突。 工具

git status说: this

# 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的建议:我解决了冲突并承诺: spa

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

如今个人工做副本处于我想要的状态,可是我建立了一个我不想拥有的提交。 如何在不修改个人工做副本的状况下摆脱该提交? 等等,有一个流行的命令! .net

git reset HEAD^

个人工做副本还没有更改,但WIP提交已消失。 这正是我想要的! (注意我在这里没有使用--soft ,由于若是你的存储中有自动合并的文件,它们会自动暂存,所以你最终会在reset后再次暂存这些文件。) 命令行

可是还剩下一件事: git stash pop的手册页提醒咱们“应用状态会因冲突而失败;在这种状况下,它不会从存储列表中删除。你须要手动解决冲突并调用git stash drop以后手动git stash drop 。“ 这正是咱们如今所作的: debug

git stash drop

并作了。


#2楼

git stash branch将工做,它会为您建立一个新分支,检查您在保存工做时所处的提交,在那里从新应用您的工做,而后在成功应用时删除存储。 检查一下


#3楼

git checkout stash -- .

为我工做。

注意 :这可能很危险,由于它不会尝试将存储中的更改合并到工做副本中,而是使用存储文件覆盖它。 所以,您可能会丢失未提交的更改。


#4楼

不要按照其余答案

好吧,你能够关注他们:)。 但我不认为执行提交而后重置分支以删除该提交和其余答案中建议的相似解决方法是解决此问题的干净方法。

清洁解决方案

如下解决方案彷佛对我来讲更清晰, Git自己提出了这个解决方案 - 尝试在存储库中执行git status并发生冲突:

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

那么让咱们作Git建议的事情(不作任何无用的提交):

  1. 手动(或使用一些合并工具 ,见下文)解决冲突。
  2. 使用git reset将冲突标记为已解决并取消暂停更改。 您能够在没有任何参数的状况下执行它,Git将从索引中删除全部内容。 您没必要在执行git add以前。
  3. 最后,使用git stash drop删除存储,由于Git在冲突时不会这样作。

转换为命令行:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop

默认行为的说明

有两种方法能够将冲突标记为已解决: git addgit reset 。 虽然git reset将冲突标记为已解决并从索引中删除文件,但git add还会将冲突标记为已解决,但会将文件保留在索引中。

解决冲突后将文件添加到索引是故意的。 这样,您能够区分更改与先前存储的更改以及解决冲突后所作的更改。 若是您不喜欢它,您能够随时使用git reset从索引中删除全部内容。

合并工具

我强烈建议使用任何3路合并工具来解决冲突,例如KDiff3Meld等,而不是手动执行。 它一般自动解决全部或大多数冲突。 节省大量时间!


#5楼

根据git stash问题 ,在解决冲突后, git add <file>是正确的行动方案。

在阅读此评论后 ,我了解到更改会自动添加到索引中(按设计)。 这就是git add <file>完成冲突解决过程的缘由。

相关文章
相关标签/搜索