如何解决git隐藏冲突没有提交?

作为在这个问题中,我也想知道如何解决一个冲突的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>

如何繁殖:

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 pop

489078 次浏览

您可以使用git reset HEAD file来解决冲突,而不是添加您为解决冲突所做的更改,而无需登台进行更改。

但是,您可能必须运行该命令两次。一次是将冲突标记为已解决,一次是取消冲突解决例程所进行的更改。

有可能应该有一个重置模式,同时做这两件事,虽然现在没有一个。

看起来这可能就是你在寻找的答案,我个人还没有尝试过,但看起来它可能会奏效。使用此命令,GIT将尝试像以前一样应用更改,而不会尝试添加所有更改以提交。

# EYZ0

以下是完整的解释:

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

假设您有这样的场景,您将您的更改隐藏起来以便从原点进行拉取。可能是因为您的本地更改只是在某些设置文件中的debug: true。现在你拉了,有人在那里引入了一个新场景,造成了冲突。

# EYZ0说:

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

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

和完成。

git stash branch将工作,它为您创建了一个新分支,签出 当你在那里存放你的工作时,你在那里重新应用你的工作,然后 然后,如果应用成功,就放弃收藏。检查# EYZ0 < / p >

git checkout stash -- .

为我工作。

请注意:这可能是危险的,因为它不会尝试将隐藏文件中的更改合并到工作副本中,而是将覆盖与隐藏文件合并。因此,您可以丢失未提交的更改。

不关注其他答案

当然,你可以跟随他们。🙂但我不认为做一个提交,然后重置分支来删除你刚刚创建的提交和其他答案中建议的类似变通方法是解决这个问题的干净方法。

清洁溶液

.

下面的解决方案对我来说似乎更干净,它也是Git本身的建议 -尝试在存储库中执行有冲突的git status:

Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)

在Git 版本2.23.0中引入了# EYZ0命令。旧版本的Git建议使用命令git reset HEAD <file>...而不是git restore --staged <file>...。您还可以使用git reset取消暂存区域(称为指数)中的任何和所有文件的暂存。还原命令的等效命令是git restore --staged .(圆点是必要的,它指定任何文件)。目前,# EYZ10。如果您想了解这些命令之间的差异,请检查git reset HEAD <file>...1。

所以让我们按照Git的建议去做(无需进行和恢复任何无意义的提交):

  1. 手动(或理想情况下使用一些合并工具,请参阅下面)解决冲突。
  2. 使用git restore --staged .标记冲突已解决,并取消暂存区域中的所有文件。如果您只想取消特定的文件,请使用命令git restore --staged <file>。您之前不必执行git add
  3. 最后,使用git stash drop删除存储,因为Git不会在冲突时自动这样做。

转换为命令行命令:

$ git stash pop


# ...resolve conflict(s)


$ git restore --staged .


$ git stash drop

默认行为说明

. bb0默认行为说明

有两种方法将冲突标记为已解决:git addgit restore --staged <file>...git restore --staged <file>...将冲突标记为已解决并从索引中删除文件,git add也将冲突标记为已解决,但将文件保留在索引中。

在冲突解决后向索引中添加文件是有目的的。通过这种方式,您可以将这些更改与之前的存储以及在冲突解决后所做的更改区分开来。如果您不喜欢它,您总是可以使用git restore --staged .从索引中删除所有内容。

合并工具

.

我强烈建议使用3路合并工具中的任何一个来解决冲突,例如KDiff3融合等,而不是手动执行。它通常自动解决所有或大部分冲突。这是巨大的节省时间!

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

在阅读了这样的评论之后,我明白了更改会自动添加到索引中(通过设计)。这就是为什么git add <file>完成了冲突解决过程。

我发现最快的方法是解决冲突,然后执行git add -u,然后执行git reset HEAD,这甚至不涉及提交。

git add .
git reset

git add .将显示所有文件,告诉git您已经解决了冲突

git reset将取消所有暂存文件,而不创建提交

这不是最好的方法,但它是有效的:

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

没有问题。简单的git reset HEAD就是您要寻找的,因为它使您的文件保持修改状态,就像不冲突的git stash pop一样。

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

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

在这个过程结束时,你的存储将保留在队列中,所以只需执行git stash drop来清除它。

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

我想这已经够干净了…

回答人们有问题的git stash -u没有干净地应用

如果您使用git stash -u创建了一个存储呢?那么这个问题的大部分答案都是无效的!因为只要你遵循排名最高的答案给出的建议(这个:https://stackoverflow.com/a/27382210/816017) -即使用git stash drop(我的建议:不要这样做),你的非暂放文件就会消失。

这是一个冗长的介绍,要说以下几点:

如果你在使用git stash pop时遇到了Merge conflict的问题,并且你已经使用了git stash -u,那么摆脱这种情况的一种方法是:

  • # EYZ0
  • 做任何你需要修复差异的事情。
    • 困难的区别:手动复制有问题的文件到一个非git文件夹,然后执行git restore myfile,然后手动应用更改
    • 简单的区别:如果冲突只是在一些一次性文件中,如Cargo.lockyarn.lock只是git restore Cargo.lock
  • 再做一次git stash -u
  • # EYZ0
  • git stash pop现在应该涂抹干净,否则冲洗&重复
  • 一旦您确信已经正确应用了更改,就删除my-stash-branch

简而言之:用大粗体标注“不要追随其他答案”;的答案并不是每个人的答案!特别是如果你使用git stash -u。您的更改可能会丢失!

脚注:

  • 如果你挖掘git fsck,可能会发现git stash drop丢失的非暂存文件-如果我没有弄错的话,它们不在reflog中。

请确保如果你正在为git使用源代码树,他们会说提交你的更改或冲突。请不要这样做,

而不是打开你的终端并输入

git add .
git stash

这个源树告诉你“提交你的更改,因为他们不知道这个更改是否冲突,但他们正试图采取备份以确保安全。”

这个git藏命令将删除合并后的冲突。 谢谢你。< / p >