Перегляд незапущених Git здійснює


1752

Як я можу переглянути будь-які зроблені вами місцеві комітети, які ще не були перенесені у віддалений сховище? Іноді git statusдрукуватимуть, що моя філія на X здійснює попереду origin/master, але не завжди.

Це помилка при моєму встановленні Git, чи я щось пропускаю?


18
Починаючи з Git 2.5+ (Q2 2015), фактична відповідь буде git log @{push}... Дивіться цю нову ярлик @{push}(посилаючись на відділення віддаленого відстеження, на яке ви підштовхуєтесь) у моїй відповіді нижче
VonC

59
@Torek - ще одне просте завдання, ускладнене Git. Щоразу, коли питання Git з'являється із сотнями чи тисячами оновлень та мільйонами переглядів, тоді хтось повинен задуматися: Нічого, ми справді перекрутили цей робочий процес. На жаль, розробники Git опустили етап зворотного зв'язку в життєвому циклі розвитку, тому зворотній зв'язок не включений. Натомість вони постійно і знову роблять одні й ті ж помилки. Це питання git status --allмало б з’явитися у 2010 році; або git status -vнасправді слід надати багатослівний вихід, який включає додаткову інформацію.
jww

4
Я не погоджуюся з тим, що "git status -v" повинен надавати цю інформацію, оскільки вона призначена для надання статусу робочого дерева, оскільки це стосується лише перевіреної гілки. Однак дивіться відповідь нижче про "git branch -v", що, на мою думку, має бути прийнятою відповіддю
JoelFan

13
Цей конкретний запит StackOverflow має найбільшу кількість правильних відповідей, на які всі роботи поки що не мають сенсу.
Піт Елвін

@ josh-buhler Вибачте, я випадково проголосував ... під час спроби натиснути на кнопку "ЗАРІК". Повторна спроба повторного голосування, але не вдалося!
RafiAlhamd

Відповіді:


1827
git log origin/master..HEAD

Ви також можете переглянути diff, використовуючи той самий синтаксис

git diff origin/master..HEAD

3
Це зробило це для мене - чомусь походження журналу git .. саме по собі кидало помилку. Схоже, у мене також виникли проблеми з налаштуванням моєї локальної гілки - як тільки я вніс зміни, я знайшов тут: wincent.com/blog/… ... проблема була вирішена, і я міг знову використовувати статус git, щоб побачити, що я хотів .
Джош Булер

6
Безцінне: Настільки, що я зробив git config --global alias.ahead "log origin/master..HEAD --oneline"так, що я міг швидко дізнатися, де я. Ще більше цукерок:for i in *; do echo $i && git ahead 2>/dev/null; done
Джеймі

15
git log --stat origin/master..HEADдля трохи додаткової дивовижності
Cory Danielson

141
Це не найкраще рішення. Походження / головний не завжди може бути гілкою вище за течією. Краще рішення - використовувати @ {u} замість "origin / master" для позначення гілки вище за течією. Оскільки HEAD мається на увазі за замовчуванням, це також можна не залишати. Дивіться відповідь @Ben Ling Вихідні зміни: git log @ {u} .. Вхідні зміни: git log .. @ {u}
PlagueHammer

12
@Nocturne Я просто хочу зазначити, що коли ця відповідь була розміщена, @{u}синтаксис ще не був доступний, він став доступний лише 12 лютого 2010 року . Також @{u}не працюватиме, якщо локальна гілка не налаштована з висхідним потоком. Нарешті, @{u}наразі не підтримується доповнення <remote>/<branch>вкладки, оскільки заповнення вкладки залишається одним з найшвидших способів отримати цю інформацію, і вона працюватиме, налаштована чи ні вгору.

703

Якщо ви хочете побачити всі коміти на всіх гілках, які ще не натиснуті, ви можете шукати щось подібне:

git log --branches --not --remotes

І якщо ви хочете бачити найсвіжішу комісію для кожної гілки та назви гілки, це:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline

8
Це круто. У відповідному сценарії у мене були дві місцеві гілки з двома гілками за течією, і одна місцева рука була об'єднана в іншу. Мені хотілося знати, які комісії було безпечно перезавантажити, але нормальне git log master..HEADне працювало, оскільки було кілька вхідних потоків. Ця публікація підштовхнула мене до того, git log MyBranch --not --remotesщоб продемонструвати всі зобов’язання, які не були висунуті в будь-яку гілку в одній гілці.
pavon

