Просмотр невыпущенных коммитов Git


1753

Как я могу просмотреть любые локальные коммиты, которые я сделал, которые еще не были отправлены в удаленный репозиторий? Изредка git statusбудет распечатываться, что моя ветка на X коммитов опережает origin/master, но не всегда.

Это ошибка с моей установкой Git или я что-то упустил?


18
Начиная с Git 2.5+ (2 квартал 2015 года), фактический ответ будет следующим git log @{push}... Посмотрите на этот новый ярлык @{push}(ссылаясь на ветку удаленного отслеживания, на которую вы нажимаете) в моем ответе ниже
VonC

59
@Torek - еще одно простое задание, затрудненное Git. Каждый раз, когда возникает вопрос Git с сотнями или тысячами откликов и миллионами просмотров, кто-то должен подумать: вау, мы действительно испортили этот рабочий процесс. Увы, разработчики Git пропустили этап обратной связи в жизненном цикле разработки, поэтому обратная связь не включена. Вместо этого они продолжают повторять одни и те же ошибки снова и снова. По этому вопросу git status --allдолжен был появиться в 2010 году; или git status -vдолжен фактически предоставить подробный вывод, который включает дополнительную информацию.
июня

4
Я не согласен с тем, что «git status -v» должен предоставлять эту информацию, поскольку он предназначен для предоставления статуса рабочего дерева, поскольку оно относится только к извлеченной ветви. Тем не менее, см. Ответ ниже о "git branch -v", который, как я считаю, должен быть принят
JoelFan

13
Этот конкретный вопрос StackOverflow имеет наибольшее количество правильных ответов, которые все работают, но не имеют никакого смысла.
Пит Элвин

@ josh-buhler Извините, я случайно проголосовал ... пока я пытался нажать кнопку "ЗВЕЗДА". Повторная попытка проголосовать, но не сработало!
Рафи Алхамд

Ответы:


1828
git log origin/master..HEAD

Вы также можете просматривать различия, используя тот же синтаксис

git diff origin/master..HEAD

3
Это сделало это для меня - по какой-то причине происхождение журнала git .. само по себе выдает ошибку. Похоже, у меня также была проблема с тем, как была настроена моя локальная ветка - как только я сделал изменения, которые я нашел здесь: wincent.com/blog/…… проблема была решена, и я мог бы снова использовать git status, чтобы увидеть то, что я хотел ,
Джош Бюлер

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для немного дополнительной удивительности
Кори Дэниелсон

141
Это не лучшее решение. Origin / master не всегда может быть ветвью вверх по течению. Лучшее решение - использовать @ {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чтобы показать все коммиты, которые не были переданы ни одному восходящему каналу в одной ветке.
Павл

Это было так полезно, что я назвал это в своем конфиге zsh. Спасибо.
Скотти С.

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

--decorateпоказывает ветви также. --graphделает это еще более очевидным.
Рэй

Обратите внимание, что этот список команд содержит только те коммиты, которые не были переданы ни в одной ветви. Пример: скажем, у вас есть разработка ветки с помощью feat-NewThing. Вы вносите изменения локально в feat-NewThing. (В журнале есть изменения.) Затем вы отправляете feat-newThing в его удаленную ветку. (Журнал пуст). Вы объединяете local 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 - «Найти коммиты, которые еще должны быть применены к апстримам», кажется, обеспечивает то, о чем просил OP, но только с темой коммита, а не со всем сообщением коммита
Eido95

2
Стоит отметить, что это сообщит вам только, если в ветке, которую вы в настоящее время извлекли, есть невыпущенные коммиты. Он не будет сообщать вам, если у вас есть локальная ветвь (в настоящее время не проверенная) с невыпущенными коммитами.
Дэйв Ярвуд

66

Вы можете сделать это с git log:

git log origin..

Предполагая, что originэто имя вашего апстрима, исключая любое имя ревизии после ..подразумеваемого HEAD, в котором перечислены новые коммиты, которые не были переданы.


1
Всякий раз, когда я вижу ответ с git log"2-dots-not-3", он всегда напоминает мне stackoverflow.com/questions/53569/… ;)
VonC

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

