Получение файлов, зафиксированных в конкретной транзакции с использованием идентификатора фиксации [duplicate]

Так я предпочитаю:

class Klass(object):

    @staticmethod
    def stat_func():
        return 42

    _ANS = stat_func.__func__()

    def method(self):
        return self.__class__.stat_func() + self.__class__._ANS

Я предпочитаю это решение Klass.stat_func из-за принципа DRY . Напоминает мне о причине , почему в Python 3:)

есть новый super()

. Но я согласен с другими, обычно лучшим выбором является определение функции уровня модуля .

Например, с функцией @staticmethod рекурсия может выглядеть не очень хорошо (вам нужно будет нарушить принцип DRY, вызвав Klass.stat_func внутри Klass.stat_func). Это потому, что у вас нет ссылки на self внутри статического метода. С функцией уровня модуля все будет выглядеть нормально.

2259
задан Jacek Laskowski 27 November 2015 в 20:20
поделиться

26 ответов

Предпочтительный путь (потому что это команда plumbing , предназначенная для программирования):

$ git diff-tree --no-commit-id --name-only -r bd61ad98
index.html
javascript/application.js
javascript/ie6.js

Другой способ (менее предпочтительный для скриптов, потому что это фарфор , предназначенный для пользователя)

$ git show --pretty="" --name-only bd61ad98    
index.html
javascript/application.js
javascript/ie6.js

  • --no-commit-id подавляет вывод идентификатора фиксации.
  • --pretty аргумент указывает пустую строку форматирования, чтобы избежать появления трещины в начале.
  • Аргумент --name-only показывает только те имена файлов, которые были затронуты (спасибо Хэнк).
  • -r аргумент состоит в том, чтобы возвращать в поддеревья
2898
ответ дан Ryan McGeary 22 August 2018 в 16:47
поделиться
  • 1
    команды фарфора не должны использоваться в скрипте (git help). Вместо этого используйте git diff-tree --no-commit-id --name-only -r <commit> – drizzt 11 January 2013 в 17:18
  • 2
    Следует отметить, что diff-tree не работает при просмотре корневой фиксации. – jbranchaud 6 March 2013 в 07:52
  • 3
    Замена опции --name-only на --name-status даст более четкое резюме. – Kurt Zhong 11 April 2013 в 04:58
  • 4
    Если вы хотите, чтобы он работал с корневым фиксатором, используйте флаг -root. На странице man: «Когда указано значение --root, начальная фиксация будет показана как большое событие создания. Это эквивалентно различию с деревом NULL. & Quot; – Chris 23 September 2013 в 19:26
  • 5
    git log --name-only -n 1 <hash> Последняя фиксация будет: git log --name-only -n 1 HEAD~1..HEAD – Kurt 11 November 2013 в 06:20

Это должно работать:

git status

Это покажет, что не организовано и что поставлено.

-1
ответ дан 4067098 22 August 2018 в 16:47
поделиться
  • 1
    Речь идет о получении списка файлов в ранее зафиксированном-фиксации, хотя и не о намерении совершить. – Rup 15 March 2018 в 16:34

Используйте простую команду из одной строки, если вы просто хотите, чтобы список файлов был изменен в последнем коммите:

git diff HEAD~1 --name-only
10
ответ дан adosaiguas 22 August 2018 в 16:47
поделиться
  • 1
    Он ничего не показывает при выполнении этой команды – Laxmikant Ratnaparkhi 28 March 2014 в 09:24

ОК, есть несколько способов показать все файлы в конкретном коммите ...

Чтобы уменьшить информацию и показать только имена файлов, которые были сделаны, вы можете просто добавить --name-only или --name-status flag ..., эти флажки просто показывают вам имена файлов, которые отличаются от предыдущих коммитов, как вы хотите ...

Итак, вы можете сделать git diff, а затем --name-only, с двумя хэш после <sha0> <sha1>, что-то вроде ниже:

git diff --name-only 5f12f15 kag9f02 

Я также создаю изображение ниже, чтобы показать все шаги, которые нужно пройти в этой ситуации:

16
ответ дан Alireza 22 August 2018 в 16:47
поделиться

Использовать

git log --name-status

Это покажет вам идентификатор, сообщение, файлы, измененные и измененные, созданные, добавленные или удаленные. В некоторой степени команда «все-в-одном».

