обновление
Как указывает amalloy, последние версии git поддерживают поиск подходящей ветви отслеживания для данной ветви, задавая "branchname @ {upstream}" (или "branchname @ {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.