Это будет сравнивать с веткой по умолчанию в источнике, а не с текущей удаленной веткой.
Груз

43

Все остальные ответы говорят о «восходящем» (ветке, из которой вы тянете).
Но местное отделение может подтолкнуть к другому ветви , чем тот , что вытягивает из.

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

Это та ветвь удаленного отслеживания, которая учитывается при поиске незафиксированных коммитов: та, которая отслеживает, branch at the remoteкуда будет помещена локальная ветвь . Может быть, опять же , или даже .
branch at the remoteorigin/xxxanotherUpstreamRepo/yyy

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

См. Коммит 29bc885 , коммит 3dbe9db , коммит adfe5d0 , коммит 48c5847 , коммит a1ad0eb , коммит e291c75 , коммит 979cb24 , коммит 1ca41a1 , коммит 3a429d0 , коммит a9f9f8c , коммит 8770e6f , коммит da66b27 , коммит f052151f , коммит f052151 , коммит 9 ee все от 9 коммитов 2015] и передайте e41bf35 [01 мая 2015] Джеффом Кингом ( peff) .
(Объединено Джунио С Хамано - gitster-в коммит c4a8354 , 05 июня 2015 г.)

Коммит adfe5d0 объясняет:

sha1_name: реализовать @{push}стенографию

В треугольном рабочем процессе каждая ветвь может иметь две различные точки интереса: тот @{upstream}, из которого вы обычно тянете, и пункт назначения, к которому вы обычно продвигаетесь. Для последнего нет сокращения, но его полезно иметь.

Например, вы можете узнать, какие коммиты вы еще не выдвинули :

git log @{push}..

Или, как более сложный пример, представьте, что вы обычно извлекаете изменения origin/master(которые вы задали как свои @{upstream}) и помещаете изменения в свой личный форк (например, as myfork/topic).
Вы можете выдвинуть на свою вилку несколько компьютеров, требуя интегрировать изменения из места назначения push, а не в восходящий поток .
С этим патчем вы можете просто сделать:

git rebase @{push}

вместо того, чтобы вводить полное имя.

Commit 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 в разделе [alias].
Гари Харан

1
Копирование / вставка в bash не работает, но скрипт довольно полезен и понятен
greuze

Это не псевдоним bash, как указывает @GaryHaran. Также есть команда git для добавления псевдонимов: git alias <alias-name> <command>в этом случае команда должна быть заключена в одинарные кавычки, чтобы экранировать специальные символы из оболочки.
Даг Хёйдал

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

Я знаю, что это не просто опция командной строки, но если вы установили ее и используете систему с графическим интерфейсом, это отличный способ увидеть именно то, что вы ищете, а также многое другое.

(Я на самом деле немного удивлен, что никто не упомянул об этом.)


3
gitk --allдля просмотра всех веток.
Рэй

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

@ Джастин-ом gitkэто круто! Никогда не знал, что это существует! Удобно просматривать изменения в хорошем интерфейсе.
Рафи Алхамд

@ray tigнаиболее полезен в ситуации «только терминал» - когда вы не получаете доступ к графическому интерфейсу рабочего стола. Узнав об этом в первый раз! ИНТЕРЕСНО: tigОБРАТНО git!
Рафи Алхамд

30

git branch -v покажет, для каждой локальной ветви, "впереди" или нет.


2
Да, в случае, если на ветке есть нефиксированный коммит devel, соответствующая строка будет * devel 8a12fc0 [ahead 1] commit msg( *будет только на строке, соответствующей извлеченной ветке). ahead 1означает «вперед на один коммит», т. е. есть один не выдвинутый коммит.
Аурелиен

2
Не так ли git branch -vv? Ср docs: «Если указано дважды, выведите также имя вышестоящей ветви (см. также git remote show <remote>)».
Грязный Генри

