在没有提交的情况下挑选分歧分支之间的冲突

我有两个分支(主人和功能)分歧。

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告诉我要解决冲突,添加文件并提交。 我可以手动解决冲突,但不希望将其作为冲突解决方案提交。

我想避免在我的历史中提交与实现无关的事情。 我甚至不知道该写什么作为提交信息。

  • 为什么我在rebase之后仍然会发生冲突?
  • 我怎样才能让C5被合并/樱桃采摘主没有额外的提交?
  • 我通常更喜欢挑选原因,因为我可以避免“无用的”合并提交,并且只是提交代码更改。 之后,我删除了分支,过了一会儿,我确定我不再需要它了

    [[编辑]]

    奇怪的行为是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
  • 樱桃选择每个提交从功能分支,直到C5,repeat_feature
  • git checkout repeat_feature / git cherry-pick C2^..C5 (来自功能)
  • (我没有冲突
  • 尝试从repeat_feature中将C5挑入master_copy
  • 记住repeat_feature是从C3开始的(所以,如果有冲突的话,那些应该在从C2到C5进行樱桃采摘时提出)
  • git checkout master_copy / git cherry-pick repeat_feature_C5
  • 我仍然遇到同样的冲突!

    即使我从相同的C3提交开始(将分支克隆到repeat_feature分支时),并尝试挑选相同的C3提交(进入master_copy)!

    我完全没有理解发生了什么,以及为什么我得到这些空的冲突,这些冲突阻止我将我的功能移动到主分支。

    这里需要专家的建议。


    我完成了改变方法:

  • 我制作了一份_feature_branch_( git checkout feature_branch / git checkout -b copy_feature_branch );
  • 我将所有分支提交“压缩”成一个分支
  • 首先:我回到分支的父提交: git reset <branch_parent_commit>
  • 第二:我用git add .重新添加所有更改git add . ,然后提交git commit
  • 最后我选择了这个提交到master分支,只用一个提交(就像我想用C5做的,误解git cherry-pick)一样,从feature_branch中应用我的更改。 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同时避免一些脏C2C4是使用压扁。

    1.使用merge

    git checkout master
    git merge --squash feature
    

    2.使用rebase

    这可以通过交互式rebase完成:

    git checkout feature
    git rebase -i master
    

    然后,你应该改变picksquash除了一个之外的所有提交。

    另外,用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

    下一篇: Merging two branches and Git history