Просмотр невыпущенных коммитов Git - PullRequest
1550 голосов
/ 07 января 2010

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

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

Ответы [ 24 ]

1611 голосов
/ 07 января 2010
git log origin/master..HEAD

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

git diff origin/master..HEAD
645 голосов
/ 27 июля 2010

Если вы хотите увидеть все коммиты во всех ветвях, которые еще не выдвинуты, вы можете искать что-то вроде этого:

git log --branches --not --remotes

И если вы хотите видеть только самый последний коммит в каждой ветви и имена веток, это:

git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
291 голосов
/ 18 ноября 2011

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

git log @{u}..

@{u} или @{upstream} означает восходящую ветвь текущей ветви (подробности см. git rev-parse --help или git help revisions).

148 голосов
/ 17 декабря 2013
60 голосов
/ 07 января 2010

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

git log origin..

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

37 голосов
/ 03 марта 2011

Удобный псевдоним git для поиска нефиксированных коммитов в current branch:

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

, но также определяет текущее имя ветви.

36 голосов
/ 09 июня 2015

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

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

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

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

См. commit 29bc885 , commit 3dbe9db , commit adfe5d0 , commit 48c5847 , commit a1ad0eb , commit e291c75 , commit 979cb24 , commit 1ca41a1 , commit 3a429d0 , commit a9f9f8c , commit 8770e6f , commit da66b27 , commit f052154 , commit 9e3751d , commit ee2499f [все с 21 мая 2015 года] и совершить e41bf35 [01 мая 2015] Джефф Кинг (peff) .
(Объединено с Junio ​​C Hamano - gitster - in commit c4a8354 , 05 июня 2015 г.)

Commit adfe5d0 объясняет:

sha1_name: внедрить @{push} стенография

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

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

git log @{push}..

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

git rebase @{push}

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

Фиксация 29bc885 добавляет:

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

Так же, как у нас есть «%(upstream)», чтобы сообщить «@{upstream}» для каждого реф, этот патч добавляет «%(push)» для соответствия «@{push}».
Он поддерживает те же модификаторы формата отслеживания, что и в восходящем потоке (потому что вы, возможно, захотите узнать, например, в каких ветвях есть коммиты для нажатия ).

Если вы хотите увидеть, сколько коммитов ваши локальные ветви на впереди / позади по сравнению с веткой, на которую вы нажимаете:

git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
33 голосов
/ 28 января 2014

Вы можете попробовать ....

gitk

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

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

27 голосов
/ 20 июня 2015

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

20 голосов
/ 20 июля 2012

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

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

тогда просто сделайте:

git unpushed
...