Це було настільки корисно, що я його псевдонімував у своєму zsh config. Дякую.
Скотті C.

Я розумію, що у вашій другій команді є також перелік комітетів, які ще не натиснуті, лише вона показує лише один на галузь.
Стефан

--decorateпоказує також гілки. --graphробить це ще більш очевидним.
Рей

Зауважте, що ці команди перелічують лише ті команди, які не були висунуті в жодній гілці. Приклад: скажіть, що у вас є філія, що розвивається за допомогою філії feat-NewThing. Ви вносите зміни локально до feat-NewThing. (У журналі є зміни.) Потім ви натискаєте feat-newThing на свою віддалену гілку. (Журнал порожній). Ви об’єднуєте локальний feat-newThing, щоб розвиватися локально. Припускаючи швидку перемотку вперед, журнал все ще не має змін.
Патрік Ш

325

Ви можете показати всі комісії, які є локально, але не вище за течією

git log @{u}..

@{u}або @{upstream}означає гілку поточної гілки поточної гілки (див. git rev-parse --helpабо git help revisionsдля деталей).


17
У Windows мені потрібно було заключити остаточний аргумент у лапки, як-от: git log "@ {u} .."
Джон Шнайдер

git log @{u}.. -p Один з найбільш корисних варіантів - -p , який показує відмінності, що вводяться в кожному підтвердженні.
mQuiroz

Можливо, кращий git log @ {push} .., дивіться іншу відповідь .
Ганс-Пітер Штерр

183

21
Я думаю, що це має бути основною відповіддю, оскільки цей дає більш стислий список комітетів, а не важких для читання, багатослівних різниць у всіх файлах !!
ViFI

1
git-cherry - "Знайдіть комітети, які ще мають бути застосовані до вище за течією", здається, передбачає те, про що вимагала ОП, але лише з предметом комісії, а не з усім повідомленням про виконання комісій.
Eido95

2
Варто зауважити, що це скаже вам лише у випадку, якщо на гілці, яку ви зараз перевірили, є незаперечні коміти. Він не скаже вам, чи є у вас локальна філія (наразі не перевірена) з незапущеними комісіями.
Дейв Ярвуд

66

Це можна зробити за допомогою git log:

git log origin..

Якщо припустити, що originце ім'я вашої upstream, залишаючи будь-яке ім'я перегляду після ..мається на увазі HEAD, в якому перераховані нові комісії, які не були висунуті.


1
Всякий раз , коли я бачу відповідь з git logі «2 х точок, які не-3», він завжди нагадує мені про stackoverflow.com/questions/53569 / ... ;)
VonC

1
Просто, щоб додати його до відповіді - якщо немає налаштування вище за течією, ця команда призводить до того, що не налаштовано вище. Запустіть git branch --set-upstream master origin/<branch>налаштування вище за течією, якщо ви схильні використовувати цю команду, щоб побачити поетапні комісії.
asyncwait

Це порівнюватиметься із початковою гілкою за походженням, а не з поточною віддаленою гілкою.
мазь

43

Усі інші відповіді говорять про "вгору за течією" (гілку, з якої ви витягуєте).
Але місцева гілка може натиснути на іншу гілку, ніж ту, з якої вона витягується.

masterможе не натиснути на гілку віддаленого відстеження " origin/master". Вгору гілки для може бути , але це може підштовхнути до віддаленого трекінгу гілки або навіть . Вони задаються для поточної гілки разом зі значенням.
masterorigin/masterorigin/xxxanotherUpstreamRepo/yyy
branch.*.pushremoteglobal remote.pushDefault

Це що віддалене відстеження гілка , яка розраховує при пошуку unpushed фіксацій: той , який відстежує , branch at the remoteде місцеве відділення буде засунути на. Може бути, знову ж , або навіть .
branch at the remoteorigin/xxxanotherUpstreamRepo/yyy

Git 2.5+ (Q2 2015) представляє новий ярлик для цього: <branch>@{push}

