2011-09-01 75 views
2

我们是一个使用Git的小型应用程序,我们所有人都是新手。在这个月,我们已经使用Git和开始与功能分支试验和释放分支机构或两个,我们遇到了一点面条事件这样一个引起的合并冲突等:纠正Git中旧的合并混乱

enter image description here

黑线是我的发展分支。忽略红色的。你会看到单个提交如何从该开发树中分离出来,然后再合并回来。通过展开树来清除一些旧的蜘蛛网是否可能?我的头现在大约有500多个提交。

我读过这可以通过rebasing而不是合并来避免。

尽管这是一件小事,但如果可能的话,我想解决这个问题,因为这两者都是OCD和清晰度的问题。

谢谢。

+2

git的git的一大优点就是能准确记录提交的地方以及它们是如何合并的。你确定要压扁你的历史吗?重写500次准确的历史提交以伪造历史来替代它们对我来说是错误的。 –

+0

我不太了解重新布局/过滤或任何需要完成此操作的知识。我已经展示的例子只是现在分散在我们的回购库中的众多例子之一。如果有简单的方法来平坦化这些,那将是很好的,但除此之外,如果它需要几个小时坐在文本编辑器上并解决冲突,我宁愿跳过它。虽然清理提交树会很棒,但如果可能的话,我不介意删除提交,因为其中很多都没有发生很大的变化。谢谢。 –

回答

5

如果你真的想线性化历史上的主分支提交A后,你总是可以做:

git checkout master 
git rebase A 

但是,这意味着,你重写你的master分支的历史,所以如果您(强制)推送这个新版本,则必须向团队中的每个人介绍如何获取新版本并重置其主分支以匹配重写版本。否则,人们可能会拉动,这会将改写的分支与现有的分支合并,从而击败练习的对象。

这些小差异通常发生在有人在其主分支上创建提交时,但服务器上的主服务器已在平均时间内移动 - 这意味着当它们再次拉出时,需要合并提交。您可以在未来或者通过类似的措施避免这种情况:

  • 鼓励人们使用git pull --rebase
  • 告诉人们使用branch.<name>.rebasebranch.autosetuprebase配置选项,让他们不要忘记添加--rebase
  • 添加钩到refuses pushes of non-linear history

不过,我个人不介意看到在历史上的这些合并的服务器 - 具有良好的浏览器的历史,它仍然很清晰w ^帽子正在发生。

+2

如果500+提交,这只是许多例子中的一个,我会保留原样,并使用Mark的一些想法,以防止它在将来发生...重写公共历史通常不是一个好主意... – johnny

+0

嗨马克,我试图重新装订它,这并不容易。我只是跳过它,并使用分支钩子。 .rebase'和'branch.autosetuprebase' - 在本地还是在服务器上?两者有什么区别? (希望我不会在这里问这个问题)。我并没有想要平坦化我的功能分支提交。这只是为了防止这些非线性提交。我是否仍然需要启用这些选项?谢谢。 –

+0

这些选项在文档中描述(http://www.kernel.org/pub/software/scm/git/docs/git-config.html#_variables)。总之'branch.autosetuprebase'会导致分支。 .rebase'在某些情况下为新创建的分支设置。这两个设置都将在每个开发人员的存储库中本地应用。该钩子应该被添加到裸机存储库中,这样您即使有人未使用这些设置或忘记重新绑定,尝试推送也会失败并显示一条有用的错误消息。 –