草庐IT

git - 是否可以告诉 Github 我的分支已 merge 到上游 master 中?

coder 2023-06-24 原文

我使用本地分支 feature 为 github 存储库创建了一个 PR(我没有写入权限)。后来我决定将它的最后一次提交分离到一个独立的 PR 中,所以我将 feature 移回了一个提交:

git checkout feature
git branch feature2
git reset --hard @~
git push -f

第一个 PR merge 到上游,所以现在我要创建第二个 PR:

git checkout master
git pull upstream master
git push origin
git checkout feature2
git rebase master

不幸的是,git 缺少feature 被 merge 到master 的信息。因此,它没有意识到 feature2master 的最近公共(public)基础非常接近:它只是 feature。相反,rebase 一直返回到 featuremaster 的公共(public)基础,就好像它们从未 merge 过一样。结果,git rebase master 变得不必要地困惑。

为什么 Github 丢失了 feature 通过上游 PR merge 到 master 的信息?有没有办法向 Github 提供该信息?

最后,我不得不求助于:

git checkout master
git checkout -b feature2_new
git cherry-pick feature2

幸运的是,我只需要处理一次提交。即使只有一次提交,我认为与真正的基础 merge (如果 git 知道的话)会比 cherry-pick 更好,因为 git 能够利用其历史知识自动解决更多冲突。

请注意,如果我要在本地将 feature merge 到 master 而不是执行 github PR,则不会丢失任何信息。当然,那样我的 master 就不会与上游 repo 同步,所以就没有意义了。

最佳答案

按照要求回答问题,

Is it possible to tell Github that my branch was merged into upstream master? [...] Why did Github lose the information that feature was merged into master through an upstream PR?

是的,当然可以记录 merge 。这很正常。

有人选择告诉 git(和 github)不要记录这个,所以效果就出现在上游 master 分支上,而不知道它们来自哪里。

您正在查看的是某人选择将主线历史与您提供的历史分开的结果。为什么他们选择这样做,你必须从他们那里找出答案。这是一个常见且广泛使用的选项,出于任何数量的人都会很乐意发表意见的原因。线性化历史看起来不错,但涉及权衡,无论哪种方式都有缺点,不同的人和不同的情况会以自己的方式倾斜天平。

无论如何,在获取结果之后,您现在得到了一个未记录的 merge ,只要您永远不要尝试 merge 后续工作仍然基于未记录的父级,这就很好、干净而且漂亮。

怎么办?

您选择的选项也可以更灵活地(它处理多次提交的 feature1..feature2 历史记录)完整拼写为

git rebase --onto master feature1 feature2

通常是最干净的:上游放弃了你的 feature1 历史,所以你放弃了它,将你的 feature2 重新建立在他们现在拥有的内容上。

如果出于某种原因您真的不想放弃自己存储库中的 feature1 历史记录——也许您拥有的不仅仅是基于旧的 feature1 提示的 feature2 并且 rebase 会开始变得乏味——您也可以添加 merge 的本地记录。

echo $(git rev-parse origin/master origin/master~ feature1) >>.git/info/grafts

这告诉本地 git 当前的 origin/master 提交将其记录的第一父提交和本地 feature1 提交作为父提交。由于上游已经放弃了 feature1 提交而你还没有,所以 git 的所有机制现在在这里和上游都可以正常工作。

不同的项目对于 pull-request 历史应该基于什么有不同的规则,有些希望所有的东西都基于一些最新的提示,其他的希望所有的东西都基于维护基础标签,其他的想要基于引入错误的提交的错误修复(我认为这应该更常见)。有些人不太在意,因为每个人都非常熟悉代码库,因此按需 rebase 仍然是最简单的。

但这里的重要部分是,推送前 rebase 是您确保推送的内容完全正确的最后机会。这是一个很好的习惯,嫁接在该工作流程中效果很好。

关于git - 是否可以告诉 Github 我的分支已 merge 到上游 master 中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43545993/

