2012-05-17 4 views
92

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

+2

возможно дубликат [Как я могу узнать, какие файлы были изменены в отрасли?] (HTTP: // StackOverflow .com/вопросы/1749323/как-могу-я-найти-затраченные какую-файлы, которые были-модифицированными -in-a-branch) –

+2

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

+3

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

ответ

86

Альтернативой ответ по @Marco Понти, и избегая кассе:

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

Если ваша конкретная оболочка не понимает $() построить, использовать обратно-клещи вместо этого.

+0

ах! это хорошая забава, теперь как насчет того, хочу ли я сказать быть текущей веткой, в которой я включен. что не нужно указывать? – Raif

+11

'git diff --name-only ' покажет вам, какие файлы отличаются между вашей текущей ветвью и ''. Таким образом, это по сути та же команда, но обратите внимание, что вы можете использовать это, чтобы найти файлы, которые отличаются между * любыми * двумя ветвями, даже если они не связаны дистанционно. Является ли это сравнение полезным или нет, зависит от топологии ваших филиалов ... Кроме того, обратите внимание на '' действительно может быть любая фиксация вообще или что-либо, что разрешает одно (теги и т. Д.). – twalberg

+0

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

80

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

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

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

+0

Вау быстро и тоже точка. Спасибо. Кстати, я люблю git. это всегда быстро и до – Raif

+13

Я считаю, что также будет отображаться материал, который изменился на '', так как ветви расходятся. Вместо этого вы можете использовать 'git diff -name-only ' или посмотреть альтернативный ответ, который я опубликовал, чтобы избежать проверки. – twalberg

+0

Да, это правда @twalberg, он будет показывать эти изменения, если ветви расходятся. Я предполагал, что «notMainDev» будет постоянно обновляться с фиксацией mainDev ... Обычно я считаю полезным также видеть эти различия. –

5
git show --stat origin/branch_name 

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

+1

Это неправильно, это показывает только файлы, измененные в головной фиксации этой ветви, а не всей ветви. – notJim

8

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

git changed 

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

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

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

Кроме того, вы должны использовать оболочку, которая поддерживает $(). It's very likely that your shell supports this.

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 
8

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

+1

Что именно я искал. – Sild

20

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

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

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

+1

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

+0

Спасибо, это интересно, более многословно. Он обеспечивает вывод для каждого фиксации в обратном порядке. _git-whatchanged - Показать журналы с разницей каждая фиксация вводит_ https://git-scm.com/docs/git-whatchanged – nealmcb

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 

выше предполагает, что основная отрасль происхождение/мастер и что мерзавец Баш был включен, когда был установлен Git (и его местоположение находится в среде пути). Я на самом деле нужен, чтобы показать реальные различия с помощью инструмента сконфигурирован Diff (KDiff3) так подставляться следующей командой баша выше:

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

мне очень понравился @ twalberg Ответит, но я не хочу, чтобы ввести текущую ветку все время. Поэтому я использую это:

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

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

git diff master...branch 

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

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

git diff master... 

Благодаря JQR

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

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

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

Кроме того, используя происхождения/мастер, а не просто мастер поможет в случае, если ваш местный мастер от

+4

Неявный заголовок для более простой команды: 'git diff master ...' – jqr

+0

Добавлен ответ спасибо – exussum

+0

Это это самый правильный ответ imho. +1 – helvete

0

Я использую Grep поэтому я получаю только линии с дифф --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 
Смежные вопросы