Ответ 1
git log origin/master..HEAD
Вы также можете просмотреть diff, используя тот же синтаксис
git diff origin/master..HEAD
Как я могу просмотреть любые локальные коммиты, которые я сделал, которые еще не были перенесены в удаленный репозиторий? Иногда git status
будет печатать, что моя ветка X совершает опережение origin/master
, но не всегда.
Это ошибка с моей установкой Git, или я что-то не хватает?
git log origin/master..HEAD
Вы также можете просмотреть diff, используя тот же синтаксис
git diff origin/master..HEAD
Если вы хотите увидеть все фиксации во всех ветвях, которые еще не нажаты, вы можете найти что-то вроде этого:
git log --branches --not --remotes
И если вы хотите видеть только самую последнюю фиксацию в каждой ветки и имена ветвей, это:
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
Вы можете показать все фиксации, которые у вас есть локально, но не вверх по течению с помощью
git log @{u}..
@{u}
или @{upstream}
означает восходящую ветвь текущей ветки (см. git rev-parse --help
или git help revisions
).
Это сработало для меня:
git cherry -v
Как указано на Git: см. все неустановленные коммиты или коммиты, которые не находятся в другом ветке.
Вы можете сделать это с помощью git log
:
git log origin..
Предполагая, что origin
- это имя вашего восходящего потока, оставив любое имя версии после ..
означает HEAD
, в котором перечислены новые коммиты, которые не были нажаты.
Удобный 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
но также определяет текущее имя ветки.
Все остальные ответы говорят о "восходящем потоке" (ветки, из которой вы тянете).
Но локальная ветвь может нажимать на другую ветку, чем та, из которой она извлекается.
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
.
<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
Вы можете попробовать...
gitk
Я знаю, что это не чистая опция командной строки, но если вы ее установили и используете в GUI-системе, это отличный способ увидеть именно то, что вы ищете, и еще многое другое.
(Я действительно удивлен, что никто не упомянул об этом до сих пор.)
git branch -v
будет показывать для каждой локальной ветки "вперед" или нет.
Я использую следующий псевдоним, чтобы получить только список файлов (и статус), которые были зафиксированы, но не были нажаты (для текущей ветки)
git config --global alias.unpushed \
"diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
то просто выполните:
git unpushed
Я сделал коммит ранее, ни в какую ветку, ни в удаленную, ни в локальную. Просто коммит. У меня ничего не получалось из других ответов, кроме как с помощью:
git reflog
Там я нашел свой коммит.
Я считаю, что наиболее типичный способ сделать это - запустить что-то вроде:
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}^..'
Это не ошибка. Вероятно, вы видите статус git после неудачного автоматического слияния, когда изменения с удаленного пользователя извлекаются, но еще не объединены.
Чтобы увидеть фиксации между локальным репо и удаленным, сделайте следующее:
git fetch
Это безопасно на 100% и не будет макетировать вашу рабочую копию. Если были изменения git status
wil show X commits ahead of origin/master
.
Теперь вы можете показать журнал коммитов, находящихся в удаленном, но не локальном:
git log HEAD..origin
Я предлагаю вам перейти к script https://github.com/badele/gitcheck, я закодировал этот script для проверки за один проход всех ваших git репозиториев, и он показывает, кто не совершил и кто не нажал/вытащил.
Здесь приведен пример результата
git cherry -v
Здесь будет отображаться ваша локальная история комментариев (еще не нажата) с соответствующим сообщением
Существует инструмент с именем 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
для экранного уведомления о неуправляемых и нераспределенных изменениях.
Это помогло мне лучше:
git log --oneline @{upstream}..
или
git log --oneline origin/(remotebranch)..
Аналогично: для просмотра несвязанных ветвей:
git branch --all --no-merged
Это могут быть подозрения, но я рекомендую ответ cxreg
Чтобы перечислить все нефиксированные commit во всех ветвях, вы можете использовать эту команду:
git log --branches @{u}..
Если количество коммитов, которые не были вытолкнуты, это одноразрядное число, которое часто бывает, самый простой способ:
$ git checkout
git отвечает, сообщая вам, что вы "опережаете N совершает" относительно вашего происхождения. Поэтому теперь просто учитывайте это число при просмотре журналов. Если вы "впереди на 3 коммиты", верхние 3 записи в истории по-прежнему остаются закрытыми.
Один из способов сделать вещи - перечислить коммиты, доступные в одной ветки, но не другие.
git log ^origin/master master
Здесь мое портативное решение (оболочка 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
.
git show
отобразит все различия в ваших локальных коммитах.
git show --name-only
отобразит локальный идентификатор фиксации и имя фиксации.
git diff origin
Предполагая, что ваша ветка настроена для отслеживания начала координат, это должно показать вам различия.
git log origin
Дает вам краткое изложение коммитов.