首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >合并冲突时的` `git stash`

合并冲突时的` `git stash`
EN

Stack Overflow用户
提问于 2012-01-26 03:56:18
回答 5查看 15.4K关注 0票数 33

我们做了坏事。

我们在合并冲突期间运行了git stash save,现在无法恢复我们的工作。

我们尝试过的东西:

代码语言:javascript
运行
复制
git pull -Xours origin master
git stash apply --index

和:

代码语言:javascript
运行
复制
 git pull origin master
 git stash save --keep-index "merge conflicts"
 git stash apply stash@{1}

请帮帮我!

EN

回答 5

Stack Overflow用户

发布于 2012-09-21 04:21:58

问题似乎是git stash没有保存对您试图合并的分支的引用。在合并过程中,它存储在一个名为MERGE_HEAD的引用中。

要修复它并返回到以前的状态,您需要找到您试图合并的修订版(假设它是d7a9884a380f81b2fbf002442ee9c9eaf34ff68d),并在应用stash之后将MERGE_HEAD设置为它。

然后,您可以应用存储(使用--index重新存储之前存放的所有内容),并设置您的MERGE_HEAD

代码语言:javascript
运行
复制
git stash apply --index
git update-ref MERGE_HEAD d7a9884a380f81b2fbf002442ee9c9eaf34ff68d
票数 33
EN

Stack Overflow用户

发布于 2013-08-10 08:19:35

今天我做了同样的事情,并采取了一种不同的方法(经过反复试验),在存储之前返回到状态,这样我就可以继续解决冲突并完成合并。

首先,在目标分支中解除部分合并后,我捕获了具有剩余冲突的文件列表(文本文件或编辑器选项卡)。这只是解除存储后未转移文件的列表,因为已解决冲突的文件将在存储之前转移。

代码语言:javascript
运行
复制
$ git status
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#   modified:   myproject/src/main/java/com/acme/package3/Class3.java
#   modified:   myproject/src/main/java/com/acme/package3/Class4.java
#

接下来,我创建了一个补丁,并将分支重置回预合并状态:

代码语言:javascript
运行
复制
$ git diff HEAD > ~/merge-with-resolved-conflicts.patch
$ git reset --hard HEAD

然后我创建了一个临时分支(从合并目标分支派生而来),并应用了补丁:

代码语言:javascript
运行
复制
$ git checkout -b my-temp-branch
$ git apply ~/merge-with-resolved-conflicts.patch
$ git commit -a -m "Merge with resolved conflicts"

因此,my-temp-branch的头部现在包含合并的所有内容,包括已解决冲突的文件和具有剩余冲突的文件。

然后我切换回原来的分支,再次合并,并查看git状态。

代码语言:javascript
运行
复制
$ git checkout my-branch
$ git merge other-branch
$ git status

状态显示有冲突的文件的完整列表:

代码语言:javascript
运行
复制
# Unmerged paths:
#   (use "git add <file>..." to mark resolution)
#
#   both modified:      myproject/src/main/java/com/acme/package1/Class1.java
#   both modified:      myproject/src/main/java/com/acme/package2/Class2.java
#   both modified:      myproject/src/main/java/com/acme/package3/Class3.java
#   both modified:      myproject/src/main/java/com/acme/package3/Class4.java
#

现在我需要比较这两个文件列表。除第一个文件外,第二个列表中的所有文件都已被解析(在本例中为Class1.java和Class2.java)。因此,对于这些文件中的每一个,我拉入了从临时分支解决了冲突的版本(就像樱桃挑选一样,但针对单个文件,而不是整个提交):

代码语言:javascript
运行
复制
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package1/Class1.java
$ git checkout my-temp-branch myproject/src/main/java/com/acme/package2/Class2.java

完成此操作后,我回到了存储之前的状态,因此我可以继续解决剩余的冲突并提交合并。

票数 2
EN

Stack Overflow用户

发布于 2012-01-26 09:44:29

当您处于冲突状态(索引和工作目录)时,您将无法执行git stash -它将给出一个错误,以满足未合并的条目。

确保你真的做了大量的工作。请参见git stautsgit stash show的输出

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9009354

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档