【问题标题】:How to check if the branch I'm in is based on a commit of remote tracking branch?如何检查我所在的分支是否基于远程跟踪分支的提交?
【发布时间】:2018-11-27 08:20:36
【问题描述】:

我在想我能不能拉。

如果我的分支基于一个远程分支,那么他有远程跟踪分支,所以我可以拉。

如果我的分支基于 commit,它没有远程跟踪分支,因此 pull 会失败。

我设法找到的是,当使用命令git branch -vv

  1. 如果有远程跟踪,它将显示在方括号中。示例:* origin/before-yo b0b97cf [remotes/origin/before-yo] Move to subfolder
  2. 如果分支基于提交,则不会有任何远程引用指示。示例:* 2fbe2ab473fe8f7aea2a36642aea1dc7d36add51 2fbe2ab Advance counter

有没有更好的方法来了解是否有远程跟踪分支连接到我当前的工作分支?

另外,git branch -vv 在某些情况下可能不起作用吗?

谢谢。

【问题讨论】:

  • 您真的是在询问您的分支是否有远程跟踪分支吗? git rev-parse --abbrev-ref --symbolic-full-name @{u} 应该这样做,如果有远程跟踪分支,它将显示远程跟踪分支,如果没有则给出错误消息,“致命:没有为分支 'XYZ' 配置上游”。
  • @LasseVågsætherKarlsen - 谢谢。想要将其添加为答案?
  • 你使用的是什么版本的 Git?现代人说* (HEAD detached at <hash>) 用于分离的HEAD 案例,您的似乎显示为* 2fbe2ab...,您的案例2 以上。
  • @torek - git 版本2.7.4
  • 啊,好吧,2.7.4 也打印了* (HEAD detached at ...),所以获得* 2fbe2ab473fe8f7aea2a36642aea1dc7d36add51 的唯一方法是创建一个实际命名 2fbe2ab473fe8f7aea2a36642aea1dc7d36add51 的分支,例如, git checkout -b 2fbe2ab473fe8f7aea2a36642aea1dc7d36add51。虽然 Git 允许这样做,但这不是一个好主意,因为现在这个名称是指哈希 ID 还是分支名称变得模棱两可。

标签: git git-branch git-pull git-track


【解决方案1】:

这是一个显示你真正想要的脚本:在git fetch之后,它显示了本地和远程分支之间的区别,因此你会知道你必须做什么(pullpushrebase,等等。)。把它的目录放到你PATH的某个地方,你就可以把它当作git fetch-log使用。

#!/bin/sh
# git-fetch-log: Ultimate git fetch-log
#
# It shows the diferences of `local...remote` if both side exists and there
# are differences. Useful to find out what you have to do: `merge`, `rebase`,
# `push`, etc. The arguments passed to log.
#
# Place it somewhere on Your `$PATH` and execute by the `git fetch-log`
# command.
#
#                               EXAMPLE OUTPUT
# ============================================================================
#
# ==== branch [behind 1]
#
# > commit 652b883 (origin/branch)
# | Author: BimbaLaszlo <bimbalaszlo@gmail.com>
# | Date:   2016-03-10 09:11:11 +0100
# |
# |     Commit on remote
# |
# o commit 2304667 (branch)
#   Author: BimbaLaszlo <bimbalaszlo@gmail.com>
#   Date:   2015-08-28 13:21:13 +0200
#
#       Commit on local
#
# ==== master [ahead 1]
#
# < commit 280ccf8 (master)
# | Author: BimbaLaszlo <bimbalaszlo@gmail.com>
# | Date:   2016-03-25 21:42:55 +0100
# |
# |     Commit on local
# |
# o commit 2369465 (origin/master, origin/HEAD)
#   Author: BimbaLaszlo <bimbalaszlo@gmail.com>
#   Date:   2016-03-10 09:02:52 +0100
#
#       Commit on remote
#
# ==== test [ahead 1, behind 1]
#
# < commit 83a3161 (test)
# | Author: BimbaLaszlo <bimbalaszlo@gmail.com>
# | Date:   2016-03-25 22:50:00 +0100
# |
# |     Diverged from remote
# |
# | > commit 4aafec7 (origin/test)
# |/  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
# |   Date:   2016-03-14 10:34:28 +0100
# |
# |       Pushed remote
# |
# o commit 0fccef3
#   Author: BimbaLaszlo <bimbalaszlo@gmail.com>
#   Date:   2015-09-03 10:33:39 +0200
#
#       Last common commit

  fmt='ref=%(refname:short); up=%(upstream:short); t=%(upstream:track); ts=%(upstream:trackshort);'
  git for-each-ref --shell --format="$fmt" refs/heads | \
  while read entry; do
    eval "$entry"
    if test "z$ts" != 'z' && test "z$ts" != 'z='; then
      echo -e "\n==== $ref $t\n"
      git --no-pager log --graph --left-right --decorate --abbrev-commit --date-order --boundary $@ $ref...$up
    fi
  done

https://gitlab.com/bimlas/home/blob/3fb207cdfe57593a78abe30150a3bc40b242e26a/linux/home/.gitconfig_files/custom_commands/git-fetch-log

【讨论】:

    猜你喜欢
    • 2015-02-25
    • 2013-03-11
    • 2016-12-17
    • 1970-01-01
    • 2013-04-30
    • 1970-01-01
    • 2010-10-16
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多