мерзавец: программно знайте тем, насколько ответвление является вперед/позади удаленным ответвлением

Я хотел бы извлечь информацию, которая печатается после a git status, который похож:

# On branch master
# Your branch is ahead of 'origin/master' by 2 commits.

Конечно, я могу проанализировать вывод git status но это не рекомендуется, так как этот человекочитаемый вывод склонен измениться.

Существует две проблемы:

  1. Как знать удаленное отслеженное ответвление? Это часто origin/branch но не должен быть.
  2. Как получить числа? Как знать, является ли это вперед/позади? Сколько фиксаций? И что относительно разнообразного случая ответвления?
45
задан jamessan 4 June 2010 в 03:50
поделиться

3 ответа

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.

18
ответ дан 26 November 2019 в 21:20
поделиться

Вы можете попробовать 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.

11
ответ дан 26 November 2019 в 21:20
поделиться

git rev-list origin..HEAD покажет коммиты, которые находятся в вашей текущей ветке, но не в исходной - то есть, опережаете ли вы исходную ветку и на сколько коммитов.

git rev-list HEAD...origin покажет обратное.

Если обе команды показывают коммиты, то у вас расходящиеся ветви.

22
ответ дан 26 November 2019 в 21:20
поделиться
Другие вопросы по тегам:

Похожие вопросы: