Я хотел бы извлечь информацию, которая печатается после a git status
, который похож:
# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.
Конечно, я могу проанализировать вывод git status
но это не рекомендуется, так как этот человекочитаемый вывод склонен измениться.
Существует две проблемы:
origin/branch
но не должен быть.update
Как указывает amalloy, последние версии git поддерживают поиск соответствующей ветки отслеживания для данной ветки, задав «имя ветки @ {upstream}» (или «имя ветки @ {u}», или «@ { u} "для ветви отслеживания HEAD). Это фактически заменяет сценарий ниже. Вы можете:
git rev-list @{u}..
git rev-list --left-right --boundary @{u}...
gitk @{u}...
и т. Д. Например, у меня есть git q
с псевдонимом git log --pretty = '...' @ {u} ..
, чтобы показать мне коммиты в очереди, готовые к отправке.
исходный ответ
Кажется, нет простого способа найти ветку отслеживания в целом, без разбора гораздо большего количества git config, чем это практично в нескольких командах оболочки. Но во многих случаях это будет иметь большое значение:
# work out the current branch name
currentbranch=$(expr $(git symbolic-ref HEAD) : 'refs/heads/\(.*\)')
[ -n "$currentbranch" ] || die "You don't seem to be on a branch"
# look up this branch in the configuration
remote=$(git config branch.$currentbranch.remote)
remote_ref=$(git config branch.$currentbranch.merge)
# convert the remote ref into the tracking ref... this is a hack
remote_branch=$(expr $remote_ref : 'refs/heads/\(.*\)')
tracking_branch=refs/remotes/$remote/$remote_branch
# now $tracking_branch should be the local ref tracking HEAD
git rev-list $tracking_branch..HEAD
Другой, более грубый подход:
git rev-list HEAD --not --remotes
ответ jamessan объясняет, как найти относительные различия между $ tracking_branch и HEAD с помощью git rev-list
]. Вы можете сделать одну забавную вещь:
git rev-list --left-right $tracking_branch...HEAD
(обратите внимание на три точки между $ tracking_branch и HEAD). Это покажет коммиты на обеих «руках» с отличительной меткой спереди: «<» для коммитов на $ tracking_branch и «>» для коммитов на HEAD.
Вы можете попробовать git branch -v -v
. Если флаг -v
указан дважды, он выводит имена ветвей восходящего потока. Пример вывода:
* devel 7a5ff2c [origin/devel: ahead 1] smaller file status overlay icons
master 37ca389 [origin/master] initial project check-in.
Я думаю, что этот формат более стабилен, чем вывод git status
.
git rev-list origin..HEAD
покажет коммиты, которые находятся в вашей текущей ветке, но не в исходной - то есть, опережаете ли вы исходную ветку и на сколько коммитов.
git rev-list HEAD...origin
покажет обратное.
Если обе команды показывают коммиты, то у вас расходящиеся ветви.