Див здійснювати 29bc885 , здійснювати 3dbe9db , здійснює adfe5d0 , здійснює 48c5847 , здійснюють a1ad0eb , здійснює e291c75 , здійснює 979cb24 , здійснює 1ca41a1 , здійснює 3a429d0 , здійснюють a9f9f8c , здійснюють 8770e6f , здійснюють da66b27 , здійснює f052154 , здійснює 9e3751d , здійснює ee2499f [всі з 21 травня 2015], і виконувати e41bf35 [01 травня 2015] від Джеффа Кінга ( peff) .
(Об’єднав Хуніо С Хамано -gitster -в комітеті c4a8354 , 05 червня 2015 р.)

Коміт adfe5d0 пояснює:

sha1_name: реалізувати @{push}скорочення

У трикутному документообігу кожна гілка може мати дві окремі цікаві точки: ту, @{upstream}яку ви зазвичай витягуєте, і пункт призначення, до якого ви зазвичай натискаєте. Не існує скорочення для останнього, але це корисно.

Наприклад, ви можете дізнатися, які комісії ви ще не натискали :

git log @{push}..

Або, як складніший приклад, уявіть, що ви зазвичай витягуєте зміни з origin/master(які ви встановили як свої @{upstream}), а зміни випробовуєте до власної особистої вилки (наприклад, як myfork/topic).
Ви можете підштовхнути до розчеру з декількох машин, вимагаючи від вас інтегрувати зміни від місця призначення, а не вище за течією .
З цим патчем ви можете просто зробити:

git rebase @{push}

а не вводити повне ім’я.

Коміт 29bc885 додає:

for-each-ref: прийняти %(push)формат " "

Подібно до того, як ми маємо " %(upstream)" повідомити " @{upstream}" для кожної посилання, цей патч додає " %(push)", щоб відповідати " @{push}".
Він підтримує ті самі модифікатори формату відстеження, що і вище (тому, що ви, можливо, хочете знати, наприклад, які гілки зобов'язуються натиснути ).

Якщо ви хочете побачити, скільки ваших місцевих філій вперед / позаду, порівняно з гілкою, на яку ви натискаєте:

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

42

Зручний псевдонім Git для пошуку незапущених комісій у поточній галузі:

alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline

Що це в основному робить:

git log origin/branch..branch

але також визначає поточну назву гілки.


8
Це круто! Для незнайомих псевдонімів просто додайте їх у файл ~ / .gitconfig у розділі [псевдонім].
Гері Харан

1
Копіювати / вставляти в bash не працює, але сценарій є досить корисним і зрозумілим
greuze

Це не псевдонім, як @GaryHaran. Існує також команда git для додавання псевдонімів: git alias <alias-name> <command>У цьому випадку команду слід оточити одинарними лапки, щоб уникнути спеціальних символів з оболонки.
Dag Høidahl

4
Це було б:git config --global alias.unpushed '!GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline'
Рікі Леві

Це в основному те саме, що і git log @ {u} .., проте - див. Іншу відповідь .
Ганс-Пітер Стрер

35

Ви можете спробувати ....

gitk

Я знаю, що це не чистий параметр командного рядка, але якщо ви встановили його і перебуваєте в системі GUI, це прекрасний спосіб точно побачити те, що ви шукаєте, а також ще багато іншого.

(Я насправді здивований, що ніхто до цього не згадував.)


3
gitk --allдля перегляду всіх гілок
Рей

3
tigє альтернативою ncurses.
Рей

@ Джастін-Ом gitk- це приголомшливо! Ніколи не знав, що це існує! Зручно переглядати зміни в приємному інтерфейсі користувача.
RafiAlhamd

@ray tigнайкорисніший у ситуації "лише термінал" - там, де ви не отримуєте доступ до GUI настільного ПК. Дізнайтесь про це вперше! ІНТЕРЕСНО: tigце ПОВЕРНЕННЯ git!
RafiAlhamd

30

git branch -v покаже, для кожної місцевої гілки, буде вона "вперед" чи ні.


2
Так, у випадку, якщо на гілці є незапущена фіксація devel, відповідний рядок буде * devel 8a12fc0 [ahead 1] commit msg( *буде лише у рядку, що відповідає перевіреній гілці). ahead 1означає "попереду на одне зобов'язання", тобто є одне невдалене скоєння.
Aurelien

2
Чи не так git branch -vv? Ср. Документи: "Якщо дано двічі, також надрукуйте назву гілки вище за течією (див. також git remote show <remote>)."
Брудний Генрі

Йдеться не про друк назви гілки вище за течією, а лише про друк behindта / або aheadдля кожної локальної гілки, що достатньо для вирішення проблеми ОП (виявлення незапущених комісій). git branch -vДля цього достатньо лише тестування знову з Git 2.16.2 :)
Aurelien

