草庐IT

git - 如何使用某些提交创建标签并将其推送到源?

coder 2023-06-24 原文

假设我的 gerrit 中的当前日志如下所示:

  • commit10(主)
  • commit9
  • commit8
  • commit7
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1

  • 我的目标是创建一个应包含 commit8 和 commit9 的新标签 (v1.73.0) 并将其推送到原点。我被告知要基于最新的稳定标签创建一个新的本地分支,并挑选必要的提交并对其进行标记。但是,我在将标签推送到 master 时遇到了一些问题。

    这是我所做的:
  • 根据最新标签创建本地分支: git checkout -b branchforv1.73.0 v1.72.0
  • 挑选 commit8 和 commit9
  • 创建新标签:git tag v1.73.0

  • ...那么现在,我如何将 v1.73.0 推送到 master?

    结果:
  • commit10(主)
  • commit7
  • commit9 v1.73.0
  • commit8
  • commit6 v1.72.0
  • commit5
  • commit4 v1.71.0
  • commit3
  • commit2
  • commit1
  • 最佳答案

    标签的工作原理

    在 git 中,每个标签都被称为“指向”一个(一个,单个)提交。事实上,分支也是如此:分支名称也只是指向一个提交。

    使这项工作起作用的是两件事:

  • 每个提交也指向另一个提交(或者可能是几个),和
  • 对于分支(并且仅针对分支),分支指向的提交会自动“向前移动”。也就是说,当你添加新的提交时——在某些方面,这就是 git 所做的大部分事情:向它的集合添加新的提交,有点像旧星际迷航 TNG 系列中的 Borg——无论你在哪个分支上,那都是那个分支重新调整以指向新的提交。

  • 因此,分支和标签之间的主要区别在于标签不会移动。

    要了解这是如何工作的,请考虑一个只有三个提交的简单 git 存储库。让我们标记这些提交 A , B , 和 C .第一次提交( A )什么也没有指向,因为它是第一次提交,而分支 master指向 A :
    A   <-- master
    

    当您进行第二次提交时,git 创建 B指向 A , 并将分支名称前进以指向 B :
    A <- B   <-- master
    

    然后当你进行第三次提交时,git 再次让它指向它的父提交,并推进分支:
    A <- B <- C   <-- master
    

    如果你现在创建一个标签,默认情况下,该标签将指向提交 C :
    A <- B <- C   <-- master
              ^
              |
       tag: sometag
    

    如果您然后进行新的提交 D , git 推进分支,但不推进标签:
    A <- B <- C <- D   <-- master
              ^
              |
       tag: sometag
    

    您可以随时创建或删除指向任何特定提交的任何标签:
    $ git tag -d sometag
    

    将删除标签 sometag , 之后:
    $ git tag sometag master~2
    

    将添加 sometag指向提交 B .1

    (我们刚刚证明了标签可以移动。真正的区别是标签不会移动,而分支会移动;并且 git 不会自动移动标签。2 分支通常会朝着“向前”方向移动,即,如果 master 曾经指向提交 C 而现在指向提交 D ,提交 C 通常应该通过从 D 开始并向后工作来找到。任何时候你移动一个分支,以便违反了这条规则,你正在“改写历史”;请参阅其他文章,了解什么时候可以,什么时候会给人们带来麻烦。)

    推送标签

    当您使用 git push ,您真正在做的是指示其他一些 git 存储库接受您没有的任何新提交,然后设置一些名称(通常是分支和/或标签)以指向一些提交(每个提交一个) ) 在结果集合中。3 这些名称(分支、标签等)通常称为“引用”,但现在我们只使用“分支”和“标签”。
    git push 之后的参数将存储库命名(通常通过“远程”名称,如 origin )以推送到。如果你忽略它,git 会尝试找出一个,但如果你想添加一个分支或标签名称,你需要明确地包含它,因为这里的第一个词被假定为远程名称。 (也就是说,git push master 尝试使用 master 作为远程名称而不是分支名称。)

    要推送所有标签,您只需添加 --tags给您的 git push命令:
    git push --tags origin
    

    要推送特定标签,您可以将其命名为:
    git push origin sometag
    

    就像您可以推送特定分支一样:
    git push origin master
    

    (实际上,第四个参数是一对名称,例如 master:mastersometag:sometag ,但在大多数情况下,它默认在两侧使用相同的名称。4)

    您可以省略名称 origin如果您不需要它来进行所有参数,例如,git push --tagsgit push --tags origin 相同(假设您的所有推送都转到 origin ,无论如何)。

    把它放在一起

    要在远程设置标签,首先在本地设置,使用 git tag name commit-identifier .使用您喜欢的任何查看器以确保其设置正确。然后用 git push origin name push 它或 git push --tags .

    1master~2语法指示 git 从通过 master 找到的提交开始,然后后退两步。您可以改为为提交 B 编写原始 SHA-1这里。

    2 旧版本的 git(1.8.4 之前)在推送时不小心将分支规则应用于标签(在远程端,即,如果标签是“快进”,它们会让标签移动)。

    3在某些情况下,您可以将名称指向“带注释的标签”,并且没有什么可以阻止名称指向“树”或“blob”对象,但这不是正常设置。

    4实际上,分支的默认 dst refspec 很复杂:这取决于您的 push.default配置,以及是否有remote.repository.push设置,是否有上游配置,等等。对于标签,规则更简单,因为没有“上游”这样的东西。

    关于git - 如何使用某些提交创建标签并将其推送到源?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25755061/

    有关git - 如何使用某些提交创建标签并将其推送到源?的更多相关文章

    1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

      我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

    2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

      总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

    3. ruby - 使用 RubyZip 生成 ZIP 文件时设置压缩级别 - 2

      我有一个Ruby程序,它使用rubyzip压缩XML文件的目录树。gem。我的问题是文件开始变得很重,我想提高压缩级别,因为压缩时间不是问题。我在rubyzipdocumentation中找不到一种为创建的ZIP文件指定压缩级别的方法。有人知道如何更改此设置吗?是否有另一个允许指定压缩级别的Ruby库? 最佳答案 这是我通过查看ruby​​zip内部创建的代码。level=Zlib::BEST_COMPRESSIONZip::ZipOutputStream.open(zip_file)do|zip|Dir.glob("**/*")d

    4. 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

    5. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

      很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

    6. ruby - 在 Ruby 中使用匿名模块 - 2

      假设我做了一个模块如下:m=Module.newdoclassCendend三个问题:除了对m的引用之外,还有什么方法可以访问C和m中的其他内容?我可以在创建匿名模块后为其命名吗(就像我输入“module...”一样)?如何在使用完匿名模块后将其删除,使其定义的常量不再存在? 最佳答案 三个答案:是的,使用ObjectSpace.此代码使c引用你的类(class)C不引用m:c=nilObjectSpace.each_object{|obj|c=objif(Class===objandobj.name=~/::C$/)}当然这取决于

    7. ruby - 如何在 Ruby 中顺序创建 PI - 2

      出于纯粹的兴趣,我很好奇如何按顺序创建PI,而不是在过程结果之后生成数字,而是让数字在过程本身生成时显示。如果是这种情况,那么数字可以自行产生,我可以对以前看到的数字实现垃圾收集,从而创建一个无限系列。结果只是在Pi系列之后每秒生成一个数字。这是我通过互联网筛选的结果:这是流行的计算机友好算法,类机器算法:defarccot(x,unity)xpow=unity/xn=1sign=1sum=0loopdoterm=xpow/nbreakifterm==0sum+=sign*(xpow/n)xpow/=x*xn+=2sign=-signendsumenddefcalc_pi(digits

    8. ruby - 使用 ruby​​ 和 savon 的 SOAP 服务 - 2

      我正在尝试使用ruby​​和Savon来使用网络服务。测试服务为http://www.webservicex.net/WS/WSDetails.aspx?WSID=9&CATID=2require'rubygems'require'savon'client=Savon::Client.new"http://www.webservicex.net/stockquote.asmx?WSDL"client.get_quotedo|soap|soap.body={:symbol=>"AAPL"}end返回SOAP异常。检查soap信封,在我看来soap请求没有正确的命名空间。任何人都可以建议我

    9. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

      关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

    10. 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

    随机推荐