Показывает, какие файлы были изменены между двумя ревизиями

2105

Я хочу объединить две ветви, которые были разделены на некоторое время и которые хотели узнать, какие файлы были изменены.

Наткнулся на эту ссылку: http://linux.yyz.us/git-howto.html, которая оказалась весьма полезной.

Инструменты для сравнения веток, с которыми я сталкивался:

  • git diff master..branch
  • git log master..branch
  • git shortlog master..branch

Интересно, есть ли что-то вроде "git status master..branch", чтобы видеть только те файлы, которые отличаются между двумя ветвями.

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

  • git diff master..branch | grep "^diff"

Было интересно, если я что-то пропустил ...

johannix
источник
12
Сколько других находит название этого вопроса вводящим в заблуждение? На самом деле речь идет о поиске различий между двумя ветками. Я пришел сюда, чтобы узнать, как увидеть различия в файлах между двумя ревизиями в одной и той же ветке. Или я один такой?
Сандипан Нат
4
@SandeepanNath: с мерзавцем нет никакой разницы. Вы ВСЕГДА обращаетесь к отдельным коммитам.
Сэмюэль О'Мэлли
@ SamuelO'Malley Я новичок в git и рассматриваю, по-видимому, общую стратегию ветвления, в которой все ветви в конечном итоге объединяются с основной ветвью и, в конечном итоге, мастер разворачивается. Теперь, рассматривая событие развертывания, когда производство уже находится на главном, но за наконечником (на одну ревизию, если последний развертывание произошло после последнего слияния с основным), я хотел бы увидеть различия между этими двумя ревизиями, чтобы узнай что будет раскатано. Я не хотел бы смотреть на ветку, которая была объединена в последний раз. Поправь меня, если я ошибаюсь.
Сандипан Нат
2
@SandeepanNath: вместо использования имен веток, вы можете взять ответы ниже и просто указать вместо них идентификаторы коммитов. Или даже ссылаться на коммиты по их именам тегов, если вы создаете теги при развертывании.
Сэмюэль О'Мэлли
1
@SandeepanNath Вы не можете сравнивать 2 ветви, вы должны указать ревизию. Таким образом, сравнение 2 веток - это сравнение 2 ревизий.
Бастьен

Ответы:

2576

Чтобы сравнить текущую ветку с masterветкой:

$ git diff --name-status master

Чтобы сравнить любые две ветви:

$ git diff --name-status firstbranch..yourBranchName

Читайте дальше git diffв официальной документации .

JasonSmith
источник
2
Что означают все индексы с левой стороны (я вижу много букв «М» и «Д»)?
gogogadgetinternet
15
@ user446936 - вы можете увидеть, что означают буквы на странице руководства по статусу git @ kernel.org/pub/software/scm/git/docs/git-status.html - в частности, M == изменено, D == удалено
Джеймс Мэннинг
12
git diff --name-status your_branch...masterвыводит изменения, которые произошли на master, так как your_branch был создан из него
Раду
1
Здесь оператор двойной точки лишний, потому что diffs попарные.
Jub0bs
2
Я получаю неизвестную ревизию или путь не в рабочем дереве.
SuperUberDuper
408

Пытаться

$ git diff --stat --color master..branchName

Это даст вам больше информации о каждом изменении, при этом используя то же количество строк.

Вы также можете перевернуть ветки, чтобы получить еще более четкое представление о разнице, если вы собираетесь объединить другим способом:

$ git diff --stat --color branchName..master
Gerry
источник
77
Если у вас (настоятельно рекомендуется, imho) включен цвет git ( config --global color.ui true), вы можете пропустить --color. (У меня синдром ленивой клавиатуры.)
Art Swri
25
Я с тобой по цвету! Кстати, я хотел сказать git config --global color.ui true- чтобы быть полным.
Art Swri
2
Не работает, выдает ошибки:fatal: ambiguous argument 'master..branchName': unknown revision or path not in the working tree.
Томаш Зато - Восстановить Монику
7
@ TomášZato извините, но вам нужно поменять "branchName" с названием вашей ветви.
Джерри
161

