Git: сравните все локальные коммиты с версией удаленного репо

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

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

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


person Ian Dallas    schedule 20.04.2011    source источник
comment
Если вам нужно сделать это в GitHub - отметьте это   -  person Pankaj Singhal    schedule 06.10.2020


Ответы (5)


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

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

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

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

person manojlds    schedule 20.04.2011
comment
Спасибо, 3 отлично сработало (в итоге я использовал git difftool вместо git diff). 1 и 2 показали различия, которые не были моими в удаленном репо, поэтому они были не тем, что мне было нужно. - person Ian Dallas; 20.04.2011
comment
origin/master...origin/master это пустой набор? Я думаю, вы как-то перепутали синтаксис при редактировании. Вы имели в виду origin/master...master вместо этого? - person knittl; 23.09.2011
comment
эта команда открывает vi/vim? Я так смущен тем, что происходит после команды, в какой среде я нахожусь ?? - person Alexander Mills; 02.06.2015
comment
Должна ли основная ветка быть веткой, которую в настоящее время извлекают? - person user3731622; 09.12.2016

Самый готовый ответ

 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

СОВЕТ ПРОФЕССИОНАЛА 1. Используйте 'git config alias.lr log --long-option1 --long-option2' для удобства

СОВЕТ ПРОФЕССИОНАЛА 2. Используйте 'git config color.ui auto' для мгновенного облегчения зрения

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

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

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

Слияния

Если вы хотите четко видеть слияния, включите --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 --украсить

Сценарии

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

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

person sehe    schedule 20.04.2011

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

git diff origin

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

person lambshaanxy    schedule 22.08.2011

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

git diff origin/master master

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

person knittl    schedule 20.04.2011

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

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

person Wissam Youssef    schedule 20.04.2011