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

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

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

Ответ 1

git log origin/master..HEAD

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

git diff origin/master..HEAD

Ответ 2

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

git log --branches --not --remotes

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

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

Ответ 3

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

git log @{u}..

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

Ответ 5

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

git log origin..

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

Ответ 6

Удобный git псевдоним для поиска unpushed коммитов в текущей ветке:

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

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

Ответ 7

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

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+ (Q2 2015) вводит новый ярлык для этого: <branch>@{push}

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

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

sha1_name: реализовать @{push} сокращенное

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

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

git log @{push}..

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

git rebase @{push}

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

commit 29bc885 добавляет:

for-each-ref: принять формат < <2 →

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

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

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

Ответ 8

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

gitk

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

(Я действительно удивлен, что никто не упомянул об этом до сих пор.)

Ответ 9

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

Ответ 10

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

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

то просто выполните:

git unpushed

Ответ 11

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

git reflog

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

Ответ 12

Я считаю, что наиболее типичный способ сделать это - запустить что-то вроде:

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

Однако я лично предпочитаю работать:

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

который показывает коммиты из ветвей all, которые не объединены вверх по течению, плюс последняя фиксация в восходящем потоке (которая отображается как корень node для всех остальных коммитов). Я использую его так часто, что создал для него псевдоним noup.

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

Ответ 13

Это не ошибка. Вероятно, вы видите статус git после неудачного автоматического слияния, когда изменения с удаленного пользователя извлекаются, но еще не объединены.

Чтобы увидеть фиксации между локальным репо и удаленным, сделайте следующее:

git fetch

Это безопасно на 100% и не будет макетировать вашу рабочую копию. Если были изменения git status wil show X commits ahead of origin/master.

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

git log HEAD..origin

Ответ 14

Я предлагаю вам перейти к script https://github.com/badele/gitcheck, я закодировал этот script для проверки за один проход всех ваших git репозиториев, и он показывает, кто не совершил и кто не нажал/вытащил.

Здесь приведен пример результата enter image description here

Ответ 15

git cherry -v

Здесь будет отображаться ваша локальная история комментариев (еще не нажата) с соответствующим сообщением

Ответ 16

Существует инструмент с именем unpushed, который сканирует все репозитории Git, Mercurial и Subversion в указанном рабочем каталоге и отображает список файлов с ucommite и нечеткие коммиты. Установка проста в 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 script unpushed-notify для экранного уведомления о неуправляемых и нераспределенных изменениях.

Ответ 17

Это помогло мне лучше:

git log --oneline @{upstream}..

или

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

Ответ 18

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

git branch --all --no-merged

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

Ответ 19

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

 git log --branches  @{u}..

Ответ 20

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

$ git checkout

git отвечает, сообщая вам, что вы "опережаете N совершает" относительно вашего происхождения. Поэтому теперь просто учитывайте это число при просмотре журналов. Если вы "впереди на 3 коммиты", верхние 3 записи в истории по-прежнему остаются закрытыми.

Ответ 21

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

git log ^origin/master master

Ответ 22

Здесь мое портативное решение (оболочка script, которая работает на Windows тоже без дополнительной установки), которая показывает различия от источника для всех ветвей: git-fetch-log

Пример вывода:

==== branch [behind 1]

> commit 652b883 (origin/branch)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-10 09:11:11 +0100
|
|     Commit on remote
|
o commit 2304667 (branch)
  Author: BimbaLaszlo <[email protected]>
  Date:   2015-08-28 13:21:13 +0200

      Commit on local

==== master [ahead 1]

< commit 280ccf8 (master)
| Author: BimbaLaszlo <[email protected]>
| Date:   2016-03-25 21:42:55 +0100
|
|     Commit on local
|
o commit 2369465 (origin/master, origin/HEAD)
  Author: BimbaLaszlo <[email protected]>
  Date:   2016-03-10 09:02:52 +0100

      Commit on remote

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

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

      Last common commit

Параметры, переданные для журнала, например. --oneline или --patch.

Ответ 23

git show

отобразит все различия в ваших локальных коммитах.

git show --name-only

отобразит локальный идентификатор фиксации и имя фиксации.

Ответ 24

git diff origin

Предполагая, что ваша ветка настроена для отслеживания начала координат, это должно показать вам различия.

git log origin

Дает вам краткое изложение коммитов.