【问题标题】:'Your branch is ahead of 'origin/master' by 1 commit' on explicit push [duplicate]'你的分支比'origin/master'领先1个提交'在显式推送[重复]
【发布时间】:2012-01-29 04:36:27
【问题描述】:

我是 git 新手,无法理解以下行为:

我有一个在本地克隆的 bitbucket 存储库,然后我在本地修改和提交,然后我推送到远程存储库。如果我进行隐式推送或“推送来源”,则没有问题。如果我使用显式远程 url 推送,我会收到状态消息“您的分支比 'origin/master' 领先 1 个提交”。

似乎 git 无法将显式地址识别为与 origin 相同,那么到底发生了什么。如果我再做一次隐式推送,它什么也不做,但会清除上述消息。

这是一个示例会话:

baz@bhost:/more/coding/git-tests/ask1$ git --version
git version 1.7.2.5

baz@bhost:/more/coding/git-tests$ git clone https://shishani@bitbucket.org/shishani/dirasi.git ask1
Cloning into ask1...
Password: 
remote: Counting objects: 24054, done.
remote: Compressing objects: 100% (6300/6300), done.
remote: Total 24054 (delta 17124), reused 24024 (delta 17106)
Receiving objects: 100% (24054/24054), 11.83 MiB | 251 KiB/s, done.
Resolving deltas: 100% (17124/17124), done.

baz@bhost:/more/coding/git-tests$ cd ask1

baz@bhost:/more/coding/git-tests/ask1$ jed setup.py

baz@bhost:/more/coding/git-tests/ask1$ git commit -a
[master a053f28]    modified:   setup.py
 1 files changed, 1 insertions(+), 0 deletions(-)

baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

baz@bhost:/more/coding/git-tests/ask1$ git remote show origin
Password: 
* remote origin
  Fetch URL: https://shishani@bitbucket.org/shishani/dirasi.git
  Push  URL: https://shishani@bitbucket.org/shishani/dirasi.git
  HEAD branch: master
  Remote branch:
    master tracked
  Local branch configured for 'git pull':
    master merges with remote master
  Local ref configured for 'git push':
    master pushes to master (fast-forwardable)

baz@bhost:/more/coding/git-tests/ask1$ git push
Password: 
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 314 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: bb/acl: shishani is allowed. accepted payload.
To https://shishani@bitbucket.org/shishani/dirasi.git
   5e9ffd1..a053f28  master -> master

baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)

baz@bhost:/more/coding/git-tests/ask1$ jed setup.py

baz@bhost:/more/coding/git-tests/ask1$ git commit -a
[master 6d0e236]    modified:   setup.py
 1 files changed, 1 insertions(+), 0 deletions(-)

baz@bhost:/more/coding/git-tests/ask1$ git push https://shishani@bitbucket.org/shishani/dirasi.git master
Password: 
Counting objects: 5, done.
Delta compression using up to 2 threads.
Compressing objects: 100% (3/3), done.
Writing objects: 100% (3/3), 298 bytes, done.
Total 3 (delta 2), reused 0 (delta 0)
remote: bb/acl: shishani is allowed. accepted payload.
To https://shishani@bitbucket.org/shishani/dirasi.git
   a053f28..6d0e236  master -> master

baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
**# Your branch is ahead of 'origin/master' by 1 commit.** <-- this does not reflect current state
#
nothing to commit (working directory clean)

baz@bhost:/more/coding/git-tests/ask1$ git push
Password: 
Everything up-to-date

baz@bhost:/more/coding/git-tests/ask1$ git status
# On branch master
nothing to commit (working directory clean)

【问题讨论】:

标签: git


【解决方案1】:

当状态显示为Your branch is ahead of 'origin/master' by 1 commit 时,它实际上是指origin/master。也就是说,您的 repo 中有一个名为 origin/master 的指针指向该提交,即 remote branchHEAD,而您的 master 在此提交之前。

对于您的 repo 识别的所有遥控器,如果您 p​​ull/push/fetch,它会在 repo 中创建一个 &lt;remote&gt;/&lt;branchname&gt; 指针。它只是一个指向提交的指针,如果你尝试checkout 那个分支,你只会处于分离状态。

显然,当您执行 git pushgit push origin master 时,此指针会更新,但显式推送到 url 不会更新该指针,因此也不会更新状态。

如果你只是在推送到 url 后做git fetchgit pull,那么这种情况下状态消息也会消失。

注意:如果您有多个遥控器,并且您将分支设置为跟踪某个其他远程分支,例如 upstream master,则在这种情况下,您的状态消息将是 Your branch is ahead of 'upstream/master' by 1 commit。所以它只是完成比较的跟踪远程分支。请参阅 git config 以查看您当前分支正在跟踪的远程分支。

【讨论】:

    【解决方案2】:

    我相信您需要在git 意识到远程端已更新之前将更改拉回。您可以通过快速git pull 来执行此操作(或者,如您在示例中所示,将git push 发送到跟踪的原点)。

    您也可以手动更改refs/remotes/origin 指向的提交。

    期望内容跟踪器识别存储库的任意远程同义词是不公平的;想象一下,如果您有五个不同的 URL,它们都是同一个服务器端存储库。当您推送到 repo A 时,这是否意味着您的更改已提交到 repo B(您的分支的起源)? git没有办法知道。相反,它只在两种情况下更新远程头引用:拉取和推送到默认目标。

    【讨论】:

    • 我同意你所说的关于具有不同同义词的 repo 的说法,但如果我们使用 git 已经知道的完全相同的 url(并且由'remote show origin'报告),那它为什么不承认这个事实。毕竟,一个 url 指向一个唯一的资源。另一方面,如果用户使用不同的同义词,他们会意识到这一点,并且不会期望 git 识别它指向相同的资源。
    • @BaselShishani 这是一个滑坡。如果您按照您的建议进行操作,并比较了 URL 的确切字符串(非常简单!),那么推送 https://shishani@bitbucket.org/shishani/dirasi.git 会更新头部,而 http://shishani@bitbucket.org/shishani/dirasi.git 不会。同上查询字符串、不同的协议、额外的斜线、大写...欢迎您向 git 人员提交功能请求,他们很好!
    【解决方案3】:

    是的,在这种情况下,您必须执行 git fetchgit fetch origin。 Git 不关心你推送到哪里,只有远程(和远程跟踪分支)才是最重要的,当你报告你有多少提交的状态时等等。

    【讨论】:

      【解决方案4】:

      请注意,由于git1.8.1rc1(2012 年 12 月),Git will include hint messages

      if (advice_status_hints)
      +      strbuf_addf(sb,
      +        _("  (use \"git push\" to publish your local commits)\n"));
      

      当“git checkout”签出一个分支时,它会告诉用户新分支相对于它所建立的远程跟踪分支有多远。
      该消息现在还建议如何通过推或拉来同步它们。

      这可以通过 advice.statusHints 配置变量禁用。

      【讨论】:

        猜你喜欢
        • 2022-01-04
        • 2012-04-27
        • 2011-01-21
        • 1970-01-01
        • 2013-04-23
        • 2021-02-07
        • 2011-01-12
        相关资源
        最近更新 更多