5
ответ дан alpha_989 22 August 2018 в 16:47
поделиться
git show --name-only commitCodeHere
12
ответ дан George Oikonomou 22 August 2018 в 16:47
поделиться
  • 1
    Это не дает ответа на вопрос. Чтобы критиковать или просить разъяснения у автора, оставьте комментарий ниже их сообщения. - Из обзора – Dan Cornilescu 12 January 2016 в 16:03
  • 2
    Это точно ответ на вопрос. – George Oikonomou 12 January 2016 в 16:12
  • 3
    Hm, nope: информация, отличная от списка файлов, также отображается, а именно то, что OP специально не хочет. – Dan Cornilescu 12 January 2016 в 16:37

Я просто предполагаю, что gitk нежелательно для этого. В этом случае попробуйте git show --name-only <sha>.

180
ответ дан Hank Gay 22 August 2018 в 16:47
поделиться
  • 1
    - имя-только много в большинстве случаев, где мне это нужно; Поэтому было поддержано кратчайшее решение (и единственное, что я вспомнил в 1 попытке). – Erik S 1 August 2012 в 22:42
  • 2
    Или --name-status. – Neil Traft 18 March 2015 в 02:15
  • 3
    gitk - это именно то, что я получил после - спасибо. этот вопрос теперь является первым, что появляется в поиске Google, поэтому стоит знать, что существует gitk! Остальные могут поддерживать вашу командную строку; Я просто посмотрю на этот приятный экран пользовательского интерфейса :) – Mr Spoon 3 November 2016 в 11:06
  • 4
    Как человек, которому действительно нравится CLI git, gitk на самом деле является достойным способом просмотра файлов и отображения файла, в котором работает diff. например Код, проверяющий монстра на одноранговое соединение. – Elijah Lynn 27 October 2017 в 21:56

Нашел прекрасный ответ на это:

git show --name-status --oneline <commit-hash>

Чтобы я знал

which files were just modified M

Which files were newly added , A

Which files were deleted , D
7
ответ дан Ijaz Khan 22 August 2018 в 16:47
поделиться

Вы также можете сделать

git log --name-only

, и вы можете просматривать различные коммиты, фиксировать сообщения и измененные файлы.

Введите q, чтобы вернуть свое приглашение.

56
ответ дан Indu Devanath 22 August 2018 в 16:47
поделиться

Если вы хотите получить список измененных файлов:

git diff-tree --no-commit-id --name-only -r <commit-ish>

Если вы хотите получить список всех файлов в фиксации, вы можете использовать

git ls-tree --name-only -r <commit-ish>
190
ответ дан Jakub Narębski 22 August 2018 в 16:47
поделиться
  • 1
    Ls-tree с именем -name, похоже, не работает на 1.6.4.4 или 1.6.3.3. Считаете ли вы, что это ошибка? – krosenvold 10 October 2009 в 11:20
  • 2
    Оказалось, что порядок параметров здесь значителен. Тот, который находится в вашем сообщении, не работает, а тот, который находится в вашем ответе работает - по крайней мере, пока вы не обновите свой пост;) – krosenvold 10 October 2009 в 16:17
  • 3
    Пропустите --no-commit-id, чтобы избежать печати SHA1, например: git diff-tree --no-commit-id --name-only -r <commit-ish> – John Mellor 15 August 2012 в 21:00
  • 4
    @CoDEmanX: Вы не пропустили добавление опции -r / -t, не так ли? Поскольку diff-дерево обрабатывает как измененные, так и добавленные файлы. Если вы хотите перечислить все новые (добавленные) файлы, используйте git diff-tree -r --name-only --no-commit-id --diff-filter=A <commit-ish> – Jakub Narębski 18 November 2015 в 00:15
  • 5
    Разве это не должно быть тривиально? – Niklas Rosencrantz 23 June 2016 в 14:43

Я думал, что поделился бы сводкой моего псевдонима. Также я нахожу использование «zsh» великолепно, git it colora все хорошо красит и говорит, что вы хотите, чтобы ветка все время менялась в командной строке.

Для тех, кто покрывает SVN, вы найдете это полезным: (это комбинация идей из разных потоков, я только беру кредит на знание того, как использовать copy / paste)

.gitconfig:
        ls = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative --name-status

