开源项目中Git仓库的最佳实践

33

我正在为一个托管在Github上的相对较小的开源项目做出贡献。为了让其他人能够利用我的工作,我在Github上创建了自己的分支(fork)。尽管Github选择的术语是这样,但我不希望完全脱离主要项目。然而,我不希望或期望我的所有工作都被接受到主代码库中。其中的一些已经合并到主代码库中,我希望这种情况可以继续下去。我遇到的问题是如何最好地保持我们两个代码树的状态,以便可以轻松地共享代码。

我可能会遇到的一些情况包括:

  • 我提交的代码最终被接受到主代码库中,当我将来从该代码库pull时,在我的代码库中会重复出现这个提交。
  • 我提交的代码永远不会被接受到主代码库中,当我将来从该代码库pull时,两个代码树会分叉,并且很难解决。
  • 其他人来参与工作,并在我的代码库基础上开始工作。因此,如果可能的话,我应该尽量避免更改我已经push过的提交,例如使用git rebase。
  • 我希望向主代码库提交代码。理想情况下,我的更改应该很容易转换成补丁(最好使用git format-patch),并直接、干净地应用到主代码库中。

据我所知,有两种或可能三种处理这个问题的方法,但都不太理想:

  • 经常运行git rebase以保持我的更改基于上游代码库的head。通过这种方式,我可以消除重复的提交,但通常必须重写历史记录,这会给那些想从我的工作中派生出工作的人带来问题。
  • 经常将上游代码库的更改合并到我的代码库中。这在我的一端可以正常工作,但似乎不容易将我的代码提交到上游代码库。
  • 使用这些方法的组合,可能包括git cherry-pick,以保持一切井然有序。

在这种情况下其他人都做了什么?我知道我的情况类似于各种内核贡献者和Linus的主要存储库之间的关系,因此希望有好的处理方法。虽然我对Git还比较新,但我还没有掌握所有它的细节。最后,特别是由于Github,我的术语可能不是完全一致或正确的。请随意纠正我。


请注意,即使您(强制)推送了您的变基更改,其他人也可以轻松地使用变基拉取更新。这只是另一个工作坊,在那里历史记录正在不断地被重写。除此之外,由于强制推送能够清除所有内容,您需要更加小心 :) - rubenvb
1个回答

17

我从类似情况中学到的一些技巧:

  • 为上游作者的工作创建一个远程跟踪分支。
  • 每隔一段时间将更改从该跟踪分支合并到您的主分支中。
  • 为您正在处理的每个主题创建一个新分支。这些分支通常应仅为本地分支。当您从上游获取更改并合并到主分支时,请使用变基(rebase)方法更新您的主题分支以反映这些更改。
  • 完成某个主题工作后,请将其合并到主分支中。这样,从您派生工作的人将不会看到太多重写历史,因为变基过程发生在您的本地主题分支中。
  • 提交更改:您的主分支基本上是一系列提交,其中一些与上游相同,其余则是您自己的。如果需要,后者可以发送为补丁。

当然,分支名称和远程跟踪分支的选择是由您自己决定的。我不确定这些对于该场景是否穷尽了所有情况,但它们涵盖了我大部分遇到的问题。


自从我提出这个问题以来,我在Git方面获得了更多的经验,并且大致上已经确定了这是最佳答案。仅将变更保留为本地提交是关键。绝对是一个非常好的提示。谢谢。 - orangejulius
你是否曾在多台电脑上使用过某个主题分支?如果是,你会怎么处理? - Andrew Grimm
1
不,我没有在不同电脑上使用过主题分支,但困难的并不是“跨电脑”这一部分,而是“跨人员”。你可以轻松地将你的主题分支推送到服务器上,这样你就可以与之一起工作。 - sykora
如果你有一个由程序员组成的团队,他们在同一个外部维护的开源项目的不同主题分支上工作,那该怎么办呢?你需要一个公司的git服务器,所有程序员都要将代码推送到这个服务器上。你需要在这里设置主分支,并从他们的主题分支中合并很多提交记录。然后,当你将补丁发送到上游时,你很可能会将这些合并提交记录压缩为单个提交记录。然后,如果它们被接受,你需要再次从上游获取它们。它们不会与你已经在git服务器上拥有的提交记录冲突吗?如何以最干净的方式进行这样的开发? - Alexander Amelkin

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接