git 仅推送标签并提交差异

git push tag only and commit difference

我有一个小问题。最近开始使用 gitKraken 来测试它是如何工作的(考虑从 sourcetree 移动)。据我了解,它更像是 "raw" git 命令。 SourceTree 为我做一些事情,比如自动标签推送(好的,发现它允许不推荐的 --tags 选项)

我的问题是标签。我在console上测试了一下,好像和push tags有关

git push origin - 推送更改
git push origin 1.0.0 - 推送标签
在这里,一切正常。我的同事看到了变化并且可以拉动它。

git push origin 1.0.0 - 我只推送标签,没有提交(这怎么可能?)
它像普通提交一样在存储库(在 BitBucket 站点上)上可见 - 带有注释和 ID。但是无法通过 git pull 从 bitbutcket 下载提交,因为它声明它是最新的

我有一种感觉它看起来像
git push origin = git push origin
git push origin 1.0.0 = git push some-special-place

它究竟是如何工作的?我可以在 BitBucket 网站上看到所有更改。

此外,我可以在不提交更改的情况下下载提交的标签,并且我得到的结果是最新的正常提交。如果我使用 API/Site 下载回购副本,这可能会导致问题,因为它与实际更改不一致

EDIT 如果我的本地提交是 A-B-C-D(tag) 而远程是 A-B-C 那么 BitBucket 界面会显示我(仅在提交标签之后) A-B-C-D 并没有说明 HEADC 而不是 D。这就是我认为我下载了最新提交的内容,但实际上我下载的是 HEAD
另外,要注意: Removing tag from remote removie
uncommited commits - 就好像它们一开始就不存在一样地点.

GitKraken 和源代码树都不会通知未提交的更改。

编辑:仅提交标签会在 Web 界面中显示实际更改(补丁摘要)。 Commit 看起来和真的一样。

我认为您在这里混淆了提交、分支和标记的概念。

A tag 只是指向提交的指针。如果没有推送它指向的提交,你永远不能引用一个标签(push 它,检查它或其他任何东西)。 git push origin <tag> 将推送提交以及指向它的标签。

但是,它不会改变任何分支。 pull 现在是 git fetchgit merge 的组合。如果您从其他地方拉取,将获取推送的提交。但是 merge 将跟踪的远程分支合并到您的本地分支中。然而,远程分支并没有改变(因为你只推送了提交和标签,但没有改变分支HEAD)。因此,up-to-date 消息会在您拉动时显示。

但是,您可以在另一台机器上检出提交,因为它已经被提取。但是,您不能通过标签执行此操作,除非您执行 git pull --tags.

基线:

  • git push origin <tag> 确实推送提交和标签,但不更改跟踪分支的 HEAD.
  • git push origin <branch> 推送新提交并更新远程分支的 HEAD,但不推送标签
  • git push origin(没有标签或分支)默认会推送当前分支。参见 git push documentation(由@Melebius 提供)

Moreover I can download commited tag without commiting chnages and result I get is latest normally commited. Which can lead to problems in case I use API/Site to download repo copy, as it is not aligned with real changes

你的这部分问题我不太明白,也许你可以详细说明一下。 normally commited 是什么意思?

你对命令的理解有误

git push origin

它没有推送更改,没有 git 那样做。 它 "compare all the branches whose are tracking from remote branches from origin, and do a push for each branch are ahead"

它由如何选择要推送的分支的设置控制。

默认情况下,跳过标签。