-Vv корисний, оскільки він показує різницю між гілками, які є сучасними з віддаленим, і тими, які взагалі не були висунуті. (За допомогою лише одного -v вони відображаються однаково на дисплеї.)
RM

30

Раніше я робив зобов’язання, не був висунутий до жодної гілки, ні віддаленої, ні місцевої. Просто фіксація. Ніщо з інших відповідей не працювало для мене, але з:

git reflog

Там я знайшов свою прихильність.


Як зазначено в цьому посиланні, git-scm.com/docs/git-reflog , Довідник-журнали або "reflogs" записують, коли підказки гілок та інші посилання були оновлені в локальному сховищі. У моєму випадку я клонував репо, створив нову гілку, видалив гілку, створив нову, створив фіксацію та змінив комісію. Усі ці кроки відновлюються як HEAD @ {0}: počin (поправка): .. HEAD @ {1}: commit: ... HEAD @ {2}: checkout: перехід від ... до ... HEAD @ { 3}: замовлення: перехід від ... до ... HEAD @ {4}: клон: з #sorry для формату ТАК не дозволяє багато коментарям у коментарях, мабуть
швидкість

це включає в себе походження фіксацій , як добре, найкращим рішенням було б використовувати команду , представлену @PlagueHammer ( stackoverflow.com/a/2016954/624048 )
Лінкольн

20

Я використовую наступний псевдонім, щоб отримати лише список файлів (і статус), які були зроблені, але не були висунуті (для поточної гілки)

git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"

тоді просто зробіть:

git unpushed

виглядає цікаво, але $ (git name-rev - namename only HEAD) у моєму випадку "не визначено"
vak

13

Я вважаю, що найтиповіший спосіб зробити це - запустити щось на кшталт:

git cherry --abbrev=7 -v @{upstream}

Однак я особисто віддаю перевагу бігу:

git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..

який показує коміти з усіх гілок, які не об'єднані вгору за течією, а також останній комікс у верхньому потоці (який відображається як кореневий вузол для всіх інших комітів). Я використовую його так часто, що я створив псевдонім noupдля нього.

git config --global alias.noup \
'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'

11

Я пропоную вам перейти до скрипту https://github.com/badele/gitcheck , я зашифрував цей скрипт для перевірки за один прохід у всіх ваших сховищах git, і він показує, хто не робив кому, а хто не натискав / не тягнув.

Ось результат вибірки введіть тут опис зображення


1
Не могли б ви пояснити, як змусити цей плагін працювати на машині Windows? Я намагаюся запустити pip, але команда відсутня в командному рядку. У мене встановлено Python, але я не впевнений, чи достатньо.
Konrad Szałwiński

@ KonradSzałwiński У мене немає машини Windows, але в цій темі ( stackoverflow.com/questions/4750806/… ) користувач, здається, відповідає на ваше запитання :). Але я не проходив тестування в Windows, і я не впевнений, що це працює.
Бруно Аделье

@ KonradSzałwiński дописувач github ChristianTremblay додав підтримку Windows. Зараз гетчек працює над вікнами. Ви можете завантажити його на github.com/badele/gitcheck
Бруно Аделье

Тепер ви також можете використовувати gitcheck безпосередньо з докерного контейнера (з файлами у вашому хості). Для отримання додаткової інформації дивіться проект gitche gitcheck
Bruno Adelé

Дякуємо, що опублікували це, це здається дійсно корисним. Я спробував встановити, але після встановлення я не можу знайти розташування сценарію для його запуску. $ pip встановити git + git: //github.com/badele/gitcheck.git Збір git + git: //github.com/badele/gitcheck.git Клонування git: //github.com/badele/gitcheck.git до c : \ users \ u6041501 \ appdata \ local \ temp \ pip-bxt472z_-build Встановлення зібраних пакетів: gitcheck Запуск setup.py встановлення для gitcheck: запущено Запуск setup.py встановлення для gitcheck: закінчено зі статусом 'виконано' Успішно встановлено gitcheck-0.3 .22
Лорен Фітч


