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

Sve*_*ven 454 git git-stash

正如在这个问题中所提到的,我也想知道如何解决冲突git stash pop而不添加对提交的所有修改(就像"git stash pop"而没有冲突).

我目前的方法非常不酷,因为我这样做:

git stash pop -> CONFLICT
git stash drop
[resolve conflict]
[add conflict files]
git reset HEAD <all files that are in commit-mode>
Run Code Online (Sandbox Code Playgroud)

[更新]一种重现它的方法:

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
Run Code Online (Sandbox Code Playgroud)

2016-06-27:在示例中添加了一个名为"third"的新文件,以显示scy解决方案的解决方法仅适用于空HEAD但不解决HEAD不具有相同内容的初始问题对于git stash pop没有冲突.

Daw*_*žan 425

我不认为执行提交然后重置分支以删除该提交以及在其他答案中建议的类似解决方法是解决此问题的简洁方法.

以下解决方案对我来说似乎更清晰,Git本身也提出了这个问题 - git status在存储库中执行冲突:

Unmerged paths:
  (use "git reset HEAD <file>..." to unstage)
  (use "git add <file>..." to mark resolution)
Run Code Online (Sandbox Code Playgroud)

让我们做Git建议而不做任何提交:

  1. 手动(或使用一些GUI合并工具)解决冲突.
  2. 使用git reset标记冲突(S)为解决和unstage的变化.您可以在没有任何参数的情况下执行它,Git将从索引中删除所有内容.你不必以前执行git add.
  3. 最后,删除存储git stash drop,因为Git不会在冲突时执行此操作.

所以:

$ git stash pop

# ...resolve conflict(s)

$ git reset

$ git stash drop
Run Code Online (Sandbox Code Playgroud)

注意:解决冲突后将文件添加到索引是有意的.这样,您可以区分更改与先前存储的更改以及解决冲突后所做的更改.如果您不喜欢它,您始终可以使用git add从索引中删除所有内容.

另一个注意事项:我强烈建议使用任何三向合并工具来解决冲突,例如KDiff3.它通常会自动解决大多数冲突.

  • 当'git stash pop`因冲突而失败时,似乎需要@kamalpal. (29认同)
  • @kamalpal是的,Git甚至通知你在发生冲突的情况下没有丢弃藏匿.问题是这样的情况,所以你真的需要执行`git stash drop`**,除非你想保留那个藏匿处. (18认同)
  • 我发现这比接受的答案更自然.它也适用于`git stash apply`. (7认同)
  • 当前版本的 git 现在输出建议“git Restore --staged”而不是“git reset”,这[这个答案](/sf/answers/4060272261/)对另一个问题说具有相同的效果。 (2认同)

scy*_*scy 292

假设您有这种情况,您可以隐藏更改以从原点拉出.可能是因为您的本地更改只是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")
Run Code Online (Sandbox Code Playgroud)

好的.我决定采用Git的建议:我解决了冲突并承诺:

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

现在我的工作副本处于我想要的状态,但是我创建了一个我不想拥有的提交.如何在不修改我的工作副本的情况下摆脱该提交?等等,有一个流行的命令!

git reset HEAD^
Run Code Online (Sandbox Code Playgroud)

我的工作副本尚未更改,但WIP提交已消失.这正是我想要的!(请注意,我不是--soft在这里使用,因为如果你的藏匿处中有自动合并文件,它们会自动暂存,因此你最终会在这些文件之后再次上传reset.)

但是还剩下一件事:man页面git stash pop提醒我们"应用状态可能会因冲突而失败;在这种情况下,它不会从存储列表中删除.您需要git stash drop手动解决冲突并在之后手动调用." 这正是我们现在所做的:

git stash drop
Run Code Online (Sandbox Code Playgroud)

并做了.

  • 在故意不得不提交重置HEAD ^ ...中只有很多继承丑陋的东西应该只影响工作树. (32认同)
  • 为什么不解决冲突然后`git add <已解决的冲突文件>`然后`git reset HEAD`? (6认同)
  • 我不认为有必要首先提交然后撤消提交.只需重置[Dawid Ferenczy答案](http://stackoverflow.com/a/27382210/1713660)也会这样做 (6认同)
  • 这也适用于我的"git stash apply",谢谢. (3认同)
  • 对于Windows用户来说,`^`用作一个特殊的行继续,让你坐在更多?提示而不是执行命令.而是使用:`git reset --soft HEAD~1`.请参阅[how-do-do-do-delete-unpushed-git-commits?](/sf/ask/223818941/) (2认同)

Com*_*uid 84

您可以使用git reset HEAD file解决冲突而不是暂存更改来代替添加您为解决冲突而进行的更改.

但是,您可能必须运行此命令两次.一旦将冲突标记为已解决并且一次取消暂停冲突解决例程所发生的更改.

有可能应该有一个同时完成这两件事的重置模式,尽管现在还没有.

  • 之后使用"git stash drop"来完成"git stash pop". (22认同)
  • 重置模式是我搜索的模式 - 其他解决方法就像我描述的那样,对于超过5个文件不实用. (2认同)
  • 虽然问题没有明确要求,但更新答案以包含"git stash drop"可能会有用,因为在发生冲突时不会自动删除存储. (2认同)

ste*_*iel 25

git checkout stash -- .
Run Code Online (Sandbox Code Playgroud)

为我工作.

注意:这可能很危险,因为它不会尝试将存储中的更改合并到工作副本中,而是使用存储文件覆盖它.因此,您可能会丢失未提交的更改.


小智 9

git add .
git reset
Run Code Online (Sandbox Code Playgroud)

git add . 将暂存所有文件,告诉git您已解决冲突

git reset 将取消转储所有已转储的文件而不创建提交


jac*_*kno 9

没有问题。一个简单的git reset HEAD就是您正在寻找的,因为它使您的文件像非冲突的git stash pop.

唯一的问题是你的冲突文件仍然会有冲突标签,git 将不再报告它们与有用的“both_modified”标志冲突。

为了防止这种情况,只需在运行之前解决冲突(编辑和修复冲突的文件)git reset HEAD就可以了……

在此过程结束时,您的存储将保留在队列中,因此只需执行一次git stash drop即可将其清除。

这只是发生在我身上并用谷歌搜索了这个问题,所以解决方案已经过测试。

我认为这很干净......


Mar*_*nti 6

看来这可能就是您正在寻找的答案,我还没有亲自尝试过,但看起来它可能会成功。使用此命令,GIT 将尝试像以前一样应用更改,而不是尝试添加所有更改以进行提交。

git stash apply --index

这是完整的解释:

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

  • 如果您查看这篇文章的底部[此处](http://stackoverflow.com/questions/2840816/git-stash-blunder-git-stash-pop-and-ending-up-with-merge-conflicts)说如果你运行“git stash pop”并且最终出现冲突,则存储不会被删除......所以你可以运行“git reset --hard”来撤消弹出,然后尝试我建议的解决方案。 (3认同)

归档时间:

查看次数:

283863 次

最近记录:

6 年,7 月 前