有关git - 是否可以告诉 Github 我的分支已 merge 到上游 master 中?的更多相关文章

  1. ruby - 为什么我可以在 Ruby 中使用 Object#send 访问私有(private)/ protected 方法? - 2

    类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc

  2. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  3. ruby - 使用 Vim Rails,您可以创建一个新的迁移文件并一次性打开它吗? - 2

    使用带有Rails插件的vim,您可以创建一个迁移文件,然后一次性打开该文件吗?textmate也可以这样吗? 最佳答案 你可以使用rails.vim然后做类似的事情::Rgeneratemigratonadd_foo_to_bar插件将打开迁移生成的文件,这正是您想要的。我不能代表textmate。 关于ruby-使用VimRails,您可以创建一个新的迁移文件并一次性打开它吗?,我们在StackOverflow上找到一个类似的问题: https://sta

  4. ruby - 我可以使用 Ruby 从 CSV 中删除列吗? - 2

    查看Ruby的CSV库的文档,我非常确定这是可能且简单的。我只需要使用Ruby删除CSV文件的前三列,但我没有成功运行它。 最佳答案 csv_table=CSV.read(file_path_in,:headers=>true)csv_table.delete("header_name")csv_table.to_csv#=>ThenewCSVinstringformat检查CSV::Table文档:http://ruby-doc.org/stdlib-1.9.2/libdoc/csv/rdoc/CSV/Table.html

  5. ruby - 检查数组是否在增加 - 2

    这个问题在这里已经有了答案:Checktoseeifanarrayisalreadysorted?(8个答案)关闭9年前。我只是想知道是否有办法检查数组是否在增加?这是我的解决方案,但我正在寻找更漂亮的方法:n=-1@arr.flatten.each{|e|returnfalseife

  6. ruby - 我可以使用 aws-sdk-ruby 在 AWS S3 上使用事务性文件删除/上传吗? - 2

    我发现ActiveRecord::Base.transaction在复杂方法中非常有效。我想知道是否可以在如下事务中从AWSS3上传/删除文件:S3Object.transactiondo#writeintofiles#raiseanexceptionend引发异常后,每个操作都应在S3上回滚。S3Object这可能吗?? 最佳答案 虽然S3API具有批量删除功能,但它不支持事务,因为每个删除操作都可以独立于其他操作成功/失败。该API不提供任何批量上传功能(通过PUT或POST),因此每个上传操作都是通过一个独立的API调用完成的

  7. ruby-on-rails - 如何在我的 Rails 应用程序 View 中打印 ruby​​ 变量的内容? - 2

    我是一个Rails初学者,但我想从我的RailsView(html.haml文件)中查看Ruby变量的内容。我试图在ruby​​中打印出变量(认为它会在终端中出现),但没有得到任何结果。有什么建议吗?我知道Rails调试器,但更喜欢使用inspect来打印我的变量。 最佳答案 您可以在View中使用puts方法将信息输出到服务器控制台。您应该能够在View中的任何位置使用Haml执行以下操作:-puts@my_variable.inspect 关于ruby-on-rails-如何在我的R

  8. ruby-on-rails - 在默认方法参数中使用 .reverse_merge 或 .merge - 2

    两者都可以defsetup(options={})options.reverse_merge:size=>25,:velocity=>10end和defsetup(options={}){:size=>25,:velocity=>10}.merge(options)end在方法的参数中分配默认值。问题是:哪个更好?您更愿意使用哪一个?在性能、代码可读性或其他方面有什么不同吗?编辑:我无意中添加了bang(!)...并不是要询问nobang方法与bang方法之间的区别 最佳答案 我倾向于使用reverse_merge方法:option

  9. ruby - 检查字符串是否包含散列中的任何键并返回它包含的键的值 - 2

    我有一个包含多个键的散列和一个字符串,该字符串不包含散列中的任何键或包含一个键。h={"k1"=>"v1","k2"=>"v2","k3"=>"v3"}s="thisisanexamplestringthatmightoccurwithakeysomewhereinthestringk1(withspecialcharacterslike(^&*$#@!^&&*))"检查s是否包含h中的任何键的最佳方法是什么,如果包含,则返回它包含的键的值?例如,对于上面的h和s的例子,输出应该是v1。编辑:只有字符串是用户定义的。哈希将始终相同。 最佳答案

  10. ruby-on-rails - Ruby 检查日期时间是否为 iso8601 并保存 - 2

    我需要检查DateTime是否采用有效的ISO8601格式。喜欢:#iso8601?我检查了ruby​​是否有特定方法,但没有找到。目前我正在使用date.iso8601==date来检查这个。有什么好的方法吗?编辑解释我的环境,并改变问题的范围。因此,我的项目将使用jsapiFullCalendar,这就是我需要iso8601字符串格式的原因。我想知道更好或正确的方法是什么,以正确的格式将日期保存在数据库中,或者让ActiveRecord完成它们的工作并在我需要时间信息时对其进行操作。 最佳答案 我不太明白你的问题。我假设您想检查

随机推荐