Git вперед / назад информация между мастером и филиалом?

201

Я создал ветку для тестирования в моем локальном репо (test-branch ), в которую я нажал Github.

Если я захожу в свой Githubаккаунт и выбираю это, test-branchон показывает информацию:

This branch is 1 commit ahead and 2 commits behind master

Мои вопросы:

  1. Как я могу отобразить эту информацию локально (то есть: команда, которая показывает это на терминале, а не открывать Github чтобы увидеть ее)?
  2. Я знаю, что могу видеть различия между ветками, используя:

    git diff master..test-branch
    

    или используя Meld(что я предпочитаю):

    git difftool master..test-branch
    

    но мне было интересно, есть ли способ увидеть коммиты впереди и сзади отдельно. IE: есть ли способ показать, что 1 совершает коммит вперед сам по себе, а затем эти 2 фиксируют сами?

Габриель
источник
1
Git 2.5+ (2 квартал 2015 года) представит git for-each-ref --format="%(push:track)" refs/heads. Смотрите мой ответ ниже
VonC
1
Поскольку я не смог найти этот вопрос по ключевым словам, которые я собираюсь написать, я просто хочу отметить, что это сводится к принятию относительного дополнения (или «разницы в множествах») между наборами коммитов, которые составляют эти ветви (и затем считать элементы). Надеюсь, это превращает его в индексы поисковых систем.
вечера

Ответы:

309

Вот трюк, который я нашел, чтобы сравнить две ветви и показать, сколько коммитов каждая ветвь опережает другую (более общий ответ на ваш вопрос 1):

Для местных филиалов: git rev-list --left-right --count master...test-branch

Для удаленных филиалов: git rev-list --left-right --count origin/master...origin/test-branch

Это дает вывод, как показано ниже:

1 7

Это средство вывода: « По сравнению с master, test-branch7 фиксаций вперед и 1 совершить позади.»

Вы также можете сравнить локальные ветви с удаленными ветвями, например, origin/master...masterчтобы узнать, сколько коммитов локальная masterветвь находится впереди / позади своей удаленной коллеги.

user1834095
источник
1
Это отличное решение для меня, чтобы узнать, могу ли я удалить ветку или она еще впереди.
Maverick1st
1
@ Maverick1st, да, эта команда особенно полезна, когда вы следите за рабочим процессом gitflow (которым я являюсь)
user1834095
2
Это лучший для моего случая использования поиск, если ваша текущая ветвь функций находится за удаленным master ( git rev-list --left-right --count origin/master...@) - если пользователь делает это git fetchраньше; Полезно для предотвращения запросов на извлечение из устаревших веток.
jakub.g
9
Чтобы проверить, сколько git rev-list --left-right --count origin/master...@ | cut -f1
коммитов
8
@ jakub.g вам не нужно резать, если вы используете --left-onlyили--right-only
jasonkarns
39

Прежде всего, чтобы увидеть, сколько ревизий у вас локально, вы должны сделать, git fetchчтобы убедиться, что у вас есть последняя информация с вашего пульта.

Вывод по умолчанию git statusговорит вам, сколько ревизий у вас впереди или позади, но обычно я нахожу это слишком многословным:

$ git status
# On branch master
# Your branch and 'origin/master' have diverged,
# and have 2 and 1 different commit each, respectively.
#
nothing to commit (working directory clean)

Я предпочитаю git status -sb:

$ git status -sb
## master...origin/master [ahead 2, behind 1]

На самом деле я называю это просто git s, и это основная команда, которую я использую для проверки статуса.

Чтобы увидеть разницу в «будущих ревизиях» master, я могу исключить «последующие ревизии» из origin/master:

git diff master..origin/master^

Чтобы увидеть разницу в «ревизиях» origin/master, я могу исключить «ревизии впереди» из master:

git diff origin/master..master^^

Если впереди или позади 5 ревизий, было бы проще написать так:

git diff master..origin/master~5
git diff origin/master..master~5

ОБНОВИТЬ

Чтобы увидеть ревизии впереди / позади, ветвь должна быть настроена для отслеживания другой ветки. Для меня это поведение по умолчанию, когда я клонирую удаленный репозиторий и после того, как я нажимаю ветку с помощью git push -u remotename branchname. Моя версия 1.8.4.3, но она работает так долго, насколько я помню.

Начиная с версии 1.8, вы можете установить ветку трекинга следующим образом:

git branch --track test-branch

Начиная с версии 1.7 синтаксис был другим:

git branch --set-upstream test-branch
Янош
источник
Какую версию gitвы используете? Я не могу воспроизвести то, что вы получаете git statusни с, ни с git status -sb. Если я попробую любую из команд (после выполнения git fetch), я не получу никакой информации о коммитах впереди / позади.
Габриэль
8
Ваш способ увидеть коммиты впереди и сзади наносится masterи origin/masterя хочу , чтобы увидеть эти различия для masterи а другой ветви test-branch. Не могли бы вы переформатировать свой ответ на этот вопрос?
Габриэль
Различия в ревизиях "сзади" и "впереди" работают только для меня, если я использую 3 точки между именами ветвей (не 2). И, кажется, ^ и ^^ здесь не имеют значения, например: git diff master ... origin / master git diff origin / master ... master В любом случае, "git status -sb" был очень полезен.
Vituel
10

С Git 2.5+ теперь у вас есть еще одна возможность видеть впереди и сзади всех веток, которые настроены для перехода на ветку.

git for-each-ref --format="%(push:track)" refs/heads

Смотрите больше на " Просмотр Unpressed Git Commits "

VonC
источник
Не могли бы вы сделать это только для текущей ветви и ее удаленной ветви отслеживания?
spex
@spex yes: в комплекте refs/headsс названием текущей ветви ( stackoverflow.com/a/12142066/6309 ):refs/heads/$(git rev-parse --abbrev-ref HEAD)
VonC
3

Вы также можете использовать его, awkчтобы сделать его немного красивее:

git rev-list --left-right --count  origin/develop...feature-branch | awk '{print "Behind "$1" - Ahead "$2""}'

Вы даже можете создать псевдоним, который всегда сначала выбирает источник, а затем сравнивает ветви.

commit-diff = !"git fetch &> /dev/null && git rev-list --left-right --count"
Антонис
источник
1

После выполнения git fetch вы можете запустить git status, чтобы показать, сколько коммитов локальная ветвь находится впереди или позади удаленной версии ветки.

Это не покажет вам, сколько коммитов находится впереди или позади другой ветви. Вы можете выбрать полный анализ, посмотреть github или использовать решение, подобное Vimhsa, которое описано выше: Статус Git для всех репозиториев.

Уэйд Уильямс
источник