Использование Git как найти изменения между локальными и удаленными

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

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

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

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

Ответ 1

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

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

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

Ответ 2

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

Чтобы подражать hg incoming:

git log [email protected]{u}

Чтобы подражать hg outgoing:

git log @{u}..

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

git config --global alias.incoming '!git remote update -p; git log [email protected]{u}'
git config --global alias.outgoing 'log @{u}..'

Ответ 3

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

git diff master origin/master

Ответ 4

  • Используйте "git log origin..HEAD"

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

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

Ответ 5

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

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

Вот что говорит об этом man man git:

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

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

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

Ответ 6

Я бы сделал

$ git fetch --dry-run

для hg incoming и

$ git push --dry-run

для hg outgoing.

Ответ 7

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

Ответ 8

git входящий

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

git исходящий

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

Ответ 9

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

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

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

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

git log --online 5905..4878 # Displays each commit comment

Ответ 10

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