2

我有两个分歧的分支(masterfeature)。

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 被合并/挑选以掌握?

我通常更喜欢cherry-pick,因为我可以避免“无用”的合并提交,并且只提交关于代码更改的提交。然后在那之后我删除了分支,过了一会儿我确定我不再需要它了

[[ 编辑 ]]

奇怪的行为是 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”)以前的cherry-pick 现在是空的,可能是由于冲突解决。

我不明白为什么我有相反方向的冲突(从功能

[[ 编辑 3 - 从头开始​​重试!]]

这也是我尝试过的。

  • 制作了master分支的两个副本,最后一次提交为 C3,命名为:master_copyrepeat_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)!

我完全不明白发生了什么以及为什么我会遇到这些空洞的冲突,这些冲突阻止我将我的功能移动到主分支。

这里需要专家的建议。

4

2 回答 2

1

我完成了改变方法:

  • 我制作了 _feature_branch_ ( git checkout feature_branch/ git checkout -b copy_feature_branch) 的副本;
  • 我将所有分支提交“压缩”成一个
    • 首先:我回到分支的父提交:git reset <branch_parent_commit>
    • 第二:我重新添加所有更改git add .,然后提交git commit
    • 最后,我选择了这个提交到 master 分支,只用一个提交应用了我对feature_branch的所有更改(就像我想对 C5 做的那样,误解了git cherry-pick)。git checkout master/ git cherry-pick <last-commit-of-copy_feature_branch>)

这样我就完全没有冲突(正如我所期望的那样),并且我只需一个提交即可引入来自feature_branch的所有更改(或者无论如何是一个“更改包”)。我制作了我的功能分支的副本,以便我可以在一段时间内拥有完整的WIP提交序列,这可能会很有用一段时间(对于测试、应用修复、查看特定功能的更改历史记录)。我通常不会删除分支,而是将其重命名git branch -m <current_name> FINISHED_<current_name>并保留,直到我不确定是否要删除它。

这不是一个美妙的工作流程,但实际上它对我有用,等待找到更好的方法来满足我的需求。

不幸的是,我仍然无法解释在挑选最后一次提交时导致冲突的具体逻辑(从功能中进行的部分更改)。我知道我做错了,但不知道这些特定文件部分的冲突是如何产生的。

于 2014-08-27T09:56:30.497 回答
1

我想避免在我的历史中提交与实现不直接相关的事情。

当我阅读了有关此主题的大量答案时SO,我可以说大多数人建议不要使用 unneccessary git cherry-pick

是的,cherry-pick不是为了合并某些东西,而是通过大量提交开发的。它用于将两个分支在其他提交中未更改的代码行从一个分支应用到另一个分支。

主要的可能性是在避免一些脏的同时合并feature C5状态,并且是使用 squashingmasterC2C4

1.使用merge

git checkout master
git merge --squash feature

2.使用rebase

这可以通过交互式变基来完成:

git checkout feature
git rebase -i master

然后,您应该更改picksquash除一个之外的所有提交。

此外,所有临时提交消息都以squash!orfixup!开头。然后你就可以使用了autosquash(所有的临时提交都将在 rebase 期间与这个关键字一起出现在列表中)

git checkout feature
HASH=`git merge-base --fork-point master`
git rebase -i $HASH --autosquash
于 2016-02-20T18:03:51.017 回答