Получить все файлы, которые были изменены в ветке git


209

Есть ли способ увидеть, какие файлы изменились в ветке?



2
Они не мои сотрудники, они мои коллеги, и это не они в частности, а люди в целом. Но да, перечитывание этого поста кажется немного агро. :)
Раиф

3
Вы можете использовать github или bitbucket, gitlab? Есть инструменты, чтобы справиться именно с этой ситуацией. Разработчик делает пулл-запрос. Вы получите запрос, и у вас будет доступ к очень хорошему интерфейсу, который покажет вам разницу всех изменений, внесенных в каждый файл. Вы можете даже комментировать, запрашивать изменения и т. Д. Когда изменения будут хорошими, вы можете принять запрос, который объединит изменения в запрошенную ветку (обычно разрабатывается). Это лучший способ справиться с этой ситуацией.
Скотт Райт

Ответы:


168

Альтернатива ответу @Marco Ponti и отказ от оформления заказа:

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

Если ваша конкретная оболочка не понимает конструкцию $ (), используйте взамен обратные галочки.


1
ах! это весело, теперь как насчет того, чтобы я хотел сказать, что <notMainDev> будет текущей веткой, в которой я нахожусь. что не надо это указывать?
Раиф

29
git diff --name-only <some-other-branch>покажет вам, какие файлы отличаются между вашей текущей веткой и <some-other-branch>. Так что это по сути одна и та же команда, но учтите, что вы можете использовать ее, чтобы найти файлы, которые отличаются между любыми двумя ветвями, даже если они не связаны удаленно. Является ли это сравнение полезным или нет, зависит от топологии ваших веток ... Кроме того, note <some-other-branch>действительно может быть любым коммитом или чем-то, что преобразуется в один (теги и т. Д.).
Твальберг

хммм, ну, я думаю, что я имею в виду, что я хотел бы сделать git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>), где MY_CURRENT_CO_BRANCH, конечно, будет моей текущей проверенной веткой
Раиф

Вы тоже можете это сделать. Это позволит найти точку, где <notMainDev>и <MY_CURRENT_CO_BRANCH>совсем недавно был общий предок, и сравнить <notMainDev>с этим предком. Вы должны будете указать свое текущее имя ветки, хотя, как и git merge-baseожидалось, два аргумента - ярлыка нет, по крайней мере, в текущей версии.
Твальберг

1
хорошо! Я понял. Предоставлено моим коллегой, как его зовут. git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}' , который получит фиксацию для ветви между <notMainDev> и моей текущей веткой. Затем я могу сделать git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif

147

Все, что вам нужно сделать, это следующее:

git checkout <notMainDev>
git diff --name-only <mainDev>

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


вау быстро и тоже главное. Спасибо. Кстати, я люблю мерзавца. это всегда быстро и точно
Раиф

23
Я верю, что это также покажет вещи, которые изменились <mainDev>с тех пор, как разошлись ветви. Вы можете использовать git diff --name-only <sha-of-branch-point>вместо этого, или увидеть альтернативный ответ, который я опубликовал, чтобы избежать проверки.
Твальберг

Да, это правда @twalberg, он показал бы эти изменения, если ветви расходятся. Я предполагал, что notMainDevони будут обновляться с коммитами mainDev ... Обычно я нахожу полезным также увидеть и эти различия.
Марко Понти

Вы не можете просто указать - right-only, чтобы показывать только файлы, которые были изменены с правой стороны?
TheZenker

Вы получаете <sha-of-branch-point>сgit rev-parse <branch-name>
fc9.30

69

поражен это не было сказано до сих пор!

git diff master...branch

Так что смотрите изменения только на branch

Для проверки текущей ветки используйте

git diff master...

Благодаря JQR

Это короткая рука для

git diff $(git merge-base master branch) branch

поэтому база слияния (самый последний общий коммит между ветвями) и кончик ветки

Также использование origin / master вместо просто master поможет в случае, если ваш локальный мастер датирован


4
Хотя это показывает, что изменилось, оно показывает ВСЕ изменения, а не сводку измененных файлов ... что и привело меня к этой странице в первую очередь :)
Крис Ратледж,

1
затем добавьте флаг --name-only к этому. или --short-stat
exussum

2
git diff --name-only master..если вы просто хотите имена файлов, которые отличаются между двумя ветвями.
Адам

