1

我们在 git 中使用了一个非常简单的结构。

首先我们有我们的master分支。

下面我们有develop

最后我们可以有任何feature分支

我们只使用 rebase 来更新我们分支的历史记录,然后 f-forwarding 到上面的分支。

每周,我们的develop分支都更新了一些features. 并且这个分支被重新定位并合并到 master (从developto master)。

问题

当我们变基并合并develop到 时,有时会出现冲突,我必须通过在我的分支中master执行master变基来修复它们。develop修复冲突后,我执行git push --force-with-lease将更改上传到远程。

在这个过程之后,发展的历史因为力推而改变。

当另一个开发人员正在feature基于强制推送之前的分支develop(强制推送develop之前)处理一个分支时,问题就存在了。

我们如何feature用新的分支历史更新这个开发者的develop分支。因为,git rebase develop 在我们的feature分支里面做的时候。我们最终会发生很多冲突。

4

4 回答 4

1

如果我理解正确,开发人员是这种情况:

--*--x--*--m <- master
      \
       \
        *--*--f <- develop
               \
                a--b--c <- feature

在他获取更新后,他到达:

--*--x--*--m <- master
      \     \
       \     *--*--f' <- develop
        *--*--f
               \
                a--b--c <- feature

a, b, c要仅在 之上重播develop,请应用 @Vitali 建议的命令:

  • 现场提交:和f之间的原始分叉点,featuredevelop
  • 跑 :git rebase --onto develop <f> feature

如果一切顺利,他将达到以下状态:

--*--x--*--m <- master
            \
             *--*--f' <- develop
                    \
                     a'--b'--c' <- feature

# only 'a--b--c' are replayed from the original 'feature' branch,
# not '*--*--f'
于 2021-09-08T20:25:18.573 回答
0

使用交互式 rebase 或 git cherry-pick 很简单。

我认为交互式变基要快一些。有关更多详细信息,请参阅 git-scm 文档中标题为更改多个提交消息的部分。

两步交互式变基

  1. 创建my-feature-cleanup分支。从master分支开始省略所有旧工作。
git checkout master
git checkout -b my-feature-cleanup
  1. 发出interactve rebase 命令以将好的提交从my-feature分支my-feature-cleanup 中变基。
git rebase -i origin/my-feature

上面的命令应该打开一个 git-rebase-todo 编辑器窗口。选择pick要保留drop的提交和不想保留的提交。

# p, pick <commit> = use commit
# d, drop <commit> = remove commit

另外的选择

樱桃采摘也可以。这是相同的想法,但可能需要多个命令来挑选单个提交,而不是一次完成所有操作。

  1. 它以同样的方式开始
git checkout master
git checkout -b my-feature-cleanup
  1. 列出 my-feature 中的提交
git log my-feature
commit 02345 Something I did
commit 12345 Merge branch 'X' of 'Y'
commit 22345 A thing someone else did
commit 32345 Another thing I did
  1. Cherry 从我的功能中挑选个人提交,从最旧的提交开始
git cherry-pick 32345
git cherry-pick 02345

这将在 my-feature-cleanup 上进行两次提交。

git log my-feature-cleanup
02345 Something I did
32345 Another thing I did
etc...

祝你好运!

于 2021-09-09T16:14:57.980 回答
0

git rebase --onto您可以在此处的问题中找到。另一种很长的路是:

1.

git checkout -b feature1 develop  # this will create a new branch that will be in sync with your current develop
  1. 检查feature分支上的提交并记下开始和最后一次提交develop

git cherry-pick <commitA>^..<commitB>
  1. 冲突总是在那里让你解决,但我发现它不太容易引入错误。解决它们。

  2. 对当前分支满意后,删除旧feature分支并重命名feature1feature.

于 2021-09-09T02:34:50.307 回答
0

问题:来自已删除集成分支的提交存在于功能分支中。它们需要被删除或恢复。

详细解决方案:将来,请按如下方式更改您的工作流程。

  • 不要将集成分支合并到功能分支中。git pull origin develop
  • 将master合并到功能分支中。git pull origin master
  • 将功能分支合并到名为develop的集成分支中git checkout develop && git merge my-feature

细节

ff-only 选项可确保开发人员仅获得可快速转发的更改,并且他们的功能不会受到开发分支中的瞬态突变的污染。

开发人员应该feature-that-worksmaster.

在工作开始时:

git pull
git checkout master
git checkout -b feature-that-works

现在我有一个名为的新分支feature-that-works,我准备开始编写我的功能。

如果我将集成分支develop直接拉到我的feature-that-works分支中会发生什么?我的功能分支被合并到集成分支中的所有其他正在进行的工作所污染。我无法控制其他正在进行的工作,一般来说,我不希望它污染我干净的功能分支。这就是为什么我不从名为的集成分支中提取develop到我的feature-that-works.

及时了解变化

将 master 拉到功能分支中不是问题。有时在我的持续部署项目中,我每天从 master 获取几次。这可以!

git checkout feature-that-works
git pull --ff-only origin master

如果有冲突,上面带有 --ff-only 选项的命令将失败。

发生冲突时该怎么办

下一个命令在 feature-that-works 下 rebase master。

git pull -r origin master

当该ff-only选项因冲突而失败时,我必须将我的分支重新置于主人之上。另一种说法是我需要在我的功能分支重新设置 master 。这确保了主分支总是可以快进。

通过在我的本地特性分支中重新定位,可以将我的特性分支中的提交历史重播到主分支上,而不会出现任何合并冲突。我正在本地解决所有冲突,而不是等到将我的更改应用到主分支上。如果有问题,希望它是一个小问题,我可以在本地解决,而不是等待并让它成为下游其他人更头痛的问题。

这是另一个很好的解释,用简单的视觉描述为什么ff-only首选 git merge。

一个有趣的事实:如果没有该ff-only选项,该git pull命令实际上与git fetch+相同git merge

一体化

我将 a 合并feature-that-worksdevelop. 正如我之前提到的,它不能反过来工作。

git push origin feature-that-works
git fetch
git checkout develop
git reset --hard origin/develop
git pull origin feature-that-works
git push origin develop

我使用的原因git reset --hard origin/develop是因为开发分支是可变的。开发可以由其他人强制推动。我想确保我的本地开发分支与远程上游分支 origin/develop 匹配。

仅此而已。请记住,即使有良好的工作流程,开发人员也需要沟通,并且有时可能必须与其他开发人员一起解决合并冲突。

于 2021-09-09T03:11:47.137 回答