>>git ls
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker| 
| A     icds.xcodeproj/project.pbxproj
| A     icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata
| A     icds/AppDelegate.m
| A     icds/Assets.xcassets/AppIcon.appiconset/Contents.json

* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker| 
| D     Classes/AppInfoViewControler.h
| D     Classes/AppInfoViewControler.m
| D     Classes/CurveInstrument.h


.gitconfig: 
       lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>>git lt
* 99f21a6 - (HEAD -> swift) New Files from xcode 7 (11 hours ago) Jim Zucker
* e0a1bb6 - Move everything to old (11 hours ago) Jim Zucker
* 778bda6 - Cleanup for new project (11 hours ago) Jim Zucker
* 7373b5e - clean up files from old version (11 hours ago) Jim Zucker
* 14a8d53 - (tag: 1.x, origin/swift, origin/master, master) Initial Commit (16 hours ago) Jim Zucker


.gitconfig
lt = log --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)%an%Creset' --abbrev-commit --date=relative

>> git lt

commit 99f21a61de832bad7b2bdb74066a08cac3d0bf3c
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:23:10 2015 -0800

    New Files from xcode 7

A       icds.xcodeproj/project.pbxproj
A       icds.xcodeproj/project.xcworkspace/contents.xcworkspacedata


commit e0a1bb6b59ed6a4f9147e894d7f7fe00283fce8d
Author: Jim Zucker <jim@stratengllc.com>
Date:   Tue Dec 1 22:17:00 2015 -0800

    Move everything to old

D       Classes/AppInfoViewControler.h
D       Classes/AppInfoViewControler.m
D       Classes/CurveInstrument.h
D       Classes/CurveInstrument.m
0
ответ дан Jim Zucker 22 August 2018 в 16:47
поделиться

Также есть git whatchanged, который является более низким уровнем, чем git log

NAME
       git-whatchanged - Show logs with difference each commit introduces

Он выводит сводку фиксации со списком файлов под ним с их режимами, и если добавлено (A ]), удалено (D) или изменено (M);

$ git whatchanged f31a441398fb7834fde24c5b0c2974182a431363

Дает что-то вроде:

commit f31a441398fb7834fde24c5b0c2974182a431363
Author: xx <xx@xx.nl>
Date:   Tue Sep 29 17:23:22 2015 +0200

    added fb skd and XLForm

:000000 100644 0000000... 90a20d7... A  Pods/Bolts/Bolts/Common/BFCancellationToken.h
:000000 100644 0000000... b5006d0... A  Pods/Bolts/Bolts/Common/BFCancellationToken.m
:000000 100644 0000000... 3e7b711... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.h
:000000 100644 0000000... 9c8a7ae... A  Pods/Bolts/Bolts/Common/BFCancellationTokenRegistration.m
:000000 100644 0000000... bd6e7a1... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.h
:000000 100644 0000000... 947f725... A  Pods/Bolts/Bolts/Common/BFCancellationTokenSource.m
:000000 100644 0000000... cf7dcdf... A  Pods/Bolts/Bolts/Common/BFDefines.h
:000000 100644 0000000... 02af9ba... A  Pods/Bolts/Bolts/Common/BFExecutor.h
:000000 100644 0000000... 292e27c... A  Pods/Bolts/Bolts/Common/BFExecutor.m
:000000 100644 0000000... 827071d... A  Pods/Bolts/Bolts/Common/BFTask.h
...

Я знаю, что этот ответ на самом деле match "без посторонней информации.", но я все же считаю, что этот список более полезен, а только имена файлов.

11
ответ дан Koen. 22 August 2018 в 16:47
поделиться
  • 1
    Кроме того, только одна команда whatchanged вместо подачи параметров. – Gabrielius 25 January 2016 в 13:19

Недавно мне нужно было перечислить все измененные файлы между двумя коммитами. Таким образом, я использовал эту (также * nix специфическую) команду

git show --pretty="format:" --name-only START_COMMIT..END_COMMIT | sort | uniq

Обновление: Или, если этан указывает ниже

git diff --name-only START_COMMIT..END_COMMIT

Использование --name-status также будет включать изменение (добавлено , измененный, удаленный и т. д.) рядом с каждым файлом

