Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/git/22.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
将团队从Git Merge切换到Rebase_Git_Workflow_Git Merge_Git Rebase - Fatal编程技术网

将团队从Git Merge切换到Rebase

将团队从Git Merge切换到Rebase,git,workflow,git-merge,git-rebase,Git,Workflow,Git Merge,Git Rebase,我们的研发工作涉及两个中央回购协议,最初是由非常顽固的聪明人发起的,一个与rebases合作,另一个与gitflow和merges合作。虽然我对使用合并非常满意,而且我看到大多数github项目都使用这种模式,但我们面临着遵守“rebase”的压力,因为我们正在转向一个更有组织的Gerrit代码审查系统,而且许多开发人员正从另一个团队过来接受我们的回购 这就是问题所在:手册警告我永远不要混合重定基址和合并,现在我必须更换我的整个团队。我想知道如何做到这一点而不给代码的稳定性带来太多风险。人们总是

我们的研发工作涉及两个中央回购协议,最初是由非常顽固的聪明人发起的,一个与rebases合作,另一个与gitflow和merges合作。虽然我对使用合并非常满意,而且我看到大多数github项目都使用这种模式,但我们面临着遵守“rebase”的压力,因为我们正在转向一个更有组织的Gerrit代码审查系统,而且许多开发人员正从另一个团队过来接受我们的回购


这就是问题所在:手册警告我永远不要混合重定基址和合并,现在我必须更换我的整个团队。我想知道如何做到这一点而不给代码的稳定性带来太多风险。人们总是有一两个开放的特性分支,在开发过程中可能会多次从dev合并。这样的功能分支是否可以切换到重定基址,或者截止日期应该是在所有功能分支都已首先合并并且自fork以来没有分支在其历史记录中存在合并之后?如何将其规划为平滑过渡?

混合合并和重新基础的主要问题是,当您执行重新基础时,它会“线性化”历史,而这在合并提交中效果不佳。但随着历史变得更简单、更容易推理,线性化本身实际上有其自身的优点

最简单的策略是避免合并。当我们早些时候会说
git merge X
do
git rebase X

这并不是那么糟糕,除非您在本地分支中有几个提交,其中一个在重新基址时出现合并冲突。对同一地点的进一步提交可能会一次又一次地产生相同的合并冲突。这种情况下的解决方法可能是中止rebase
git-rebase--abort
,或者使用
git-rebase--interactive
重新安排本地提交,或者挤压本地提交(
git-reset$(git-merge-base-HEAD X)
)。之后重复重新设置基准

在进行回扣时,应特别注意共享分支机构。重定这些值时需要人工同步,许多人更愿意避免,见下文:

另一种方法是在开发过程中从上游接受合并,并在合并回来/提出拉动请求之前进行挤压,例如:

 git checkout -b Work
 #work...commit...commit..
 git merge X
 #work...commit...commit..
 git merge X
 git reset X && git add . && git commit -m 'All my work squashed'
 #alternatively the last part might be like this:
 git checkout X && git merge --squash Work

这种方法的优点是,您可以相对安全地共享这样的分支,而无需人工通信的开销。在合并两个分支时解决冲突通常比在另一个分支上重放一个分支时更容易

我认为您需要理解并使用merge和rebase来处理git(尤其是在gerrit中)

一些例子

当您将功能分支提升到新的远程主机时,您将合并。这提供了最少的提升工作,并且很容易在例如gitk中跟踪特性开发的历史

git fetch
git checkout origin/my_feature
git merge origin/master
git commit
git push origin HEAD:refs/for/my_feature
在准备传递提交时,您将进行合并(使用
--squash
选项,因为
主控
中不允许合并提交)

当交付提交由于任何原因导致集成失败,并且需要将其更新为新的远程主机时,您将重新设置基址

git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master
git-fetch
git获取
吉特收银头
git重新基址源/主
git推送原点磁头:refs/for/master

P.S.希望你们在考虑搬到Gerrit时知道自己在做什么。我希望我能对此发表意见,这是一家大型国际公司,我们从上面得到了这个要求。到目前为止,我们一直在使用Atlassian隐藏,但我们需要稍微严格一点的代码审查规则。在某些情况下,Gerrit可能是一个过火的工具,这就是你的建议吗?根据我的经验,Gerrit更倾向于成为一个禁用工具,而不是一个启用工具。也许还值得检查一下(重用冲突合并的记录解决方案),以解决重复获得相同合并冲突的问题。
git fetch
git fetch <gerrit link>
git checkout FETCH_HEAD
git rebase origin/master
git push origin HEAD:refs/for/master