Есть ли способ увидеть, какие файлы изменились в ветке?
Есть ли способ увидеть, какие файлы изменились в ветке?
Ответы:
Альтернатива ответу @Marco Ponti и отказ от оформления заказа:
git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
Если ваша конкретная оболочка не понимает конструкцию $ (), используйте взамен обратные галочки.
git diff --name-only <some-other-branch>
покажет вам, какие файлы отличаются между вашей текущей веткой и <some-other-branch>
. Так что это по сути одна и та же команда, но учтите, что вы можете использовать ее, чтобы найти файлы, которые отличаются между любыми двумя ветвями, даже если они не связаны удаленно. Является ли это сравнение полезным или нет, зависит от топологии ваших веток ... Кроме того, note <some-other-branch>
действительно может быть любым коммитом или чем-то, что преобразуется в один (теги и т. Д.).
<notMainDev>
и <MY_CURRENT_CO_BRANCH>
совсем недавно был общий предок, и сравнить <notMainDev>
с этим предком. Вы должны будете указать свое текущее имя ветки, хотя, как и git merge-base
ожидалось, два аргумента - ярлыка нет, по крайней мере, в текущей версии.
git branch | grep '\*' | awk '{print $2}'
, который получит фиксацию для ветви между <notMainDev> и моей текущей веткой. Затем я могу сделать git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}'
)
Все, что вам нужно сделать, это следующее:
git checkout <notMainDev>
git diff --name-only <mainDev>
Это покажет вам только имена файлов, которые отличаются между двумя ветвями.
<mainDev>
с тех пор, как разошлись ветви. Вы можете использовать git diff --name-only <sha-of-branch-point>
вместо этого, или увидеть альтернативный ответ, который я опубликовал, чтобы избежать проверки.
notMainDev
они будут обновляться с коммитами mainDev ... Обычно я нахожу полезным также увидеть и эти различия.
<sha-of-branch-point>
сgit rev-parse <branch-name>
поражен это не было сказано до сих пор!
git diff master...branch
Так что смотрите изменения только на branch
Для проверки текущей ветки используйте
git diff master...
Благодаря JQR
Это короткая рука для
git diff $(git merge-base master branch) branch
поэтому база слияния (самый последний общий коммит между ветвями) и кончик ветки
Также использование origin / master вместо просто master поможет в случае, если ваш локальный мастер датирован
git diff --name-only master..
если вы просто хотите имена файлов, которые отличаются между двумя ветвями.
Я не могу поверить, что есть так много способов сделать это. Я использую whatzed, как кто-то опубликовал ранее, только со следующими аргументами:
git whatchanged --name-only --pretty="" origin..HEAD
Это просто список имен файлов, и только те, которые изменились в текущей ветви.
Мне очень понравился ответ @ twalberg, но я не хотел постоянно вводить название текущей ветви. Итак, я использую это:
git diff --name-only $(git merge-base master HEAD)
git diff master... --name-only
при запуске на целевой ветке и получаю тот же результат. Не могли бы вы высказать свое мнение о том, что хорошо, а что плохо между вашим ответом и командой, которую я предоставил?
git diff master.. --name-only
(обратите внимание, что есть только 2 точки вместо 3). Чтобы понять, что означают точки, посмотрите этот ответ
git diff --name-only master...branch-name
с которым мы хотим сравнить.
Что если это может быть так просто?
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)"
Эти предположения будут работать для большинства людей в большинстве ситуаций, но вы должны знать, что вы делаете их.
Кроме того, вы должны использовать оболочку, которая поддерживает $()
. Весьма вероятно, что ваша оболочка это поддерживает .
git show --stat origin/branch_name
Это даст вам список файлов, которые были добавлены или изменены в этой ветви.
Почему-то никто не упомянул 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)
Принятый ответ - git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)
очень близок, но я заметил, что он получил неправильный статус для удалений. Я добавил файл в ветку, и все же эта команда (используя --name-status
) дала файлу статус «А», который я удалил, и файл «D».
Я должен был использовать эту команду вместо:
git diff --name-only $(git merge-base <notMainDev> <mainDev>)
Следующий пакетный файл основан на ответе 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)"