在没有提交的情况下挑选分歧分支之间的冲突
我有两个分支(主人和功能)分歧。
master - C1 - C3
feature C2 - C4 - C5
C2和C4只是临时代码的肮脏提交,我不想进入两个分支的最终合并/重新分配。
我通常执行一个:
git checkout master
git cherry-pick C5 (last commit from the feature branch)
但是这次我有C3冲突,我不能选择提交。
我所尝试的是将C3重新分配到功能分支中,以免在挑选樱桃时发生冲突。
git checkout feature
git rebase master
现在我明白了
master - C1 - C3
feature C2 - C4 - C5
似乎很好,但如果我尝试重新挑选主人,我仍然会发生冲突(在某些空白区域我从某些文件中删除)。
Git告诉我要解决冲突,添加文件并提交。 我可以手动解决冲突,但不希望将其作为冲突解决方案提交。
我想避免在我的历史中提交与实现无关的事情。 我甚至不知道该写什么作为提交信息。
我通常更喜欢挑选原因,因为我可以避免“无用的”合并提交,并且只是提交代码更改。 之后,我删除了分支,过了一会儿,我确定我不再需要它了
[[编辑]]
奇怪的行为是C5和C3在C3上未更改的文件上发生冲突。
事实上,所有检测到的冲突在主分支上都是空的
<<<<<<< HEAD
=======
[ added code ..................... ]
[ .......... from ................ ]
[ ............... 'feature' branch ]
>>>>>>> 581g52d... "Commit message from 'feature' C5 "
我需要'解决'只是从冲突的文件中删除冲突标签。
[[编辑2]]
而且,如果我尝试`git cherry-pick master / C3来获得特性:
没有更改添加到提交(使用“git add”和/或“git commit -a”)之前的樱桃选项现在为空,可能是由于冲突解决。
我不明白为什么我会在相反的方向发生冲突(从功能到主人)
[[编辑3 - 从一开始就重试! ]]
这也是我的尝试。
创建主分支的两个副本,其中C3作为最后一个提交,名为:master_copy和repeat_feature
git checkout master
/ git branch master_copy
/ git branch repeat_feature
git checkout repeat_feature
/ git cherry-pick C2^..C5
(来自功能) git checkout master_copy
/ git cherry-pick repeat_feature_C5
我仍然遇到同样的冲突!
即使我从相同的C3提交开始(将分支克隆到repeat_feature分支时),并尝试挑选相同的C3提交(进入master_copy)!
我完全没有理解发生了什么,以及为什么我得到这些空的冲突,这些冲突阻止我将我的功能移动到主分支。
这里需要专家的建议。
我完成了改变方法:
git checkout feature_branch
/ git checkout -b copy_feature_branch
); git reset <branch_parent_commit>
git add .
重新添加所有更改git add .
,然后提交git commit
git checkout master
/ git cherry-pick <last-commit-of-copy_feature_branch>
) 这样我根本没有冲突 (就像我期望发生的那样),并且我只获得了一次提交,它将从feature_branch 引入所有更改 (或者更改 “数据包”)。 我制作了我的功能分支的副本,这样我可以有一段时间完成WIP提交序列,这可能对我们有一段时间有用(用于测试,应用修复程序,查看特定功能更改的历史记录)。 而不是删除分支,我通常用git branch -m <current_name> FINISHED_<current_name>
重命名它,并保留它直到我不确定我想删除它。
这不是一个美妙的工作流程,但实际上它为我工作,等待找到更好的方式来完成我的需求。
不幸的是,我仍然无法解释导致冲突的具体逻辑,当选择最后一次提交时(部分改变功能)。 我知道我做错了,但不知道那些特定文件部分的冲突是如何出现的。
我想避免在我的历史中提交与实现无关的事情。
当我在这个主题上阅读了很多关于SO
的答案时,我可以说大多数人建议不要使用不必要的git cherry-pick
。
是的, cherry-pick
不是为了合并某些东西,而是通过一系列提交来开发的。 它用于从一个分支到另一个分支的小改动,这两个分支在其他提交中都没有改变。
主要的可能性是合并feature
C5
状态到master
同时避免一些脏C2
和C4
是使用压扁。
1.使用merge
:
git checkout master
git merge --squash feature
2.使用rebase
:
这可以通过交互式rebase完成:
git checkout feature
git rebase -i master
然后,你应该改变pick
以squash
除了一个之外的所有提交。
另外,用squash!
开始你所有的临时提交信息squash!
或fixup!
字。 然后你就可以使用autosquash
(在rebase期间所有的temp提交都会在列表中显示这个关键字)
git checkout feature
HASH=`git merge-base --fork-point master`
git rebase -i $HASH --autosquash
链接地址: http://www.djcxy.com/p/26083.html
上一篇: pick conflicts between diverged branches without committing