总结:处理对要维护一组本地更改的上游存储库的长期运行跟踪的最佳实践是什么?
我想让 github 上的一个分支与上游保持同步,但仍允许清楚地跟踪该分支独有的更改。 (对于此讨论,假设 upstream 指向主项目存储库并且 origin 指的是我的存储库分支)
假设我有这样的事情,当 upstream/master 位于 E 时,我 fork 了一个存储库。
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T
\-L-M-/ \-Q-R-/
在 fork 存储库后,我创建了两个功能分支(L-M 和 Q-R)以添加我需要的新功能,并将它们 merge 回我的源/母版。所以现在我的分支有上游不存在的改进。
我发现上游有几个有趣的修复,所以我想重新与上游同步。根据我找到的大多数引用资料(git hub fork),推荐的方法是将 upstream/master merge 到您的 origin/master 中,然后继续您的工作。所以我会发出如下命令:
git checkout master
git fetch upstream
git git merge upstream/master
git push
然后我会得到如下所示的存储库:
Upstream:
A-B-C-D-E-F
Fork:
A-B-C-D-E ----- P ------T-F'
\-L-M-/ \-Q-R-/
虽然我看到了一些问题。
我的存储库中实际上没有提交 F,我有 F',它具有相同的内容,但哈希值不同。所以我不能轻易地引用两个存储库之间的提交并知道我有变化。 (当考虑到上游可能有不止一个变化并且它有自己的一组已 merge 的功能分支时,它变得更加复杂)
随着我继续前进并继续这样做,我越来越难以知道除了上游中的内容之外,我的存储库中还有哪些更改。例如,我可以将其中一些更改提交回上游,同时继续添加我自己的改进。在多次迭代之后,查看我的存储库的人如何知道它与上游有何不同? (是否有 git 命令来查找这些更改?)
与 #2 类似,人们如何在上游找到修复程序并检查我的 fork 是否包含该修复程序?
我想问题的根源在于我无法保证我的存储库在任何给定点与上游“同步”,因为代码和哈希值不相同。那么,我该如何准确地跟踪变化并避免自己为了保持同步而发疯呢?
注意:我曾考虑使用 rebase 来使我的存储库 rebase 到上游,但这有一组完全不同的问题。例如,如果有人通过子模块、分支等引用我的存储库,那么历史重写将破坏他们的引用。此外,我认为我的分支历史不会在 rebase 后仍然存在,因此我无法完整查看我创建的所有功能分支和相关历史。
其他人如何处理这个问题?我应该研究哪些最佳实践?
更新:
根据 Seth 的反馈,我创建了一组测试存储库来展示我在说什么以及它如何按照他所说的方式运行。
存储库是:
它们应该更清楚地展示当本地发生变化时从上游 merge 的样子。
最佳答案
您的假设不正确。您在文本示例中说过您将运行 git merge 命令。如果你真的是这个意思,而不是 git cherry-pick (并且为了记录,git-merge 是这种情况下的最佳实践)那么你不会在你的分支中得到 F`,你得到 F . 也许是一张图片:
在获取之后但在 merge 之前,您的存储库看起来像这样:
Upstream:
A-B-C-D-E-F [master]
Fork: /-F [upstream/master]
A-B-C-D-E ----- P ------T [master]
\-L-M-/ \-Q-R-/ [Other branches]
merge 后,您的存储库将如下所示:
Fork: /-F-------------\ [upstream/master]
A-B-C-D-E ----- P ------T-U [master]
\-L-M-/ \-Q-R-/ [Other branches]
您的仓库中的新提交“U”将是 merge 提交,就像提交“P”和“T”一样。
git cherry-pick 将创建“F'”,如您在示例中所示。不要那样做。 git rebase 有时可以支持 rebase 分支 git rebase -p 但它并不总是有效。此外,这是在重写公共(public)历史,这是一个坏主意。
我有一份关于 git 最佳实践的文档:Commit Often, Perfect Later, Publish Once您可能特别想研究工作流部分以获得更多灵感。
关于git - 在 github 上的 fork 中跟踪上游的最佳实践,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11459072/
很好奇,就使用rubyonrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提
我主要使用Ruby来执行此操作,但到目前为止我的攻击计划如下:使用gemsrdf、rdf-rdfa和rdf-microdata或mida来解析给定任何URI的数据。我认为最好映射到像schema.org这样的统一模式,例如使用这个yaml文件,它试图描述数据词汇表和opengraph到schema.org之间的转换:#SchemaXtoschema.orgconversion#data-vocabularyDV:name:namestreet-address:streetAddressregion:addressRegionlocality:addressLocalityphoto:i
在MRIRuby中我可以这样做:deftransferinternal_server=self.init_serverpid=forkdointernal_server.runend#Maketheserverprocessrunindependently.Process.detach(pid)internal_client=self.init_client#Dootherstuffwithconnectingtointernal_server...internal_client.post('somedata')ensure#KillserverProcess.kill('KILL',
我想设置一个默认日期,例如实际日期,我该如何设置?还有如何在组合框中设置默认值顺便问一下,date_field_tag和date_field之间有什么区别? 最佳答案 试试这个:将默认日期作为第二个参数传递。youcorrectlysetthedefaultvalueofcomboboxasshowninyourquestion. 关于ruby-on-rails-date_field_tag,如何设置默认日期?[rails上的ruby],我们在StackOverflow上找到一个类似的问
我将我的Rails应用程序部署到OpenShift,它运行良好,但我无法在生产服务器上运行“Rails控制台”。它给了我这个错误。我该如何解决这个问题?我尝试更新rubygems,但它也给出了权限被拒绝的错误,我也无法做到。railsc错误:Warning:You'reusingRubygems1.8.24withSpring.UpgradetoatleastRubygems2.1.0andrun`gempristine--all`forbetterstartupperformance./opt/rh/ruby193/root/usr/share/rubygems/rubygems
我正在尝试从Postgresql表(table1)中获取数据,该表由另一个相关表(property)的字段(table2)过滤。在纯SQL中,我会这样编写查询:SELECT*FROMtable1JOINtable2USING(table2_id)WHEREtable2.propertyLIKE'query%'这工作正常:scope:my_scope,->(query){includes(:table2).where("table2.property":query)}但我真正需要的是使用LIKE运算符进行过滤,而不是严格相等。然而,这是行不通的:scope:my_scope,->(que
导读:随着叮咚买菜业务的发展,不同的业务场景对数据分析提出了不同的需求,他们希望引入一款实时OLAP数据库,构建一个灵活的多维实时查询和分析的平台,统一数据的接入和查询方案,解决各业务线对数据高效实时查询和精细化运营的需求。经过调研选型,最终引入ApacheDoris作为最终的OLAP分析引擎,Doris作为核心的OLAP引擎支持复杂地分析操作、提供多维的数据视图,在叮咚买菜数十个业务场景中广泛应用。作者|叮咚买菜资深数据工程师韩青叮咚买菜创立于2017年5月,是一家专注美好食物的创业公司。叮咚买菜专注吃的事业,为满足更多人“想吃什么”而努力,通过美好食材的供应、美好滋味的开发以及美食品牌的孵
文章目录git常用命令(简介,详细参数往下看)Git提交代码步骤gitpullgitstatusgitaddgitcommitgitpushgit代码冲突合并问题方法一:放弃本地代码方法二:合并代码常用命令以及详细参数gitadd将文件添加到仓库:gitdiff比较文件异同gitlog查看历史记录gitreset代码回滚版本库相关操作远程仓库相关操作分支相关操作创建分支查看分支:gitbranch合并分支:gitmerge删除分支:gitbranch-ddev查看分支合并图:gitlog–graph–pretty=oneline–abbrev-commit撤消某次提交git用户名密码相关配置g
我有一个.pfx格式的证书,我需要使用ruby提取公共(public)、私有(private)和CA证书。使用shell我可以这样做:#ExtractPublicKey(askforpassword)opensslpkcs12-infile.pfx-outfile_public.pem-clcerts-nokeys#ExtractCertificateAuthorityKey(askforpassword)opensslpkcs12-infile.pfx-outfile_ca.pem-cacerts-nokeys#ExtractPrivateKey(askforpassword)o
我认为我的问题最好用一个例子来描述。假设我有一个名为“Thing”的简单模型,它有一些简单数据类型的属性。像...Thing-foo:string-goo:string-bar:int这并不难。数据库表将包含具有这三个属性的三列,我可以使用@thing.foo或@thing.bar之类的东西访问它们。但我要解决的问题是当“foo”或“goo”不再包含在简单数据类型中时会发生什么?假设foo和goo代表相同类型的对象。也就是说,它们都是“Whazit”的实例,只是数据不同。所以现在事情可能看起来像这样......Thing-bar:int但是现在有一个新的模型叫做“Whazit”,看起来