git stash未解决的合并冲突

时间:2016-10-18 09:57:26

标签: git git-merge git-stash

我正在解决合并冲突,需要回到旧的代码库来弄清楚它之前是如何工作的。 我直观地隐藏了我的工作副本,检查了我想要的东西并应用了藏匿处。 现在我遇到了很多麻烦,因为我的代码已经保存但我不再在终端中的分支名称旁边看到|MERGING,而我丢失了从另一个分支的所有提交。对于git,它看起来不再是合并提交,而只是一个新的代码更改。

我做错了什么,以后如何避免同样的问题?

注意:按原样提交它不是一种选择,因为我们正在处理2个不同的存储库,我们需要不时地将它们合并到另一个存储库中。如果我们在一次合并期间更改校验和,我们将面临大量冲突,因为在下一次合并时,git将无法识别先前合并的代码。一遍又一遍地合并相同的repo看起来像是多次合并同一个分支。校验和应该保持不变。

1 个答案:

答案 0 :(得分:2)

有些东西并没有完全加起来,因为git stash通过提交来工作。你说:

  

我正在解决合并冲突......我直觉地隐藏了我的工作副本

如果您处于冲突合并的中间,则无法进行提交,因此您无法使用git stash

... [set up some conflicts; get onto branch b2, with b1 ready to conflict]

$ git add README && git commit -m 'b2-readme'
[b2 c548973] b2-readme
 1 file changed, 1 insertion(+)
$ git merge b1
Auto-merging README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.
$ git status
On branch b2
You have unmerged paths.
  (fix conflicts and run "git commit")

Changes to be committed:

    new file:   file1

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

    both modified:   README
$ git stash
README: needs merge
README: needs merge
README: unmerged (af8a7b1af61c4d6a71415c41d0f19a418d5a1e3c)
README: unmerged (1eafc235a9f2cb59959d554ba9b9e11877c88349)
README: unmerged (7616840fd1336b8bcae3f33e2c6c69890e563121)
fatal: git-write-tree: error building trees
Cannot save the current index state

要实际发生藏匿,您必须解决冲突。当然,Git并不关心如何解决它们

$ cat README 
We put a dummy README file into the base,
to get an initial commit.
<<<<<<< HEAD
conflicting b2 change
||||||| merged common ancestors
=======
conflicting change in b1
>>>>>>> b1
$ git add README    # Yuck! "resolve" conflicts by leaving markers
$ git status --short
M  README
A  file1
$ git stash
Saved working directory and index state WIP on b2: c548973 b2-readme
HEAD is now at c548973 b2-readme

如果这就是你所做的 - 也许在做一些合理的冲突时,而不是我在这里的愚蠢的例子 - 然后你这样做了:

$ git stash pop   # NB: better to "git stash apply" really
On branch b2
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

    new file:   file1

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:   README

Dropped refs/stash@{0} (8a947fcd34b3259fbb2fbf667bc0b99cc139a88c)
你有点麻烦,但不是太多。问题是你现在在你的索引和工作树中拥有你完成(成功的,这次)git stash时的状态,但是你丢失了合并状态文件({{1} }和.git/MERGE_HEAD)。

  

注意:按原样提交它不是一个选项,因为我们正在处理2个不同的存储库,我们需要不时地将它们合并到另一个。

像失败一样提交always an option!例如,在这种情况下,诀窍是现在提交结果,然后返回并重新启动合并。

由于Git中分支的混乱特性,现在可以在.git/MERGE_MSG上提交,然后使b2(名称)不再包含 commit 。但是,首先创建一个 new 分支名称同样简单,甚至更容易,而且更加容易混淆。然后你可以在那里进行提交,而不是b2

b2

现在你可以回到$ git checkout -b save-merge-result M README A file1 Switched to a new branch 'save-merge-result' # NOTE: use "git status" (not shown here) to see what you # still need to "git add" (which is `README` in my case) $ git add README $ git commit -m 'save merge result on temp branch' [save-merge-result f8b2251] save merge result on temp branch Date: Tue Oct 18 05:58:14 2016 -0700 2 files changed, 20 insertions(+) create mode 100644 file1 并重做b2,这当然会再次出现冲突: 1

git merge

现在您可以从临时合并中提取结果。例如:

$ git checkout b1
Switched to branch 'b1'
$ git merge b2
Auto-merging README
CONFLICT (content): Merge conflict in README
Automatic merge failed; fix conflicts and then commit the result.

此时,您可以根据需要/期望更多地修改$ git checkout save-merge-result -- . $ git status On branch b1 All conflicts fixed but you are still merging. (use "git commit" to conclude merge) Changes to be committed: modified: README new file: file2 个文件。

请注意,如果您尚未在存储中创建git add,则可以使用git pop将存储转换为自己的存储,只需一步即可完成。由于git stash branch只提交提交,因此您永远不会需要来使用git stash save:只需创建一个分支并在那里提交。 git stash所做的就是为您提供名称为git stash而不是分支名称记住的提交。

(顺便说一句,请不要命名分支stash并开始使用stash Git 对此没有任何麻烦,但是你会混淆你自己。:-))

1 假设您尚未启用git stash

相关问题