我正在解决合并冲突,需要回到旧的代码库来弄清楚它之前是如何工作的。
我直观地隐藏了我的工作副本,检查了我想要的东西并应用了藏匿处。
现在我遇到了很多麻烦,因为我的代码已经保存但我不再在终端中的分支名称旁边看到|MERGING
,而我丢失了从另一个分支的所有提交。对于git,它看起来不再是合并提交,而只是一个新的代码更改。
我做错了什么,以后如何避免同样的问题?
注意:按原样提交它不是一种选择,因为我们正在处理2个不同的存储库,我们需要不时地将它们合并到另一个存储库中。如果我们在一次合并期间更改校验和,我们将面临大量冲突,因为在下一次合并时,git将无法识别先前合并的代码。一遍又一遍地合并相同的repo看起来像是多次合并同一个分支。校验和应该保持不变。
答案 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
。