Они не мои сотрудники, они мои коллеги, и это не они в частности, а люди в целом. Но да, перечитывание этого поста кажется немного агро. :)
Раиф
3
Вы можете использовать github или bitbucket, gitlab? Есть инструменты, чтобы справиться именно с этой ситуацией. Разработчик делает пулл-запрос. Вы получите запрос, и у вас будет доступ к очень хорошему интерфейсу, который покажет вам разницу всех изменений, внесенных в каждый файл. Вы можете даже комментировать, запрашивать изменения и т. Д. Когда изменения будут хорошими, вы можете принять запрос, который объединит изменения в запрошенную ветку (обычно разрабатывается). Это лучший способ справиться с этой ситуацией.
Скотт Райт
Ответы:
168
Альтернатива ответу @Marco Ponti и отказ от оформления заказа:
ах! это весело, теперь как насчет того, чтобы я хотел сказать, что <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}')
вау быстро и тоже главное. Спасибо. Кстати, я люблю мерзавца. это всегда быстро и точно
Раиф
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 поможет в случае, если ваш локальный мастер датирован
Хотя это показывает, что изменилось, оно показывает ВСЕ изменения, а не сводку измененных файлов ... что и привело меня к этой странице в первую очередь :)
Крис Ратледж,
1
затем добавьте флаг --name-only к этому. или --short-stat
exussum
2
git diff --name-only master..если вы просто хотите имена файлов, которые отличаются между двумя ветвями.
Адам
1
Это не будет работать должным образом, если ваш мастер имел коммиты после того, как вы создали свою боковую ветвь.
justlizz
2
@simplylizz, да, это так. это именно то, что это решает
exussum
45
Я не могу поверить, что есть так много способов сделать это. Я использую whatzed, как кто-то опубликовал ранее, только со следующими аргументами:
Это кажется самым простым ответом здесь, поскольку он не требует дополнительной информации. Вывод выглядит правильно, и его легче запомнить, чем принятый ответ!
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 и использую его git diff master... --name-onlyпри запуске на целевой ветке и получаю тот же результат. Не могли бы вы высказать свое мнение о том, что хорошо, а что плохо между вашим ответом и командой, которую я предоставил?
Hungerstar
Ваша команда будет работать точно так же, если мастер не имеет новых коммитов с момента создания вашей ветки. Я думаю, что моя команда будет эквивалентна git diff master.. --name-only(обратите внимание, что есть только 2 точки вместо 3). Чтобы понять, что означают точки, посмотрите этот ответ
Yep_It's_Me
Потрясающие! Спасибо за быстрый ответ и понимание. Очень признателен.
Из 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.
Этот вариант сравнивает HEAD мастера с текущей веткой. Принятый ответ сравнивает состояние мастера в точке, которую вы разветвили . Любой может иметь ответ, который вы ищете, в зависимости от того, что вы хотите знать.
Марк Стосберг
8
Что если это может быть так просто?
git changed
Если вы хотите предположить, что основная ветвь называется «master», и что вы создаете другие ветки из master, то вы можете добавить этот псевдоним в свой ~/.gitconfigфайл, чтобы сделать это проще:
Однако это покажет вам все файлы, которые были затронуты в ветке. Если вы хотите видеть только явно измененные файлы, вы можете использовать --diff-filter:
Это было как раз то, что мне было нужно для пометки измененных файлов, исключая те, которые были удалены. 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».
Следующий пакетный файл основан на ответе 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 выше:
Ответы:
Альтернатива ответу @Marco Ponti и отказ от оформления заказа:
Если ваша конкретная оболочка не понимает конструкцию $ (), используйте взамен обратные галочки.
источник
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}'
)Все, что вам нужно сделать, это следующее:
Это покажет вам только имена файлов, которые отличаются между двумя ветвями.
источник
<mainDev>
с тех пор, как разошлись ветви. Вы можете использоватьgit diff --name-only <sha-of-branch-point>
вместо этого, или увидеть альтернативный ответ, который я опубликовал, чтобы избежать проверки.notMainDev
они будут обновляться с коммитами mainDev ... Обычно я нахожу полезным также увидеть и эти различия.<sha-of-branch-point>
сgit rev-parse <branch-name>
поражен это не было сказано до сих пор!
Так что смотрите изменения только на
branch
Для проверки текущей ветки используйте
Благодаря JQR
Это короткая рука для
поэтому база слияния (самый последний общий коммит между ветвями) и кончик ветки
Также использование origin / master вместо просто master поможет в случае, если ваш локальный мастер датирован
источник
git diff --name-only master..
если вы просто хотите имена файлов, которые отличаются между двумя ветвями.Я не могу поверить, что есть так много способов сделать это. Я использую whatzed, как кто-то опубликовал ранее, только со следующими аргументами:
Это просто список имен файлов, и только те, которые изменились в текущей ветви.
источник
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.
Мне очень понравился ответ @ twalberg, но я не хотел постоянно вводить название текущей ветви. Итак, я использую это:
источник
git diff master... --name-only
при запуске на целевой ветке и получаю тот же результат. Не могли бы вы высказать свое мнение о том, что хорошо, а что плохо между вашим ответом и командой, которую я предоставил?git diff master.. --name-only
(обратите внимание, что есть только 2 точки вместо 3). Чтобы понять, что означают точки, посмотрите этот ответgit whatchanged
кажется хорошей альтернативой.источник
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.
с которым мы хотим сравнить.
источник
Что если это может быть так просто?
Если вы хотите предположить, что основная ветвь называется «master», и что вы создаете другие ветки из master, то вы можете добавить этот псевдоним в свой
~/.gitconfig
файл, чтобы сделать это проще:Эти предположения будут работать для большинства людей в большинстве ситуаций, но вы должны знать, что вы делаете их.
Кроме того, вы должны использовать оболочку, которая поддерживает
$()
. Весьма вероятно, что ваша оболочка это поддерживает .источник
Это даст вам список файлов, которые были добавлены или изменены в этой ветви.
источник
Почему-то никто не упомянул
git-tree
. См. Https://stackoverflow.com/a/424142/1657819git-tree
предпочтительнее, потому что это сантехническая команда; должен быть программным (и, по-видимому, быстрее)(при условии, что базовая ветвь есть
master
)Однако это покажет вам все файлы, которые были затронуты в ветке. Если вы хотите видеть только явно измененные файлы, вы можете использовать
--diff-filter
:Также можно использовать
--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».Я должен был использовать эту команду вместо:
источник
Расширяя то, что имели @twalberg и @iconoclast, если вы используете cmd по любой причине, вы можете использовать:
источник
Следующий пакетный файл основан на ответе twalberg, но будет работать в Windows:
Выше предполагается, что основной ветвью является origin / master и что git bash был включен, когда Git был установлен (и его местоположение находится в среде пути). Мне действительно нужно было показать фактические различия, используя настроенный инструмент сравнения (kdiff3), поэтому заменил следующую команду bash выше:
источник
Я использую grep, поэтому получаю только строки с diff --git, которые представляют собой путь к файлам:
источник