Git: Сравнить все локальные компиляции с удаленной версией репо
Я немного новичок в Git, и то, что я пытаюсь сделать, похоже, должно быть возможно. В основном я работал с клоном репо и сделал немало локальных коммитов. Есть ли способ увидеть разницу между суммой всех моих изменений и исходной версией репо? Я бы предположил, что это будет возможно, потому что Git будет по существу делать это, когда я делаю push
.
Вот пример того, что я пытаюсь сделать: в gitk я увижу что-то вроде этого:
* - [mybranch] Добавлено "42" до конца answer.txt(local commit)
* - Добавлен "Hello World" до конца my.txt(локальный коммит)
* - Добавлена 'С#/. NET' в начало my.txt(локальная фиксация)
* - < [RemoteRepo] > (исходное репо, с которого я клонировал)
Как я могу просмотреть разницу в сумме всех моих изменений с my.txt
и answers.txt
по сравнению с исходной версией, которую я проверил из RemoteRepo
?
Ответы
Ответ 1
Существует три способа (два других из других ответов, приведенных здесь)
1) git diff origin/master master
2) git diff origin/master..master
3) git diff origin/master...master
Первый и второй одинаковые и показывают изменения между концами ведущего и удаленного мастера.
Третий показывает изменения, произошедшие с мастером с последнего нажатия ветки, и я думаю, что это наиболее подходящий вариант, который вы ищете
Ответ 2
Самый готовый ответ
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 СОВЕТ 1: Используйте < git config alias.lr log --long-option1 --long-option2
для удобного использования
PRO СОВЕТ 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
Все (другие) недостижимые коммиты...
Примечания
- в моем рабочем процессе эти constitue rebased/amended коммиты и только сброшенные штампы
- Кроме того, генерация этих данных займет некоторое время в зависимости от размера графика истории.
-
это будет включать в себя любые сброшенные штампы, но не текущие stashes
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
, и вы получите только хэши (и еще более script -прочность)
[1] См. также мой предыдущий ответ о том, как переносить задержки между репозициями:
Ответ 3
Простейшая и, конечно же, самая легкая для запоминания команда, которая (как правило) делает то, что вы хотите:
git diff origin
Это показывает разницу между тем, что вы изначально вытащили (источник) и текущую ветку, на которой вы работаете, по умолчанию - master
.
Ответ 4
разницу можно просмотреть с помощью git diff A B
, он будет сравнивать код в с B:
git diff origin/master master
origin/master
- это состояние удаленной главной ветки, когда вы последний раз извлекали (или клонировали) из нее, master
- это локальное состояние кода - если вы не переключили ветки при локальной работе.
Ответ 5
для всего
git diff HEAD origin/ "nameofyourbranch"
для конкретного файла
git diff HEAD: "filename" origin/ "nameofbranch": "filename"
Ответ 6
git diff origin/master..master