zlZ*_*mon 2 git git-tag git-describe
我有三个分支:dev、staging和master。当我这样做时,git describe结果是v0.1无论哪个分支被签出。
接下来我将描述进行更改以dev添加版本标签并合并staging到此master新版本的工作流程。
git checkout devgit add --all&&git commit -m 'just some testing'git tag -a v0.19.0git push && git push --tagsgit checkout staginggit merge devgit pushgit checkout mastergit merge staginggit push现在我describe在每个分支上运行:
- git checkout dev && git describe && git describe --abbrev=0
结果:
v0.19.0-1-ge147b2d
v0.19.0
Run Code Online (Sandbox Code Playgroud)
我所期望的:
v0.19.0-1-ge147b2d
v0.19.0
Run Code Online (Sandbox Code Playgroud)
git checkout staging && git describe && git describe --abbrev=0结果:
v0.17.0-3-g684216f
v0.17.0
Run Code Online (Sandbox Code Playgroud)
我所期望的:
v0.19.0-xxxxx
v0.19.0
Run Code Online (Sandbox Code Playgroud)
git checkout master && git describe && git describe --abbrev=0结果:
v0.17.0-16-g99c19c9
v0.17.0
Run Code Online (Sandbox Code Playgroud)
我所期望的:
v0.19.0-xxxxx
v0.19.0
Run Code Online (Sandbox Code Playgroud)
这是为什么?我怎样才能有这样一个过程,在开发中进行一些更改,然后添加一个新标签,然后将这些更改与标签一起传播到所有其他分支?
您应该写下实际运行的所有命令,而不是尝试使用英语,因为它似乎不足以准确地解释情况。例如,您的措辞使用“合并到”和“合并到”,这可能会或可能不会为您描述相同的事情。对于合并,您通常会执行类似的操作git checkout some-local-branch && git fetch && git merge origin/some-other-branch。如果您自己不确定整个情况,那么所有细节可能都很重要。如果您通过 ssh 连接在远程计算机上运行一些命令,请务必指出这一点。
从问题(措辞为 2021-04-27T14:24:13+00:00)来看,您的 Process 2 似乎丢失了git push --tags(或者可能),并且如果您尝试在原始存储库之外的其他地方git fetch运行(即您的工作实践中的目录)您根本不会看到新标签。git describe
我建议从git show NEWTAG您尝试使用的所有工作区(或“分支”)开始。您应该在每个工作区上获得相同的 SHA-1。您还可以运行git show HEAD来验证当前的 HEAD 是否确实与您认为应该匹配的内容匹配。另外,如果您可以运行,gitk您可以尝试运行gitk NEWTAG HEAD以获得问题的视觉表示,甚至gitk --all -n 10000显示所有分支最多 10000 个最新提交。
如果你不能使用gitk,你也可以尝试运行eg git log --oneline --graph --decorate -n 50。作为替代方案,您还可以运行git log --oneline --graph --decorate -n 50 --format=%h%d列出 DAG 中最新的 50 个提交(不带标题),以便在需要更多帮助时可以在 SO 中共享结果。
看到截图后更新
您的分支master与任何标签不在同一位置,因此git describe不应发出任何给定的标签名称作为唯一的输出。相反,它应该说类似这样的内容v0.2-4-gf5d6ced,基本上意味着“v0.2 加 4 个补丁,其 HEAD 指向以f5d6ced”开头的 SHA-1。此示例的四个补丁是 a5312dc、7dceb15、b4cd4f6 和 f5d6ced,下面未包含v0.2这些补丁。
这是我创建的一个示例:
* f5d6ced (HEAD -> master) Merge branch 'staging'
|\
| * b4cd4f6 (staging) Merge branch 'dev' into staging
| |\
| | * 1fa7a37 (tag: v0.2, dev) Updated testfile yet again in branch dev
* | | 7dceb15 (tag: test) Merge branch 'staging'
|\ \ \
| |/ /
| * | a5312dc Merge branch 'dev' into staging
| |\ \
|/ / /
| | _
| * 96cd0ac (tag: v0.1) Updated testfile in branch dev
|/
* d626941 Added testfile in branch dev
Run Code Online (Sandbox Code Playgroud)
和是带注释的标签,而v0.1是非注释标签。v0.2test
$ git checkout dev && git describe
Switched to branch 'dev'
v0.2
$ git checkout staging && git describe
Switched to branch 'staging'
v0.2-2-gb4cd4f6
$ git checkout master && git describe
Switched to branch 'master'
v0.2-4-gf5d6ced
$ git checkout master && git describe --tags
Already on 'master'
test-3-gf5d6ced
Run Code Online (Sandbox Code Playgroud)
这是因为,当您创建合并时,您会创建一个新的提交,该提交显然将具有自己的 SHA-1 标识符,并且现有标签不指向合并,因为标签始终引用特定版本。
您确定您实际上没有运行例如,git describe --abbrev=0它仅从最新标签中选择一个标签,并且可能更喜欢任何给定合并的第一个父级?
如果您实际上想确定给定分支已经包含哪些标签,您可以运行如下命令:
$ git checkout master && git tag --merged
Switched to branch 'master'
test
v0.1
v0.2
Run Code Online (Sandbox Code Playgroud)
或按标签创建时间排序,最新的在前:
$ git checkout master && git tag --sort=-authordate --merged
Already on 'master'
test
v0.2
v0.1
Run Code Online (Sandbox Code Playgroud)
如果你只想要最新的标签,你可以运行
git tag --list --sort=-authordate --merged | head -n1
Run Code Online (Sandbox Code Playgroud)
请参阅git help tag了解更多详情。对于这种情况,最新意味着给定标签的创作时间戳。对于标签,作者时间戳和提交时间戳是相等的,但据我所知,这在任何地方都没有强制。如果差异对您很重要,则只有您决定需要哪个时间戳。
对您的特定“错误”情况的进一步解释:您实际上并未按照git describe您声明的方式运行,但git describe --abbrev=0列出了最接近的标签。请注意,这是在 DAG 拓扑中,它可能与最新或最新标签完全不同。对于您的示例情况, 和v0.17与of 分支的v0.19距离均为 1 ,与of 分支的距离为 2 。此外,较旧的标签来自第一个父级,这就是您得到响应的原因。如果您想要给定分支中包含的最新标签,我建议您改为使用。但是,我强烈建议标记主分支版本,而不是在开发或暂存分支中标记随机补丁。然后你就可以在没有任何标志的情况下使用HEADstagingHEADmasterv0.17git tag --list --sort=-authordate --merged | head -n1git describe