git状态仍显示为“您的分支先于 N个提交。” git rebase 后> 假设我有一个从本地my-topic-branch分支分支出来的master分支,并且master分支与远程master分支绑定。 my-topic-branch分支最初是由名为tag1的标签创建的。 tag1是一个放置在远程主分支上的标签,由于git fetch,我看到了该标签。 有些时间过去,允许其他人将其更改推送到该远程主分支。再后来,其他人放下了新的tag2。 然后我再次使用git fetch以确保将所有这些远程标记都放入本地存储库中以进行进一步的操作。 我像这样将tag2设置为基准: $ git rebase tag2 First, rewinding head to replay your work on top of it... Applying: CENSORED_LOG_MESSAGE1 Applying: CENSORED_LOG_MESSAGE2 Auto packing the repository in background for optimum performance. See "git help gc" for manual housekeeping. 但是后来我运行git status并看到了这个: $ git status On branch my-topic-branch Your branch is ahead of 'tag1' by 195 commits. (use "git push" to publish your local commits) 我的期望是以上消息应该说明有关tag2的信息,当然不是我在195次提交之前领先于旧标记。 为什么git status会报告my-topic-branch分支的提交,而不是我最近基于的新提交? [如果这是预期的行为,那么很好,我将不得不忽略它,但是奇怪的是,我仍然落后195次提交master,但那肯定不是真的(如果git rebase实际上做了我认为应该做的事情。 更新1 如果HEAD仍在该分支上,我仍然可以通过以下方式找到my-topic-branch的基点: $ git show -s $(git merge-base master @) commit CENSORED_SHA1 (tag: tag2) Author: CENSORED_AUTHOR Date: CENSORED_DATE CENSORED_LOG_MESSAGE3 $ 但是这仍然是关于git status输出的问题。 更新2: 根据Pesho_T's comment更新: 我运行了git branch -vv,并得到了以下内容。这是经过审查的,但是要加上“ 2”和“ 4”之类的数字以区别于其他数字: $ git branch -vv | grep my-topic-branch * my-topic-branch CENSORED_SHA1_2 [tag1: ahead 195] MDFCOR-420 CENSORED_LOG_MESSAGE4 假设我有一个我的主题分支分支,该分支从我的本地master分支分支出来,并且该master分支与远程master分支绑定在一起。 my-topic-branch分支最初是在... 似乎很可能1 您意外创建了一个分支名称 和一个标签名称,它们在缩短时都打印相同。一旦有了两个这样的名称,它们就可以容纳不同的哈希ID。当parsing这样的名称时,您获得的哈希ID有点棘手(有规则,这些规则在the gitrevisions documentation中列出,但是规则也有例外)。最好通过重命名不合适的分支名称来摆脱这种情况。 请记住,像master这样的分支名称实际上是名称refs/heads/master;像v2.25.0这样的tag name 实际上是refs/tags/v2.25.0。因此,即使标签存在,也可以创建名为v2.25.0的branch,因为分支的full名称是refs/heads/v2.25.0,而不是refs/tags/v2.25.0。这两个名称是不同的,但是如果您查看每个的简短版本,则两者均为v2.25.0。 ahead的behind或git status计数消息是运行的结果: git rev-list --count --left-right <name1>...<name2> 请注意,两个名称之间有三个 点。2 两个名称是: name1是您的当前分支; name2是当前分支的上游 。 git rev-list命令,以这种形式(使用三个点),查找左侧名称为从…到达 ,而不是右侧名称的提交,以及<counts (--count),但分开(--left-right)而不是组合。这意味着这些计数取决于您当前的分支(当然,这就是为什么它说“您的分支...位于前面”)的原因。 和 上游设置。您可以通过git branch --set-upstream-to控制上游设置,并可以通过以下方式读取当前分支的上游:$ git rev-parse --abbrev-ref @{u} origin/master $ git rev-parse --symbolic-full-name @{u} refs/remotes/origin/master 为了帮助您在缩写时不小心使 branch name和tag name 看起来都相同的情况,请使用--symbolic-full-name变体。 分支的 上游 始终是另一个分支名称或远程跟踪名称,因为标记名称被禁止:git branch --set-upstream-to=v2.25.0 fatal: Cannot setup tracking information; starting point 'v2.25.0' is not a branch. origin/master之类的远程跟踪名称更为典型,但您 可以 将任何分支的上游设置为任何其他分支名称。如果ahead计数非零,通常就是您所看到的,也就是您在这里看到的。但是,如果两个计数都不为零,则git status将使用单词diverged。如果ahead计数为零,并且behind计数为非零,则git status打印behind计数。如果两个计数都为零,则分支与其上游同步,git status表示Your branch is up to date with ...。 有关三点语法的更多信息,请参见the gitrevisions documentation。要了解 可达性 ,请参阅Think Like (a) Git。对于简短的图形说明,请考虑以下图形: I--J <-- branch1 / ...--G--H <-- master \ K--L <-- branch2, origin/branch1 名称branch1是master的“前2”,因为从提交J开始,我们先返回到I,然后返回H,这意味着I-J的提交可以从branch1到达,但不能从master开始。同样,branch2比master早2,但它的两个是提交K-L。这意味着master是branch1或branch2的2 behind ,而这两个提交分别是I-J或K-L。同时,branch1与origin/branch1之间有分歧,因为它们都比前面[2](I-J)并且比后面[K-L)2。 1 如果您使用move标签,您可能会遇到类似的棘手情况,因为标签在所有Git存储库中都是通用的,但标签也永远都不是move。一旦一个Git存储库具有标签,即使某人已在该Git存储库旨在移动的其他某个Git存储库中强行移动了标签,它也会倾向于假定it具有的副本为正确。比赛。但这会显示不同的症状,因为您不能将分支的上游设置为标签名称。 2 用点集理论的术语,三点语法产生一个symmetric difference。因为这是对称的,所以只要您记得现在也交换了git rev-list --count --left-right将要打印的两个counts,就可以交换两个名称。

问题描述 投票:1回答:1

假设我有一个从本地my-topic-branch分支分支出来的master分支,并且master分支与远程master分支绑定。

my-topic-branch分支最初是由名为tag1的标签创建的。 tag1是一个放置在远程主分支上的标签,由于git fetch,我看到了该标签。

有些时间过去,允许其他人将其更改推送到该远程主分支。再后来,其他人放下了新的tag2

然后我再次使用git fetch以确保将所有这些远程标记都放入本地存储库中以进行进一步的操作。

我像这样将tag2设置为基准:

$ git rebase tag2
First, rewinding head to replay your work on top of it...
Applying: CENSORED_LOG_MESSAGE1
Applying: CENSORED_LOG_MESSAGE2
Auto packing the repository in background for optimum performance.
See "git help gc" for manual housekeeping.

但是后来我运行git status并看到了这个:

$ git status
On branch my-topic-branch
Your branch is ahead of 'tag1' by 195 commits.
  (use "git push" to publish your local commits)

我的期望是以上消息应该说明有关tag2的信息,当然不是我在195次提交之前领先于旧标记。

为什么git status会报告my-topic-branch分支的提交,而不是我最近基于的新提交?

[如果这是预期的行为,那么很好,我将不得不忽略它,但是奇怪的是,我仍然落后195次提交master,但那肯定不是真的(如果git rebase实际上做了我认为应该做的事情。

更新1

如果HEAD仍在该分支上,我仍然可以通过以下方式找到my-topic-branch的基点:

$ git show -s $(git merge-base master @)
commit CENSORED_SHA1 (tag: tag2)
Author: CENSORED_AUTHOR
Date:   CENSORED_DATE

    CENSORED_LOG_MESSAGE3
$

但是这仍然是关于git status输出的问题。

更新2:

根据Pesho_T's comment更新:

我运行了git branch -vv,并得到了以下内容。这是经过审查的,但是要加上“ 2”和“ 4”之类的数字以区别于其他数字:

$ git branch -vv | grep my-topic-branch
* my-topic-branch                                CENSORED_SHA1_2 [tag1: ahead 195] MDFCOR-420 CENSORED_LOG_MESSAGE4

假设我有一个我的主题分支分支,该分支从我的本地master分支分支出来,并且该master分支与远程master分支绑定在一起。 my-topic-branch分支最初是在...

git git-branch git-rebase git-tag git-status
1个回答
1
投票

似乎很可能1

您意外创建了一个分支名称
© www.soinside.com 2019 - 2024. All rights reserved.