Речь идет не о печати имени вышестоящей ветви, а только о печати behindи / или aheadдля каждой локальной ветви, что достаточно для решения проблемы OP (обнаружение невыполненных коммитов). git branch -vбудет достаточно для того, только что протестировал снова с Git 2.16.2 :)
Aurelien

Параметр -vv полезен, потому что он показывает разницу между ветвями, которые являются актуальными для удаленного, и ветвями, которые вообще не были перенесены. (Только с одним -v они одинаково отображаются на дисплее.)
RM

30

Я сделал коммит ранее, ни в какую ветку, ни в удаленную, ни в локальную. Просто коммит. Ничто из других ответов не сработало для меня, но с:

git reflog

Там я нашел свой коммит.


Как указано в этой ссылке git-scm.com/docs/git-reflog , «Журналы ссылок» или «reflogs», запишите, когда подсказки веток и другие ссылки были обновлены в локальном репозитории. В моем случае я клонировал репо, создал новую ветку, удалил ветку, создал новую, создал коммит и изменил коммит. Все эти шаги были записаны как HEAD @ {0}: commit (изменить): .. HEAD @ {1}: commit: ... HEAD @ {2}: checkout: переход от ... к ... HEAD @ { 3}: checkout: перемещение от ... к ... HEAD @ {4}: clone: ​​from # сорри за формат SO, по-видимому, не допускает мультилинии в комментариях
скорость

это включает и исходные коммиты, лучшее решение будет использовать команду, предоставленную @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 --name-only HEAD) в моем случае "undefined"
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, но я не уверен, что этого достаточно.
Конрад Шалвински

@ KonradSzałwiński У меня нет Windows-машины, но в этой теме ( stackoverflow.com/questions/4750806/… ) пользователь, кажется, ответит на ваш вопрос :). Но я не проверял в Windows, и я не уверен, что это сработает.
Бруно Аделе

@ KonradSzałwiński, автор ChristianTremblay github добавил поддержку Windows. Теперь гитчек работает на windows. Вы можете скачать его на github.com/badele/gitcheck
Бруно Адели

Теперь вы также можете использовать gitcheck напрямую из док-контейнера (с вашими файлами на вашем хосте). Для получения дополнительной информации см. Проект gitcheck github
Bruno Adelé

Спасибо за публикацию, это кажется действительно полезным. Я попытался установить, но после установки я не могу найти расположение скрипта для его запуска. $ pip install 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 install для gitcheck: запущен Запуск setup.py install для gitcheck: завершен со статусом 'done' Успешно установлен 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

Существует инструмент с именем unpressed, который сканирует все репозитории 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

Чтобы легко перечислить все unpressed commit во всех ветках, вы можете использовать эту команду:

 git log --branches  @{u}..

4

Аналогично: Для просмотра неотделенных веток:

git branch --all --no-merged

Это может быть подозрительно, но я рекомендую ответ cxreg


3

Если число коммитов, которые не были выдвинуты, представляет собой однозначное число, которое часто бывает, самый простой способ:

$ git checkout

Git отвечает, говоря вам, что вы «впереди N коммитов» относительно вашего происхождения. Так что теперь просто помните это число при просмотре логов. Если вы «впереди 3 коммитов», топ-3 коммитов в истории остаются приватными.


2

Один из способов сделать это - перечислить коммиты, которые доступны в одной ветви, но не в другой.

git log ^origin/master master

Что делает символ «^»?
Аран Малхолланд

@AranMulholland это означает не здесь.
Алекс

1

Как сказано выше:

git diff origin / master..HEAD

Но если вы используете GIT GUI

После открытия графического интерфейса выберите «Репозиторий» -> Под этим « Визуализировать историю »

Примечание: некоторые люди любят использовать CMD Prompt / Terminal, а некоторые любят использовать Git GUI (для простоты)


опция визуализации в 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.