git diff --name-status START_COMMIT..END_COMMIT
58
ответ дан lunohodov 22 August 2018 в 16:47
поделиться
  • 1
    Просто попробовал: отлично работает в git bash на Windows тоже. – OregonGhost 16 August 2012 в 17:52
  • 2
    Если вы используете git diff --name-status START_COMMIT..END_COMMIT, вам не нужен трейлинг |sort | uniq. – Ethan 17 September 2013 в 21:12
  • 3
    Исправление к комментарию выше: git diff --name-only START_COMMIT..END_COMMIT – Ethan 17 September 2013 в 21:19
  • 4
    Это то, что я искал. Как я его использовал: git diff --name-only START_COMMIT..END_COMMIT | grep -v -e '**.png' -e '**.xml'. Мне нужен список изменений кода только для огромного PR, который добавил тысячи PNG и XML-макетов. – AutonomousApps 18 September 2017 в 16:39

Я лично использую комбинацию --stat и --oneline с командой show:

git show --stat --oneline HEAD
git show --stat --oneline b24f5fb
git show --stat --oneline HEAD^^..HEAD

Если вам не нравится / требуется статистика добавления / удаления, вы можете заменить --stat с --name-only

git show --name-only --oneline HEAD
git show --name-only --oneline b24f5fb
git show --name-only --oneline HEAD^^..HEAD
118
ответ дан m13r 22 August 2018 в 16:47
поделиться
  • 1
    Отлично! В основном это дает вам сводку файла, которую Github показывает вверху представления фиксации. Благодарю. – trisweb 11 January 2013 в 19:17
  • 2
    Очень хорошо. Чтобы определить псевдоним: alias gits='git show --stat --oneline', тогда gits сам по себе показывает последние изменения (в HEAD), а gits b24f5fb можно использовать для отображения изменений в ревизии. – Brent Faust 5 December 2013 в 05:03
  • 3
    Можно также создать псевдоним git ... например. возможно git config --global alias.changes 'show --stat --oneline'. Затем вы можете ввести git changes (с необязательным commit-ish) и получить вывод из первых приведенных выше примеров. – lindes 5 December 2013 в 19:31
  • 4
    Git для Windows требует двойных кавычек: git config --global alias.changes "show --stat --oneline" – Alchemistmatt 25 July 2017 в 02:46
  • 5
    Ницца. И в отличие от принятого ответа, git show также работает для просмотра спрятанных изменений: например. git show --stat --oneline stash@{1} – Jeff Ward 26 July 2017 в 19:00

Мне нравится использовать

git show --stat <SHA1>^..<SHA2>
15
ответ дан Michael De Silva 22 August 2018 в 16:47
поделиться

Список файлов, которые были изменены в commit:

git diff --name-only SHA1^ SHA1

Это не показывает сообщения журнала, дополнительные строки новой строки или любые другие помехи. Это работает для любой фиксации, а не только для текущей. Не знаю, почему еще не было довольно , поэтому я добавляю его.

9
ответ дан Newtonx 22 August 2018 в 16:47
поделиться
  • 1
    Эти два варианта выглядят одинаково: git diff SHA1^ SHA1 и git show SHA1. – Vladimir Vukanac 27 June 2016 в 15:16
  • 2
    @mrW Эти команды производят аналогичный вывод, но git show также показывает сообщение фиксации – Newtonx 27 June 2016 в 23:01
$ git log 88ee8^..88ee8 --name-only --pretty="format:"
23
ответ дан Pat Notz 22 August 2018 в 16:47
поделиться

Мне это нравится:

git diff --name-status <SHA1> <SHA1>^
11
ответ дан skiphoppy 22 August 2018 в 16:47
поделиться
  • 1
    Я думаю, что это получает A & amp; D (добавлять и удалять) статусы файлов назад, потому что он показывает diff от указанной фиксации к предыдущей фиксации, а не наоборот. Это должно быть git diff --name-status <SHA1>^ <SHA1>. – Troy Gizzi 3 January 2015 в 06:14

Существует простой трюк для просмотра в виде списка файлов, просто добавьте : после хэша.

git show 9d3a52c474:

Затем вы можете просверлить

git show 9d3a52c474:someDir/someOtherDir

Если вы ударите файл, вы получите исходную версию файла; который иногда является тем, что вам нужно, если вы ищете только хорошую ссылку или ключевые фрагменты кода (diff могут сделать все беспорядок),