Также имейте в виду, что git имеет дешевое и легкое ветвление. Если я думаю, что слияние может быть проблематичным, я создаю ветку для слияния. Так что, если masterесть изменения, которые я хочу объединить, и baмоя ветвь требует кода от master, я мог бы сделать следующее:

git checkout ba
git checkout -b ba-merge
git merge master
.... review new code and fix conflicts....
git commit
git checkout ba
git merge ba-merge
git branch -d ba-merge
git merge master

Конечным результатом является то, что я должен попробовать объединить одноразовую ветвь перед тем, как прикрутить свою ветку. Если я запутаюсь, я могу просто удалить ba-mergeветку и начать все сначала.

Эрик Андерсон
источник
4
Потрясающие. Я никогда не думал о ветвлении таким образом. Я думаю, что это следует рассматривать как часть "лучших практик" при слиянии.
Эгелев
Когда вы объединяете ba-marge обратно в ba, разве нет возможности снова исправить конфликты?
Josef.B
2
@EricAnderson Правильно, это график. SVN торчит, как жвачка, под партой. Спасибо.
Josef.B
1
Зачем вам делать последний шаг «git merge master», если ba-merge уже имел master
qwebek
Вы могли бы оставить это. Единственная причина, по которой это будет полезно, - это когда новые вещи появляются, masterпока вы работаете над проверкой кода и исправлением конфликтов.
Эрик Андерсон
58

Если кто-то пытается сгенерировать файл diff из двух веток:

git diff master..otherbranch > myDiffFile.diff
Паулино III
источник
2
Это пригодилось особенно с большими ветвями, содержащими много различий.
Вандш
Это полезно, когда разница действительно велика. По умолчанию он не будет отображать все различия в консоли (мне было интересно, почему), в этом случае передача diff в файл - это лучший способ.
rotimi-best
42

Существует также метод на основе графического интерфейса.

Вы можете использовать Gitk .

  1. Запустить:

    $ gitk --all
    
  2. Щелкните правой кнопкой мыши на коммите ветки и выберите « Отметить этот коммит» во всплывающем меню.

  3. Щелкните правой кнопкой мыши на коммит другой ветви и выберите Diff это -> отмечены фиксации или Diff отмеченные фиксации -> это .

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

Янтао Се
источник
3
@ Orwellophile Я загружаю видео, чтобы показать, как это сделать. Я надеюсь, что это поможет вам.
Янтао Се
Вау, только для себя, я чувствую себя особенным. Я добавил его в Delicious.com для дальнейшего использования и дополнительной Google-Foo.
Орвеллофил
Сильно недооцененный ответ. Спасибо!
Кошина
36

Еще один вариант, использующий в этом случае meld:

git difftool -d master otherbranch

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

