Git впереди/за информацией между мастером и веткой?
Я создал ветку для тестирования в своем локальном репо (test-branch
), который я нажал на Github
.
Если я перейду в свою учетную запись Github
и выберите этот test-branch
, он отобразит информацию:
This branch is 1 commit ahead and 2 commits behind master
Мои вопросы:
- Как я могу отображать эту информацию локально (т.е. команда, которая показывает это на терминале, вместо того, чтобы открывать
Github
, чтобы увидеть ее)?
-
Я знаю, что вижу различия между ветвями, используя:
git diff master..test-branch
или используя Meld
(что я предпочитаю):
git difftool master..test-branch
но мне было интересно, есть ли способ увидеть, что впереди и за что-то происходит отдельно. И.Е.: Есть ли способ показать, что 1 совершает сам по себе, а затем эти 2 совершают позади себя?
Ответы
Ответ 1
Вот трюк, который я нашел, чтобы сравнить две ветки и показать, сколько коммитов каждая ветвь впереди другой (более общий ответ на ваш вопрос 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-branch
имеет 7 фиксаций вперед и 1 фиксация позади".
Вы также можете сравнить локальные ветки с удаленными ветвями, например, origin/master...master
чтобы узнать, сколько мест совершает локальная master
ветвь впереди/за ее удаленным партнером.
Ответ 2
Прежде всего, чтобы увидеть, сколько ревизий вы находитесь за локально, вы должны сделать 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
UPDATE
Чтобы увидеть изменения вперед/назад, ветвь должна быть настроена для отслеживания другой ветки. Для меня это поведение по умолчанию, когда я клонирую удаленный репозиторий, и после того, как я нажму ветку с помощью git push -u remotename branchname
. Моя версия 1.8.4.3, но она работает так, как я помню.
Начиная с версии 1.8 вы можете настроить ветвь отслеживания следующим образом:
git branch --track test-branch
Начиная с версии 1.7, синтаксис был другим:
git branch --set-upstream test-branch
Ответ 3
С Git 2.5+ теперь у вас есть еще один вариант увидеть вперед/назад для всех ветвей, которые настроены на нажатие на ветку.
git for-each-ref --format="%(push:track)" refs/heads
Подробнее в разделе Просмотр Unpushed Git Commits"
Ответ 4
После выполнения git fetch вы можете запустить git статус, чтобы показать, сколько мест совершает локальная ветка впереди или позади удаленной версии ветки.
Это не покажет вам, сколько из них совершает движение вперед или назад от другой ветки. Ваши варианты - это полный разброс, просмотр github или использование такого решения, как Vimhsa, связанное выше: Git статус по всем репо
Ответ 5
Это может не отвечать на ваш вопрос напрямую, но почему бы не использовать SourceTree