Git: Сравните все локальные коммиты с версией удаленного репо - PullRequest
34 голосов
/ 20 апреля 2011

Я немного новичок в Git, и то, что я пытаюсь сделать, похоже, должно быть возможным.В основном я работал над клоном репо и сделал немало локальных коммитов.Есть ли способ увидеть разницу в «сумме» всех моих изменений и оригинальную версию репо?Я предположил бы, что это будет возможно, потому что Git по существу сделает это, когда я сделаю push.

Вот пример того, что я пытаюсь сделать: в gitk я увижу что-то вроде этого:
* - [mybranch] Добавлен '42' в конец answers.txt (локальный коммит)
* - Добавлен 'Hello World' в конец my.txt (локальный коммит)
* - Добавлен 'C # /.NET 'к началу my.txt (локальный коммит)
* - <[RemoteRepo]> (исходное репо, с которого я клонировал)

Как я могу увидеть разницу суммы всех моихизменяется на my.txt и answers.txt по сравнению с исходной версией, которую я извлек из RemoteRepo?

Ответы [ 6 ]

50 голосов
/ 20 апреля 2011

Есть три способа (два других из других ответов, приведенных здесь)

1) git diff origin/master master
2) git diff origin/master..master
3) git diff origin/master...master

Первая и вторая совпадают и показывают изменения между подсказками мастера и удаленного мастера.

Третий показывает изменения, которые произошли на ведущем устройстве с момента последнего нажатия ветви, и я думаю, что это наиболее подходящий вариант, который вы ищете

16 голосов
/ 20 апреля 2011

Наиболее готовый ответ:

 git show-branch

Что вы можете сделать для большего контроля - это использовать git log приложение git rev-list:

 git log --left-right --graph --cherry-pick \
      --oneline branchname...remote/branchname

Это мой предпочтительный метод иприведет к чему-то вроде

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 some tagged commit

Включите --decorate, и вы получите что-то похожее на gitk, git-gui и gitweb:

> | fff6bda remote fix
< | c8903ee local fix
< |   724373c (tag_4) Merge branch 'bla' into bla
|\ \  
| < | 2faf547 details
| < | abbdc47 ....
|/ /  
< | befc181 (tag_3) some tagged commit

PRO TIP 1: Используйте 'git config alias.lr log --long-option1 --long-option2' для удобного использования

PRO TIP 2: Используйте 'git config color.ui auto' для немедленного облегчения зрения

Если хотите все локальные главы ( во всех локальных ветвях ) против все удаленные коммиты ( в тех же ветвях ):

git log --decorate --pretty=oneline --all --not --glob=refs/remotes --no-walk

Оставьте без прогулок, чтобы получить все отдельные ревизии.В этом случае я предпочитаю использовать переключатели, показанные ранее (--graph --left-right)

Merges

Если вы хотите увидеть слияния четко, включите --boundary

Различные расширенные запросы:

Фильтрация результатов

Git log и rev-list поддерживают множество возможностей хитрой фильтрации, см. Справочную страницу

--after '2001-01-01'
--until 'last week'
--author 'martin'
-E -i  --grep='fixes #[0123456789]+'
-S 'new_debug_function'

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

Что хранится локально?

Что находится в хранилищах, но не на удаленных (заметьте, что нет никакого способачтобы ссылаться на тайники на удаленных ветках, потому что тайники находятся в рефлогах, а рефлоги (даже для удаленных веток) всегда отражают локальную историю [1]):

git log $(git rev-list -g stash) --not --glob=refs/remotes 

Все (другие) недоступные коммиты ...

Примечания

  • в моем рабочем процессе эти изменения только исправлены / исправлены только коммиты и удаленные тайники
  • также их генерация займет некоторое время в зависимости от размера вашего графика истории
  • это будет включать все удаленные тайники, но не текущие таймеры

    git log $ (git fsck --unreachable --full --lost-found | grep 'commit' | cut-d '' -f3) \ --no-walk --not --glob = refs / remotes --oneline --decorate

Сценарии

Для сценариевВ целях замены замените использование git log на git rev-list, и вы получитетолько хэши (и еще немного устойчивости скриптов)

[1] См. также мои предыдущие ответы о том, как переносить тайники между репозиториями:

8 голосов
/ 22 августа 2011

Самая простая и, безусловно, самая легкая для запоминания команда, которая (обычно) выполняет то, что вам нужно, это:

git diff origin

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

5 голосов
/ 20 апреля 2011

разницу можно просмотреть с помощью git diff A B, он сравнит код от A до B:

git diff origin/master master

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

2 голосов
/ 20 апреля 2011
git diff origin/master..master
2 голосов
/ 20 апреля 2011

для всего git diff HEAD origin / "nameofyourbranch"

для конкретного файла git diff HEAD: "filename" origin / "nameofbranch": "filename"

...