git show 9d3a52c474:someDir/someOtherDir/somefile

Единственным недостатком этого метода является то, что он не " t легко показать дерево файлов.

6
ответ дан srcspider 22 August 2018 в 16:47
поделиться
git show HEAD@{0}

отлично работает для меня

8
ответ дан Surya 22 August 2018 в 16:47
поделиться
  • 1
    Хотя это больше усилий, чем необходимо, я не думаю, что это должно быть уменьшено; Он все еще отвечает на вопрос. Упрощенный. Пожалуйста, исправьте меня, я не должен ее исправлять. – Erik S 1 August 2012 в 22:41
  • 2
    это реальный ответ – Nils 19 December 2016 в 16:43

Я использую измененный псевдоним довольно часто. Чтобы установить его:

git config --global alias.changed 'show --pretty="format:" --name-only'

, затем:

git changed (lists files modified in last commit)   
git changed bAda55 (lists files modified in this commit)
git changed bAda55..ff0021 (lists files modified between those commits)

Аналогичные команды, которые могут быть полезны:

git log --name-status --oneline (very similar, but shows what actually happened M/C/D)
git show --name-only
45
ответ дан takeshin 22 August 2018 в 16:47
поделиться

Я использую это, чтобы получить список измененных файлов между двумя наборами изменений:

git diff --name-status <SHA1> <SHA2> | cut -f2
15
ответ дан user135507 22 August 2018 в 16:47
поделиться
  • 1
    используйте --name-only, и вы можете пропустить команду cut – Newtonx 28 July 2012 в 01:54
  • 2
    Да, но статус может быть весьма удобен (например, вы можете захотеть grep отображать все файлы, кроме тех, которые были удалены с помощью чего-то вроде git diff --name-status .. | grep ^[^D] | cut -f2 – Pierre-Adrien Buisson 17 September 2014 в 10:19

Простейшая форма:

git show --stat (hash)

Это легче запомнить, и она предоставит вам всю необходимую вам информацию.

Если вы действительно хотите только имена файлов, вы можете добавить опцию --name-only.

git show --stat --name-only (hash)

49
ответ дан VaTo 22 August 2018 в 16:47
поделиться
  • 1
    Я хотел бы знать, почему, если мой ответ прост и правилен, я получил отрицательный голос. – VaTo 21 July 2016 в 19:31
  • 2
    Если мне угрожать догадки (и я только догадываюсь, так как это был не я, кто проголосовал за ваш ответ), это потому, что исходный плакат запросил только список файлов без какой-либо другой информации. Представленная команда показывает информацию о фиксации и типы изменений, внесенных в файл. Я нашел ваш ответ полезным для чего-то другого, если это какое-то утешение. – J. Gregory Wright 12 August 2016 в 17:57
  • 3
    @ J.GregoryWright, возможно, вы правы, в этом случае я бы добавил - только имя и все. Тем не менее, я использую команду, которую я предоставил, потому что ее легче запомнить. Но я поставлю эти два варианта на всякий случай, спасибо за предложение! – VaTo 17 August 2016 в 04:10
  • 4
    - имя-только все равно будет содержать пару строк заголовков, содержащих информацию, такую ​​как автор, дата и сообщение фиксации. – devoured elysium 29 September 2016 в 15:14
  • 5
    лучший ответ ИМО, остальные не запомнились вообще. – Amalgovinus 21 September 2017 в 04:30

Использование стандартной команды git diff (также хорошо для сценариев):

git diff --name-only <sha>^ <sha>

Если вы хотите также статус измененных файлов:

git diff --name-status <sha>^ <sha>

Это хорошо работает с слияния.

35
ответ дан vquintans 22 August 2018 в 16:47
поделиться
  • 1
    это, безусловно, самый простой ответ, когда речь идет о ряде коммитов, для одного использования commit git show --name-only <sha> – thebugfinder 10 September 2015 в 12:57
  • 2
    (игнорируйте мой предыдущий комментарий), это, безусловно, самый простой ответ при работе с целым рядом коммитов или с одним фиксатором. ОТЛИЧНАЯ РАБОТА! – thebugfinder 10 September 2015 в 13:11
0
ответ дан Jignesh Joisar 5 November 2018 в 14:18
поделиться
8
ответ дан Surya 5 November 2018 в 14:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: