Отримайте всі файли, які були змінені у гітці git


209

Чи є спосіб побачити, які файли змінилися у гілці?



2
Вони не мої службовці, вони мої колеги, і це не так їх, як люди взагалі. Але так, перечитавши цю публікацію, це виглядає трохи агро. :)
Райф

3
Чи можете ви використовувати github або bitbucket, gitlab? Існують інструменти для управління саме цією ситуацією. Розробник робить запит на тягу. Ви отримаєте запит, і у вас буде доступ до дуже хорошого інтерфейсу, який покаже вам різні зміни, внесені до кожного файлу. Ви навіть можете коментувати, просити зміни тощо. Коли зміни хороші, ви можете прийняти запит, який об'єднає зміни в запитувану гілку (як правило, розвивається). Це найкращий спосіб вирішити цю ситуацію.
Скотт Райт

Відповіді:


167

Альтернатива відповіді від @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>. Отже, це по суті та сама команда, але зауважте, що ви можете використовувати це для пошуку файлів, які відрізняються між будь-якими двома гілками, навіть якщо вони не пов'язані віддалено. Чи корисне це порівняння чи ні, залежить від топології ваших гілок ... Крім того, зауважте, що <some-other-branch>насправді може бути взагалі будь-яка комісія або що-небудь, що відповідає одному (теги тощо).
twalberg

hmmm, ну, я думаю, що я маю на увазі, що я хотів би зробити git diff - namename only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>), де MY_CURRENT_CO_BRANCH, звичайно, буде моєю поточною перевіреною галуззю
Райф

Ви також можете це зробити. Це знайде момент, коли <notMainDev>і <MY_CURRENT_CO_BRANCH>останнім часом мав спільного предка, і порівняти <notMainDev>з цим предком. Вам потрібно буде вказати своє поточне ім’я філії, хоча, як git merge-baseочікується, два аргументи - принаймні в поточній версії немає ярлика.
twalberg

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

147

Все, що вам потрібно зробити, це:

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

Це покаже вам лише імена файлів, які відрізняються між двома гілками.


вау швидко і занадто суть. спасибі. btw Я люблю git. це завжди швидко і до речі
Райф

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

Так, це правда @twalberg, це показало б ці зміни, якщо гілки будуть розбіжні. Я припускав, що notMainDevце буде в курсі основних завдань mainDev ... Мені зазвичай здається корисним бачити ці відмінності.
Марко Понті

Ви не можете просто вказати - лише для показу файлів, які були змінені праворуч?
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
Хоча це показує, що змінилося, воно показує ВСІ зміни, а не зведення змінених файлів ... саме це призводить мене в першу чергу до цієї сторінки :)
Chris Rutledge

1
потім додайте до цього прапор - onlyname або --ort-stat
exussum

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

1
Це не спрацює належним чином, якщо ваш господар розпоряджався після створення вашої бічної гілки.
simplelizz

2
@simplylizz так, це так. саме це і вирішує
exussum

45

Я не можу повірити, що існує так багато способів зробити це. Я використовую те, що змінилося, як хтось публікував раніше, лише з такими аргументами:

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

Тут просто перелічені імена файлів, і лише ті, що змінилися на поточній гілці.


3
Тут видається найпростішою відповіддю, оскільки вона не потребує додаткової інформації. Вихідний результат виглядає правильним і запам'ятати його простіше, ніж прийняту відповідь!
RickMeasham

1
Дякую, це цікаво, багатослівніше. Він забезпечує вихід для кожного коміту, у зворотному порядку. git-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.
Дерек S

21

Мені дуже сподобалась відповідь @ twalberg, але мені не хотілося весь час вводити поточну назву гілки. Тому я використовую це:

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

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

Ваша команда буде працювати точно так само, якщо у майстра немає нових комітетів з моменту створення вашої філії. Я думаю, що моя команда буде еквівалентна git diff master.. --name-only(зауважте, що всього 2 точки замість 3). Щоб зрозуміти, що означають точки, дивіться цю відповідь
Yep_It's_Me

Дивовижно! Дякуємо за швидку відповідь та розуміння. Цінується.
голод

12

git whatchanged здається, хороша альтернатива.


1
Що саме було, що я шукав.
Тихий

З 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.
Дерек S

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
Це неправильно, це показує лише файли, змінені в головному комітеті цієї гілки, а не всієї гілки.
davidtbernal

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

Вищенаведене передбачає, що головна гілка є початком / головним і що git bash був включений під час встановлення Git (і його розташування знаходиться в середовищі шляху). Мені фактично потрібно було показати фактичні відмінності за допомогою налаштованого інструменту diff (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.