1
Это не будет работать должным образом, если ваш мастер имел коммиты после того, как вы создали свою боковую ветвь.
justlizz

2
@simplylizz, да, это так. это именно то, что это решает
exussum

45

Я не могу поверить, что есть так много способов сделать это. Я использую whatzed, как кто-то опубликовал ранее, только со следующими аргументами:

git whatchanged --name-only --pretty="" origin..HEAD

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


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

1
Спасибо, это интересно, более многословно. Он обеспечивает вывод для каждого коммита в обратном порядке. ГИТ-WhatChanged - Показать журналы с разностью каждой фиксации вводит git-scm.com/docs/git-whatchanged
nealmcb

Из Git Docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Дерек С

21

Мне очень понравился ответ @ twalberg, но я не хотел постоянно вводить название текущей ветви. Итак, я использую это:

git diff --name-only $(git merge-base master HEAD)

1
Ваше решение работает для меня, и я получаю список файлов, которые я ожидаю увидеть. Я новичок в Git и использую его git diff master... --name-onlyпри запуске на целевой ветке и получаю тот же результат. Не могли бы вы высказать свое мнение о том, что хорошо, а что плохо между вашим ответом и командой, которую я предоставил?
Hungerstar

Ваша команда будет работать точно так же, если мастер не имеет новых коммитов с момента создания вашей ветки. Я думаю, что моя команда будет эквивалентна git diff master.. --name-only(обратите внимание, что есть только 2 точки вместо 3). Чтобы понять, что означают точки, посмотрите этот ответ
Yep_It's_Me

Потрясающие! Спасибо за быстрый ответ и понимание. Очень признателен.
Hungerstar

12

git whatchanged кажется хорошей альтернативой.


1
Что было именно то, что я искал.
Sild

Из Git Docs :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
Дерек С

9
git diff --name-only master...branch-name

с которым мы хотим сравнить.


Похоже, частично существующий ответ, stackoverflow.com/a/41486181/11912
Джеймс Скемп

Этот вариант сравнивает HEAD мастера с текущей веткой. Принятый ответ сравнивает состояние мастера в точке, которую вы разветвили . Любой может иметь ответ, который вы ищете, в зависимости от того, что вы хотите знать.
Марк Стосберг

8

Что если это может быть так просто?

git changed

Если вы хотите предположить, что основная ветвь называется «master», и что вы создаете другие ветки из master, то вы можете добавить этот псевдоним в свой ~/.gitconfigфайл, чтобы сделать это проще:

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

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

Кроме того, вы должны использовать оболочку, которая поддерживает $(). Весьма вероятно, что ваша оболочка это поддерживает .


3
git show --stat origin/branch_name

Это даст вам список файлов, которые были добавлены или изменены в этой ветви.


2
Это неверно, это показывает только файлы, измененные в заголовочном коммите этой ветви, а не всю ветку.
Давидтбернал

2

Почему-то никто не упомянул git-tree. См. Https://stackoverflow.com/a/424142/1657819

git-treeпредпочтительнее, потому что это сантехническая команда; должен быть программным (и, по-видимому, быстрее)

(при условии, что базовая ветвь есть master)

git diff-tree --no-commit-id --name-only -r master..branch-name

Однако это покажет вам все файлы, которые были затронуты в ветке. Если вы хотите видеть только явно измененные файлы, вы можете использовать --diff-filter:

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

Также можно использовать --name-statusвместо того, --name-onlyчтобы видеть состояние файлов ( A/ M/ Dи т. Д.)


Это было как раз то, что мне было нужно для пометки измененных файлов, исключая те, которые были удалены. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

Принятый ответ - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)очень близок, но я заметил, что он получил неправильный статус для удалений. Я добавил файл в ветку, и все же эта команда (используя --name-status) дала файлу статус «А», который я удалил, и файл «D».

Я должен был использовать эту команду вместо:

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

Расширяя то, что имели @twalberg и @iconoclast, если вы используете cmd по любой причине, вы можете использовать:

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

Следующий пакетный файл основан на ответе twalberg, но будет работать в Windows:

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

Выше предполагается, что основной ветвью является origin / master и что git bash был включен, когда Git был установлен (и его местоположение находится в среде пути). Мне действительно нужно было показать фактические различия, используя настроенный инструмент сравнения (kdiff3), поэтому заменил следующую команду bash выше:

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

Я использую grep, поэтому получаю только строки с diff --git, которые представляют собой путь к файлам:

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.