我没有得到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前叉时,一切似乎都很简单而且简单。不幸的是,一旦我尝试:
,就会开始混淆我拒绝详细说明我在工作流程中所做的错误:)。我应该做些什么来跟上源代码库,并提供适合拉取请求的整洁提交?
谢谢!
答案 0 :(得分:3)
这就是我们管理开发周期的方式。 http://nvie.com/posts/a-successful-git-branching-model/
没什么好看的......我们每个人都在自己的分支上工作,每个分支都是一个特色。当功能在范围上变得非常大时,我们将它们分解成更小的部分并在它们自己的分支中实现每个功能。确保我们将分支合并后再进入下一个分支。
这个图看起来很复杂,但它显示的是,只有两个永久分支。
你可以想象像这样的分支......
master->development->feature_branch
虽然合并这样......
master<-development<-feature_branch
首先,我们只有主分支。然后,我们分支一个与全球测试环境紧密结合的开发分支。最后,我们每个人都创建了自己的短命 feature_branch ,我们在自己的开发环境中进行测试。
通过此工作流程,我们遵循三条规则
所有新功能分支都是从开发创建的。完成后,然后将它们合并回开发 ...可以在任何其他新变化(可能是其他人同时写入)中进行测试,最后当一切正常时,它会合并到主强>
现在,技术上的修补程序可以从 master 分支出来并快速实现,但之后需要将它们合并到开发中。我个人更喜欢以与功能分支相同的方式实现Bug修复,但这取决于你。
在开发新分支时,您可以通过SSH连接到服务器(最好是开发环境)并切换到您的分支。
git checkout <branch-name>
您可能还需要在第一次结账前进行git pull
。此外,git branch
会告诉您您所在的分支以及所有其他分支。
准备好部署后,只需将开发分支合并到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非常重要!
不要在上游回购中已经存在的分支机构工作 (例如,主人)。创建自己的,并在这些工作。 定期从上游更新主分支(它应该始终是 快进),并定期在主人身上重新分配你自己的分支。什么时候 准备好从分支机构向上游主机发送拉取请求 分支
如果我们考虑这些话,那么您可以采用这个标准工作流并修改它以使用该项目。 询问作者他们通常如何进行,以便您可以知道应该分支哪个分支。这样您就可以通过自己的稳定分支实现更改,并且在准备就绪后,您可以执行拉取请求,以便作者可以查看您的更改。