维护forked git存储库的工作流程是什么?

时间:2015-09-17 21:04:53

标签: git github

我没有得到git。我能胜任subversion和mercurial,但是当我尝试从上游存储库合并更改并将结果推送到github上的fork时,我总是会遇到重复提交,无意义冲突,rebase循环和其他意外结果。 stackoverflow上的其他答案没有提到使用git remote add upstream,似乎缺乏我需要停止失败的细节。

例如,假设我开始使用WorldEdit,https://github.com/sk89q/WorldEdit的github仓库 在github上,我将回购交换为https://github.com/Charlweed/WorldEdit 现在我将它克隆到linux或Cygwin上的本地工作站。我使用-recursive选项,因为WorldEdit似乎有三个子模块。 git clone --recursive git@github.com:Charlweed/WorldEdit.git

cd WorldEdit

现在,按照github上的说明,我为父存储库设置了跟踪:

git remote add upstream git@github.com:sk89q/WorldEdit.git

最后,我尝试更新已注册的子模块以匹配超级项目所期望的内容:

git submodule update --init --recursive

这就是我“知道如何”设置的全部内容。我编码时一切都很好,并检查当地的变化。当我拉动并推送到我的github前叉时,一切似乎都很简单而且简单。不幸的是,一旦我尝试:

,就会开始混淆
  1. 将原始的父github repo中的更改合并到我的 forked github repo。
  2. “rebase”我的许多小本地提交成了一个 单一提交。
  3. 我拒绝详细说明我在工作流程中所做的错误:)。我应该做些什么来跟上源代码库,并提供适合拉取请求的整洁提交?

    谢谢!

1 个答案:

答案 0 :(得分:3)

GIT开发

这就是我们管理开发周期的方式。 http://nvie.com/posts/a-successful-git-branching-model/

没什么好看的......我们每个人都在自己的分支上工作,每个分支都是一个特色。当功能在范围上变得非常大时,我们将它们分解成更小的部分并在它们自己的分支中实现每个功能。确保我们将分支合并后再进入下一个分支。

这个图看起来很复杂,但它显示的是,只有两个永久分支。

  1. 发展
  2. 你可以想象像这样的分支......

    master->development->feature_branch
    

    虽然合并这样......

    master<-development<-feature_branch
    

    首先,我们只有分支。然后,我们分支一个与全球测试环境紧密结合的开发分支。最后,我们每个人都创建了自己的短命 feature_branch ,我们在自己的开发环境中进行测试。

    通过此工作流程,我们遵循三条规则

    1. 永远不要直接提交
    2. 永远不要直接致力于发展
    3. 始终从新的SHORT-LIVED分支机构实施功能
    4. 功能

      所有新功能分支都是从开发创建的。完成后,然后将它们合并回开发 ...可以在任何其他新变化(可能是其他人同时写入)中进行测试,最后当一切正常时,它会合并到

      修复

      现在,技术上的修补程序可以从 master 分支出来并快速实现,但之后需要将它们合并到开发中。我个人更喜欢以与功能分支相同的方式实现Bug修复,但这取决于你。

      测试

      在开发新分支时,您可以通过SSH连接到服务器(最好是开发环境)并切换到您的分支。 git checkout <branch-name>

      您可能还需要在第一次结账前进行git pull。此外,git branch会告诉您您所在的分支以及所有其他分支。

      GIT部署

      准备好部署后,只需将开发分支合并到master并提交+推送您的更改即可。然后SSH到服务器(Live)并执行git pull。要清除,登录到服务器时,除了拉动之外,永远不需要使用任何其他git cmd。罕见的情况当然不能承受。

      这个想法是你的生产服务器应该与你的主分支紧密结合。换句话说,永远不要在此服务器上使用git checkout <branch>

      工具

      这个纯粹由你决定,但我们的团队更喜欢使用名为sourcetree的Windows GUI工具。 https://www.sourcetreeapp.com/

      如果您更喜欢CMD线,那就没问题了。这份文档帮助我学习了一些CMD的基础知识。 http://rogerdudler.github.io/git-guide/

      大部分时间GIT和SourceTree都能很好地处理合并冲突。但是有时你需要一个三向差异工具来帮助...我强烈推荐Kdiff http://kdiff3.sourceforge.net/

      它与SourceTree集成,可以处理一些非常复杂的合并问题。如果你做得对,你可能永远不会需要这个。

      同步分支

      现在要记住Forked回购。在尝试遵循正常工作流程之前,您需要确保将上游更改合并到您的仓库中。 https://help.github.com/articles/syncing-a-fork/

      执行此操作时,首选,您没有上游存储库没有的未完成提交。如果你这样做,你需要提出一个拉取请求......当然这是假设这些提交已准备好提交。 (有关更具体的规则,请参阅引用) https://help.github.com/articles/using-pull-requests/

      @JBNizet非常重要!

        

      不要在上游回购中已经存在的分支机构工作   (例如,主人)。创建自己的,并在这些工作。   定期从上游更新主分支(它应该始终是   快进),并定期在主人身上重新分配你自己的分支。什么时候   准备好从分支机构向上游主机发送拉取请求   分支

      如果我们考虑这些话,那么您可以采用这个标准工作流并修改它以使用该项目。 询问作者他们通常如何进行,以便您可以知道应该分支哪个分支。这样您就可以通过自己的稳定分支实现更改,并且在准备就绪后,您可以执行拉取请求,以便作者可以查看您的更改。