rsilva4
источник
6
Может потребоваться установить Meld как по умолчанию difftool: мерзавец конфигурации --global diff.tool MELD
bwv549
1
Это мой фаворит, потому что он будет использовать любой настроенный вами difftool.
Иосия
Не поддерживается в OSX. :-(
Майк С.
@MikeS. Пожалуйста, ознакомьтесь с этим ответом stackoverflow.com/a/12815806/151918, он содержит инструкции для OSX. По крайней мере, это работает для меня, надеюсь, это поможет.
rsilva4
Ницца. Но какой -dвариант?
Scotty.NET
29

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

Дэвид Племптон
источник
10
Дэвид, это хорошая мысль, хотя было бы неплохо просто знать, что происходит, до этого ...
johannix
18

И если вы ищете изменения только среди определенных файлов, то:

git diff branch1 branch2 -- myfile1.js myfile2.js

branch1 не является обязательным, и ваша текущая ветвь (ветвь, в которой вы находитесь) будет рассматриваться по умолчанию, если branch1 не указан. например:

git diff master -- controller/index.js
Манна
источник
15

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

Если ваш Upstream мог переместиться, вы должны сделать это:

git fetch
git diff origin/master...

Простое использование git diff master может включать или не включать соответствующие изменения.

Алекс Браун
источник
8

Есть две ветви, скажем,

  • A (Филиал, над которым вы работаете)
  • B (еще одна ветка, с которой вы хотите сравнить)

Находясь в ветке А вы можете набрать

git diff --color B

тогда это даст вам вывод

введите описание изображения здесь

Важный момент по этому поводу

  1. Текст внутри зеленого цвета присутствует внутри ветви A

  2. Текст в красном присутствует в ветви B

selftaught91
источник
8

Здесь есть множество ответов, но я хотел бы добавить кое-что, что я обычно использую. Если вы находитесь в одной из веток, которые вы хотели бы сравнить, я обычно делаю одно из следующего. Ради этого ответа скажем, что мы находимся в нашей вторичной ветке. В зависимости от того, какой вид вам нужен в данный момент, будет зависеть от того, что вы выберете, но большую часть времени я использую второй вариант из двух. Первый вариант может быть удобен, если вы пытаетесь вернуться к исходной копии - в любом случае, оба сделайте свою работу!

Это сравнит master с веткой, в которой мы находимся (которая является вторичной), и исходный код будет добавленными строками, а новый код будет считаться удаленными строками.

git diff ..master

ИЛИ

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

git diff master..
TheCodenator
источник
1

Если вы используете Github / Github Enterprise, вы можете использовать веб-интерфейс, нажав URL-адрес /compareвашего пути к хранилищу, например, https://github.com/http4s/http4s/compare . Вы можете выбрать ветку / коммит / тег, который хотите сравнить: Github Сравнить Скриншот

И diff будет представлен в интерфейсе github по адресу, /compare/{x1}...{x2}где есть x2и x1есть ветка / commit / tag, которую вы хотите сравнить, например: https://github.com/http4s/http4s/compare/release-0.18.x ...мастер

Вы можете увидеть больше в Github Doc .

Вали Диа
источник
0

Для людей, которые ищут решение с графическим интерфейсом, Git Cola имеет очень хороший "Branch Diff Viewer ( Diff -> Branches .. )".

kerner1000
источник
-1
git diff revision_n revision_m

если revision_nи revision_mявляются последовательными коммитами, то выводит так же, как git show revision_m

Йово Скорупан
источник
-1

Вы также можете использовать визуальный diff .

Например, если вы используете Sourcetree , вы можете просто выбрать любые два коммита в представлении журнала .

(Я лично предпочитаю использовать GUI в большинстве случаев для этого, и я публикую это для тех, кто, возможно, не знаком с параметрами GUI.)

сынок
источник
-2

Если вам нравится графический интерфейс и вы используете Windows, вот простой способ.

  1. Скачать WinMerge
  2. Проверьте две ветви в разных папках
  3. Выполните сравнение папок с папками с помощью WinMerge. Вы также можете легко вносить изменения, если вы работаете с одной из веток.
Мариус Матиок
источник
Это не самый простой способ, на самом деле нет необходимости загружать репозитории для различий между ветками.
Стефгосселин
Это действительно не самый простой способ, но это способ с графическим интерфейсом, который часто намного проще, особенно для просмотра различий во всех файлах
Marius Matioc
-3

Вы также можете легко сравнить ветви для измененных файлов, используя, например, TortoiseGit . Просто нажмите Обзор ссылок и выберите ветви, которые вы хотите сравнить.

Например, если вы сравните свою ветку с master, вы получите в результате список файлов, которые будут изменены в master, если вы решите объединить вашу ветку с master .

Помните, что у вас будет другой результат, если вы сравните master с your-branch и your-branch с master .

Петр
источник
1
Вопрос вроде бы о родной утилите git
Владимир Храбан