Используя Git, как найти изменения между локальным и удаленным - PullRequest
148 голосов
/ 23 октября 2008

Вот два разных вопроса, но я думаю, что они связаны между собой.

  1. При использовании Git как узнать, какие изменения я зафиксировал локально, но еще не отправил в удаленную ветку? Я ищу что-то похожее на команду Mercurial hg outgoing.

  2. При использовании Git, как узнать, какие изменения произошла в удаленной ветке перед выполнением извлечения? Я ищу что-то похожее на команду Mercurial hg incoming.

Для второго: есть ли способ увидеть, что доступно, а затем выбрать те изменения, которые я хочу вытащить?

Ответы [ 10 ]

109 голосов
/ 17 июня 2011

Начиная с Git 1.7.0, существует специальный синтаксис, который позволяет вам в общем случае ссылаться на ветку upstream: @{u} или @{upstream}.

Для имитации hg incoming:

git log ..@{u}

Для имитации hg outgoing:

git log @{u}..

Я использую следующие псевдонимы incoming и outgoing, чтобы упростить использование вышеуказанного:

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'
97 голосов
/ 24 октября 2008

Git не может отправлять такую ​​информацию по сети, как Hg может. Но вы можете запустить git fetch (что больше похоже на hg pull, чем hg fetch), чтобы получать новые коммиты с ваших удаленных серверов.

Итак, если у вас есть ветка с именем master и пульт с именем origin, после запуска git fetch у вас также должна быть ветка с именем origin/master. Затем вы можете получить git log всех коммитов, которые master должны быть надмножеством origin/master, выполнив git log master..origin/master. Обратить эти два, чтобы получить противоположность.

Мой друг, Дэвид Доллар, создал пару скриптов git shell для имитации hg incoming/outgoing. Вы можете найти их в http://github.com/ddollar/git-utils.

42 голосов
/ 24 октября 2008

Не полный ответ, но git fetch извлечет удаленное хранилище и не выполнит слияние. Затем вы можете сделать

git diff master origin/master
32 голосов
/ 23 октября 2008
  1. Использовать "git log origin..HEAD"

  2. Используйте "git fetch", а затем "git log HEAD..origin". Вы можете выбрать отдельные коммиты, используя перечисленные идентификаторы коммитов.

Вышесказанное предполагает, конечно, что «origin» - это имя вашей удаленной ветви отслеживания (как, если вы использовали клон с параметрами по умолчанию).

21 голосов
/ 25 мая 2011

Также есть, для сравнения всех ветвей:

git log --branches --not --remotes=origin

Вот что говорит об этом man-страница git log:

Показывает все коммиты, которые находятся в любом из местные филиалы, но не в любом из удаленное отслеживание веток для происхождения (то, что у вас этого происхождения нет).

Выше указано для outgoing. Для incoming просто поменяйте местами:

git log --remotes=origin --not --branches
8 голосов
/ 21 января 2014

Я бы сделал

$ git fetch --dry-run

для hg incoming и

$ git push --dry-run

для hg outgoing.

1 голос
/ 05 ноября 2011

git-out - это скрипт, который достаточно точно имитирует hg outgoing. Он анализирует вывод "push -n", поэтому он производит точный вывод, если вам нужно указать дополнительные аргументы для push.

0 голосов
/ 22 октября 2015

Когда вы делаете git fetch, все содержимое, включая ветки, теги (ссылки) временно сохраняются в .git / FETCH_HEAD, содержимое которого можно просмотреть с помощью команды: git log FETCH_HEAD Если вы не используете суффикс -a с git fetch, то по умолчанию содержимое FETCH_HEAD будет перезаписано новым содержимым. Из этого содержимого вы можете просмотреть и решить, в какую ветку вы хотите объединить их, если вы это сделаете, или вы можете просто выбрать вишню, если вы хотите всего несколько коммитов из того, что было получено извлечением.

0 голосов
/ 07 июля 2014

Когда ответы "git log" и @ {u} первоначально дали мне ошибки "неизвестной ревизии", я опробовал предложение Криса / Ромкинса о git push --dry-run.

Вы получите вывод, такой как «5905..4878 master-> master». 5905 - это последний коммит, который удаленный имеет и фиксирует через (и включая) 4878, который будет применен к удаленному.

Затем вы можете использовать 5905..4878 в качестве аргументов для нескольких других команд git для получения более подробной информации:

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment
0 голосов
/ 09 декабря 2013

Git входящих

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git outgoing

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...