git stash blunder:git stash pop并最终出现合并冲突

Chi*_*tel 197 git git-stash git-checkout

我做了一个git stash pop并最终导致了合并冲突.我从文件系统中删除了文件并执行了git checkout如下所示的操作,但它认为文件仍然未合并.然后我尝试更换文件并git checkout再次执行相同的结果.我的事件尝试用-f旗帜强迫它.任何帮助,将不胜感激!

chirag-patels-macbook-pro:haloror patelc75$ git status
app/views/layouts/_choose_patient.html.erb: needs merge
app/views/layouts/_links.html.erb: needs merge
# On branch prod-temp
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#       modified:   db/schema.rb
#
# Changed but not updated:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       unmerged:   app/views/layouts/_choose_patient.html.erb
#       unmerged:   app/views/layouts/_links.html.erb

chirag-patels-macbook-pro:haloror patelc75$ git checkout app/views/layouts/_choose_patient.html.erb
error: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
chirag-patels-macbook-pro:haloror patelc75$ git checkout -f app/views/layouts/_choose_patient.html.erb
warning: path 'app/views/layouts/_choose_patient.html.erb' is unmerged
Run Code Online (Sandbox Code Playgroud)

tan*_*ius 219

参见man git merge(如何解决冲突):

看到冲突后,你可以做两件事:

  • 决定不合并.您需要的唯一清理是将索引文件重置为HEAD提交以反转2.并清除由2.和3进行的工作树更改.git-reset --hard可用于此目的.

  • 解决冲突.Git将标记工作树中的冲突.将文件编辑为形状,然后将它们添加到索引中.使用git commit来达成交易.

TRUE MERGE下(看看2.和3.指的是什么):

如果不明显如何协调更改,则会发生以下情况:

  1. HEAD指针保持不变.

  2. MERGE_HEAD ref设置为指向另一个分支头.

  3. 干净地合并的路径在索引文件和工作树中都会更新.

  4. ...

因此:git reset --hard如果要从工作树中删除存储更改,或者git reset如果只想清理索引并将工作树中的冲突留在手工合并中,请使用.

man git stash(OPTIONS,pop)下你还可以阅读:

应用国家可能会因冲突而失败; 在这种情况下,它不会从隐藏列表中删除.您需要手动解决冲突并随后手动调用git stash drop.

  • **"应用状态可能会因冲突而失败;在这种情况下,它不会从存储列表中删除."**在我看来,这是帖子中最重要的部分.考虑编辑你的答案,把它放在前面,并用大而友好的字母中的单词**DO NOT PANIC**.(已经+1了.)谢谢. (11认同)
  • 实际上,即使在删除存储之后,仍然可能(尽管更难)再次检索它,因为更改集仍然存在于存储库中.http://stackoverflow.com/search?q=git+recover+dropped+stash (9认同)
  • @nalply:是好还是坏?我们欢迎您改进我的答案,您首先不了解它... (3认同)

Aar*_*ron 41

我有类似的事发生在我身上.我还不想暂存这些文件,所以我添加了它们,git add然后就这样做了git reset.这基本上只是添加然后取消了我的更改,但清除了未合并的路径.

  • 这似乎比使用`reset --hard`更好,因为它不会覆盖你的文件(除了那些有合并问题的文件).谢谢! (4认同)
  • 如果要进行`git reset`,你不需要`git add`.`git reset`有效地"撤消"了`git add`.`git reset`(`--mixed` < - default)实际上没有触及工作目录,所以你工作目录中的内容,合并冲突和所有内容都是孤立的.虽然索引(以及技术上的分支头)被重置(没有ref它们会被重置回`HEAD`,这可能意味着分支头没有变化,并且有效地撤消对索引执行的任何`git add`)清除未合并的路径状态). (3认同)
  • **序列**,*编辑/解析*,`git reset`和`git stash drop`效果很好.它做了什么`git stash pop`会没有冲突.似乎不需要`git add`; 虽然它可能有用但你有很多文件存在冲突.当每个*解析*时,可以添加它们并且`git status`跟踪它们. (3认同)
  • `git add`会对它们进行分级,但是`git reset`,我会立即执行它,将它们取消暂存.基本上它清除了未合并的路径并通过伪造git将我返回到我的正常工作树. (2认同)

Ped*_*eno 13

如果像我一样,你通常想要的是用stashed文件的内容覆盖工作目录的内容,并且你仍然会遇到冲突,那么你想要的是git checkout --theirs -- .从root用户解决冲突.

之后,您可以git reset将索引中的所有更改带到工作目录,因为在发生冲突时,对非冲突文件的更改将保留在索引中.

您可能还希望git stash drop [<stash name>]之后运行,以摆脱存储,因为git stash pop在发生冲突时不会删除它.