2008-10-23 2 views
142

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

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

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

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

+11

Рассматривая ответы, кажется, есть некоторые путаницы в отношении того, что на самом деле делают `hg incoming` и` hg outgoing`. Ближайший эквивалент Git, который я нашел, является опцией `--dry-run`. Просто «git pull -dry-run», и вы увидите список всех вещей, которые должны произойти. – 2012-09-29 10:16:48

ответ

96

Git не может отправлять такую ​​информацию по сети, как Hg can. Но вы можете запустить git fetch (что больше похоже на hg pull, чем 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.

32
  1. Использование "Журнал мерзавец origin..HEAD"

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

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

+3

(И если вы не отслеживаете удаленную ветку, это «git log origin/master..HEAD».) – plindberg 2010-08-17 13:16:47

+4

«origin» - это не название ветви удаленного отслеживания, это имя пульта. И просто указание удаленного имени не работает, вы должны указать ветвь удаленного отслеживания, которая будет источником/мастером. – robinst 2011-05-25 09:53:37

41

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

git diff master origin/master

+1

Работал для меня (но наоборот) - `git diff origin/master master` – 2015-09-01 05:22:19

19

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

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

Это то, что журнал страница человек мерзавец говорит об этом:

Shows all commits that are in any of local branches but not in any of remote tracking branches for origin (what you have that origin doesn’t).

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

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

Начиная с 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}..' 
+0

git log .. @ {u} дает мне эти ошибки. (У меня есть как исходный, так и восходящий репозиторий в моей конфигурации git). Ошибка: не найдена ветка восходящего направления для '' Ошибка: не найдено ни одной ветки вверху.' ошибка: не найдена восходящая ветка для' .. ' fatal: неоднозначный аргумент' .. @ {u} ': неизвестная ревизия или путь не в рабочем дереве. Используйте '-' для разделения путей от изменений – Henrik 2011-10-01 13:42:46

+6

Вы получите эти ошибки, если локальная ветвь не настроена с восходящим потоком. Чтобы исправить, запустите `git branch --set-upstream foo origin/foo`. – 2011-10-01 18:18:01

1

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

0

мерзавец входящий

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

мерзавец исходящее

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

Я бы

$ git fetch --dry-run 

для hg incoming и

$ git push --dry-run 

для hg outgoing.

0

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

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

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

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

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

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

Смежные вопросы