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

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

 Raif26 янв. 2015 г., 15:49
Они не мои сотрудники, они мои коллеги, и это не они в особенности, а люди в целом. Но да, перечитывание этого поста кажется немного агро. :)
 Scott Wright31 мая 2016 г., 18:11
Можешь ли ты использовать github или bitbucket, gitlab? Есть инструменты, чтобы справиться именно с этой ситуацией. Разработчик делает пулл-запрос. Вы получите запрос и получите доступ к очень хорошему интерфейсу, который покажет вам все изменения, внесенные в файл ea, ch. Вы можете даже комментировать, запрашивать изменения и т. Д. Когда изменения будут хорошими, вы можете принять запрос, который объединит изменения в запрашиваемую ветвь (обычно разрабатывается). Это лучший способ справиться с этой ситуацией.
 Matt Ball17 мая 2012 г., 20:24

Ответы на вопрос(13)

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

 Sild17 окт. 2016 г., 13:03
Что именно я искал.
 Derek S06 мар. 2019 г., 23:26
От 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.
Решение Вопроса

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

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

 twalberg17 мая 2012 г., 21:30
Ты тоже можешь это сделать. Это найдет точку, где<notMainDev> а также<MY_CURRENT_CO_BRANCH> @ совсем недавно был общий предок, и сравните<notMainDev> тому предку. Тем не менее, вам нужно будет указать текущее название вашей ветки какgit merge-base ожидает два аргумента - ярлыка нет, по крайней мере, в текущей версии.
 Raif17 мая 2012 г., 21:54
хорошо! Я понял. Предоставлено моим коллегой, как его зовут. 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}')
 Raif17 мая 2012 г., 21:22
Хммм, ну, я думаю, что я хотел бы сказать, что я хотел бы сделать git diff - name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>), где MY_CURRENT_CO_BRANCH, конечно, будет моим текущим извлеченным ветк
 twalberg17 мая 2012 г., 21:12
git diff --name-only <some-other-branch> покажет вам, какие файлы отличаются между вашей текущей веткой и<some-other-branch>. Так что это по сути одна и та же команда, но учтите, что вы можете использовать ее, чтобы найти файлы, отличающиеся междулюбо две ветви, даже если они не связаны между собой. Полезно это сравнение или нет, зависит от топологии ваших веток ... Также, обратите внимание<some-other-branch> действительно может быть любым коммитом или чем-то, что разрешается в один (теги и т. д.).
 Raif17 мая 2012 г., 21:07
ah! это весело, теперь как насчет того, чтобы я хотел сказать, что <notMainDev> будет текущей веткой, в которой я нахожусь. что не надо это указывать?

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

 James Skemp08 нояб. 2018 г., 17:30
Похоже, часть существующего ответа, Stackoverflow.com / а / 41486181/11912

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

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

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

 Marco Ponti17 мая 2012 г., 21:20
Да, это правда @twalberg, он бы показал эти изменения, если ветви расходятся. Я предполагал, чтоnotMainDev будет постоянно обновляться с коммитами mainDev ... Я обычно нахожу полезным также увидеть и эти различия.
 TheZenker13 апр. 2017 г., 20:40
ты не можешь просто указать - только для прав, чтобы показывать только те файлы, которые были изменены с правой стороны?
 twalberg17 мая 2012 г., 20:56
Я верю, что это также покажет вещи, которые изменились на<mainDev> поскольку ветви разошлись. Вы можете использоватьgit diff --name-only <sha-of-branch-point> вместо этого или посмотрите альтернативный ответ, который я разместил, чтобы избежать проверки.
 Raif17 мая 2012 г., 20:30
вау быстро и тоже самое. Спасибо. Кстати, я люблю мерзавца. это всегда быстро и точно
 fc9.3001 февр. 2019 г., 16:09
ты получаешь<sha-of-branch-point> сgit rev-parse <branch-name>
git show --stat origin/branch_name

которые были добавлены или изменены в этой ветви.

 davidtbernal20 апр. 2016 г., 01:26
Это неправильно, это показывает только файлы, измененные в коммите head этой ветви, а не всю ветку.

но я не хотел постоянно вводить название текущей ветви. Так что я использую это:

git diff --name-only $(git merge-base master HEAD)
 Yep_It's_Me13 дек. 2018 г., 03:33
оманда @Your будет работать точно так же, если у master нет новых коммитов с момента создания вашей ветки. Я думаю, что моя команда будет эквивалентнаgit diff master.. --name-only (обратите внимание, что вместо 3) есть только 2 точки. Чтобы понять, что означают точки, смотрите этот ответ
 hungerstar12 дек. 2018 г., 23:56
Ваше решение работает для меня, и я получаю список файлов, которые я ожидаю увидеть. Я новичок в Git и использовалgit diff master... --name-only при запуске на целевой ветке и получить тот же результат. Не могли бы вы высказать свое мнение о том, что хорошо, а что плохо между вашим ответом и командой, которую я предоставил?
 hungerstar13 дек. 2018 г., 17:19
Потрясающе! Спасибо за быстрый ответ и понимание. Очень признателен

Я использую 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

Изумлено, что это не было сказано до сих пор!

git diff master...branch

Так увидеть изменения только наbranch

Чтобы проверить текущее использование ветки

git diff master...

Спасибо jqr

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

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

так база слияния (самая последняя общая фиксация между ветвями) и подсказка ветки

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

 exussum11 июн. 2017 г., 15:49
Добавлено в ответ спасибо
 helvete23 нояб. 2017 г., 17:44
Это самый правильный ответ imho. + 1
 Chris Rutledge10 дек. 2018 г., 17:31
Пока это показывает, что изменилось, оно показывает ВСЕ изменения, а не сводку измененных файлов ... что и привело меня к этой странице в первую очередь:)
 jqr11 июн. 2017 г., 15:43
Неявная голова для более простой команды:git diff master...
 exussum10 дек. 2018 г., 17:42
Затем добавьте флаг --name-only к этому. или --short-stat

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

Мне пришлось использовать эту команду вместо этого:

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

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

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

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

 RickMeasham08 дек. 2016 г., 01:20
Это, кажется, самый простой ответ, так как он не требует дополнительной информации. Вывод выглядит правильно, и его легче запомнить, чем принятый ответ!
 Derek S06 мар. 2019 г., 23:31
От 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.
 nealmcb27 июл. 2017 г., 14:14
Спасибо, это интересно, более многословно. Он обеспечивает вывод каждого коммита в обратном порядке. git-whatoted - показывать логи с разницей, которую вносит каждый коммит Git-scm.com / документы / ГИТ-WhatChanged

А если бы все было так просто?

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)"

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

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

что имели @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

но будет работать в 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)"

Ваш ответ на вопрос