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+ (Q2 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-branch це 7 позицій попереду і 1 фіксація позаду".

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


1
Це чудове рішення для мене, щоб дізнатися, чи можу я видалити гілку, чи вона ще випереджає розробку.
Maverick1st

1
@ Maverick1st, так, ця команда особливо корисна, коли ви стежите за робочим процесом gitflow (яким я є)
user1834095

2
Це найкращий для мого використання випадок, якщо ваша поточна гілка функцій стоїть за віддаленим майстром ( 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 ... походження / master git diff походження / master ... master Як би там не було, "git status -sb" був дуже корисним.
Vituel

10

З Git 2.5+ тепер у вас є ще одна можливість бачити вперед / ззаду всі гілки, налаштовані для натискання на гілку.

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

Дивіться більше на " Перегляд незапущених Git Commits "


Чи можете ви зробити це лише для поточної гілки та її віддаленої гілки відстеження?
spex

@spex да: в комплекті 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, щоб показати, скільки комісій виконує локальна гілка вперед або позаду віддаленої версії гілки.

Це не покаже вам, скільки комісій воно вперед або поза іншою гілкою. Ваші варіанти - це повна різниця, дивлячись на github або використовуючи таке рішення, як Vimhsa, пов'язане вище: статус Git для всіх репо

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.