我从https://github.com/eclipse/mosquitto克隆了mosquitto repo。它包含标记v1.4.9
。然而,它看起来不像是在一个分支上。
怎么会发生这种情况?作者是否真的在自己的仓库中保留了一个分支,但只将标签从该分支推送到github?或者他只是提交标签?
我将标签变成了本地分支:
$ git checkout -b work149 v1.4.9
看了一下分支上的最后一次提交:
$ git log -1
commit 91bfd82491f90e24b6fe9c036f0b04a1f5c14a89
Merge: bf959ef 2d0af73
Author: Roger A. Light <roger@atchoo.org>
Date: Thu Jun 2 22:05:34 2016 +0100
Merge branch 'fixes'
此提交比fixes
分支多一个。
或者使用git log --graph
我可以看到同一分支上的早期提交(不是fixes
分支,而是我试图理解的分支):
* | commit bf959ef9b0ae0e4d74bf80158ffb0b7c69da533d
|\ \ Merge: 646e0a0 5cca6b4
| |/ Author: Roger A. Light <roger@atchoo.org>
| | Date: Sun Feb 14 14:38:42 2016 +0000
| |
| | Merge branch 'fixes'
| |
如何确定标签是在分支上还是在哪个分支上?最左边的垂直条是否表示分支,遥控器上的分支在哪里?
这是一种常见做法吗?
来自a discussion thread about "Git pull doesn't get the tags"提及branch heads that
are being tracked
和non-commits
。我想知道git clone
推荐是否让克隆不跟踪遥控器上的所有分支,或者repo以某种方式将标记变为非提交?
答案 0 :(得分:8)
我的猜测是作者可能有一个包含91bfd82491f的分支,标记了提交,推送了标记,然后删除了分支。你也是正确的,作者可能有一个本地分支指向同一个提交,但只推送了标签,而不是分支。
使用
检查哪个或哪些分支包含v1.4.9
git branch -a --contains v1.4.9
运行该命令没有输出,这确认它不在它自己的分支上。相反,请查找v1.4.8
:
$ git branch -a --contains v1.4.8
* master
remotes/origin/HEAD -> origin/master
remotes/origin/debian
remotes/origin/master
在任何分支之外直接创建标记提交的一种方法是使用detached HEAD进行操作,即HEAD
不引用命名分支。在mosquitto克隆中,您可以通过运行
git checkout v1.4.9
给你一个健谈警告。
Note: checking out 'v1.4.9'. You are in 'detached HEAD' state. You can look around, make experimental changes and commit them, and you can discard any commits you make in this state without impacting any branches by performing another checkout. If you want to create a new branch to retain commits you create, you may do so (now or later) by using -b with the checkout command again. Example: git checkout -b <new-branch-name> HEAD is now at 91bfd82... Merge branch 'fixes'
此时,git将创建更多提交。例如:
$ touch look-ma-no-branch ; git add look-ma-no-branch
$ git commit -m 'Look, Ma! No branch!'
[detached HEAD 51a0ac2] Look, Ma! No branch!
1 file changed, 0 insertions(+), 0 deletions(-)
create mode 100644 look-ma-no-branch
这个新的提交51a0ac2
在任何分支上都不存在,我们可以确认。
$ git branch -a --contains 51a0ac2
* (HEAD detached from v1.4.9)
为了好玩,让我们也标记它。
git tag -a -m 'Tag branchless commit' v1.4.9.1
使用master
切换回git checkout master
分支,我们可以使用git lola
(git log --graph --decorate --pretty=oneline --abbrev-commit --all
的别名)来查看新标记与其祖先类似。
$ git lola * 51a0ac2 (tag: v1.4.9.1) Look, Ma! No branch! * 91bfd82 (tag: v1.4.9) Merge branch 'fixes' |\ | | * 1cd4092 (origin/fixes) [184] Don't attempt to install docs when WITH_DOCS=no. | | * 63416e6 ; | | * 5d96c3d [186] Fix TLS operation with websockets listeners and libwebsockts 2.x. | |/ | * 2d0af73 Bump version number. | | * 8ee1ad8 (origin/coverity-fixes) Merge branch 'fixes' into coverity-fixes [...]
使用
确认它在无分支上存在git branch -a --contains v1.4.9.1
因为你问过,不,这根本不是一个常见的git工作流程。
答案 1 :(得分:4)
我做错了类似的事情:我即将推出一个新版本,我在PC上提交了所有内容并添加了标签。
然后我做了git push --tags
,错误地认为它会推动主分支和标记。然后我在github上创建了一个版本。该版本指向最后的更改,但主分支落后。我不得不再次推动,这一切都是一致的。
值得注意的是,所有文件实际上都是用第一个命令推送的(我从输出中看到它,你知道:创建增量等)。在第二次推送中,传输的字节报告为0,因此我猜测只推送了分支元数据。