9

Це не помилка. Напевно, ви бачите статус git після невдалого автоматичного злиття, коли зміни з пульта віддалені, але ще не об'єднані.

Щоб побачити коміти між локальним репо та віддаленим сервером, виконайте це:

git fetch

Це на 100% безпечно і не буде знущатися над робочою копією. Якщо були зміни, git statusпокажуть X commits ahead of origin/master.

Тепер ви можете показати журнал комітетів, які знаходяться у віддаленому, але не локальному:

git log HEAD..origin

8

Це працювало для мене краще:

git log --oneline @{upstream}..

або:

git log --oneline origin/(remotebranch)..

2
Для всіх, хто цікавиться, @{upstream}буквально ( upstreamце магічне слово), тоді як remotebranchце лише назва вашої гілки.
Стів Беннетт

7

Існує інструмент з іменем unpushed, який сканує всі репозиторії Git, Mercurial та Subversion у визначеному робочому каталозі та показує список невмілених файлів та невдалених комісій. Установка проста в Linux:

$ easy_install --user unpushed

або

$ sudo easy_install unpushed

встановити на всю систему.

Використання теж просто:

$ unpushed ~/workspace
* /home/nailgun/workspace/unpushed uncommitted (Git)
* /home/nailgun/workspace/unpushed:master unpushed (Git)
* /home/nailgun/workspace/python:new-syntax unpushed (Git)

Див. unpushed --helpАбо офіційний опис для отримання додаткової інформації. Він також має сценарій cronjob unpushed-notifyдля сповіщення на екрані про невмілості та незахищені зміни.


5

Щоб легко перерахувати всі незапущені коміти у всіх гілках, ви можете скористатися цією командою:

 git log --branches  @{u}..

4

Схожі: Для перегляду незасушених гілок:

git branch --all --no-merged

Вони можуть бути підозрюваними, але я рекомендую відповідь через cxreg


3

Якщо кількість комісій, які не були витіснені, - це одноцифрове число, яке це часто є, найпростішим способом є:

$ git checkout

git відповідає, повідомляючи вам, що ви "попереду N фіксує" щодо свого походження. Тож тепер просто пам’ятайте про це число під час перегляду журналів. Якщо ви "попереду на 3 коміти", перші 3 найкращі комісії в історії залишаються приватними.



1

Як було сказано вище:

git diff origin / master..HEAD

Але якщо ви використовуєте git gui

Відкривши інтерфейс gui, виберіть "Репозиторій" -> Під цим пунктом " Візуалізувати історію "

Примітка. Деякі люди люблять використовувати підказку / термінал CMD, а деякі хочуть використовувати графічний інтерфейс Git (для простоти)


візуалізувати варіант у git gui є той.
Раджеш Колхапуре

-2

Ось моє портативне рішення (скрипт оболонки, який працює і в Windows без додаткової установки), який показує відмінності від походження для всіх гілок: git-fetch-log

Приклад виводу:

==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

==== test [ahead 1, behind 1]

< commit 83a3161 (test)
| Author: BimbaLaszlo <bimbalaszlo@gmail.com>
| Date:   2016-03-25 22:50:00 +0100
|
|     Diverged from remote
|
| > commit 4aafec7 (origin/test)
|/  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
|   Date:   2016-03-14 10:34:28 +0100
|
|       Pushed remote
|
o commit 0fccef3
  Author: BimbaLaszlo <bimbalaszlo@gmail.com>
  Date:   2015-09-03 10:33:39 +0200

      Last common commit

Параметри, передані для журналу, наприклад, --onelineабо --patchможуть бути використані.


-3
git show

покаже всі відмінності у ваших місцевих комісіях.

git show --name-only

покаже ідентифікатор місцевого комітету та назву.


3
git showпоказує лише найновішу передачу, незалежно від того, була вона висунута у віддалений чи ні, вона не відображатиме всі ваші незапущені зобов'язання.

-6
git diff origin

Якщо припустити, що ваша філія створена для відстеження походження, то це повинно показати вам відмінності.

git log origin

Наведемо короткий зміст комітетів.


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