Как получить файлы, модифицированные в Git Push? - PullRequest
1 голос
/ 12 марта 2019

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

Push может иметь несколько коммитов.

В настоящее время я могу получить Модифицированные файлы последнего коммита по этой команде:

git diff-tree --no-commit-id --name-only -r HEAD

Ответы [ 3 ]

1 голос
/ 12 марта 2019

git push не изменяет никаких файлов.

git push добавляет или удаляет коммит .У коммитов есть снимки файлов.В коммитах нет изменений, просто есть файлы.

Вот файл:

$ cat name-of-file
I am the contents of file name-of-file.

Какие изменения я внес в этот файл?Я предоставил вам снимок , и мой вопрос к вам: каковы изменения? Какую ключевую информацию я оставил вне своего вопроса?

Подумайте об этом немного, а затем продолжайте читать: Учитывая два снимка, как вы найдете изменения?git diff помогает?

Какие два снимка вы хотели бы использовать?

Команда git diff может показать вам, что изменило между любыми двумя снимками:

git diff <hash#1> <hash#2>

Обратите внимание, что вы должны выбрать два хэша коммита.Тем не менее, вы можете выбрать эти хэши фиксации по names .В каком-нибудь существующем репозитории Git запустите:

git rev-parse master

и посмотрите, какой хеш коммита выйдет.Затем запустите git log master.Что общего между выводом git rev-parse и первой строкой git log?

Существует полный (хотя и подавляющий) список способов создания хэш-идентификаторов Git в документации gitrevisions ,но наиболее полезными для повседневной работы являются имена веток, такие как master, имена тегов, такие как v2.1, и имена для удаленного отслеживания, такие как origin/master.Имя HEAD означает текущий коммит , 1 , и вы можете сократить его @, если хотите.


1 Имя HEAD также означает имя текущей ветви .Способ, которым Git решает, использовали ли вы HEAD для обсуждения идентификатора хеша или для имени ветви , заключается в том, что некоторым командам нужно имя ветви, а другим -идентификатор хеша коммитаКоманда git rev-parse может задать любой вопрос, но по умолчанию находится идентификатор хеша.Вы можете использовать git rev-parse --symbolic-full-name HEAD, чтобы спросить о названии филиала, или, если вы очень серьезны, вы можете использовать git symbolic-ref HEAD для этого случая.


git diff-tree - это версия сантехникиgit diff для двух коммитов

Указанная вами команда git diff-tree - это способ запуска git diff из другой компьютерной программы.Если вы запускаете git diff, чтобы самостоятельно увидеть разницу, на экране своего компьютера вы обычно используете то, что Git называет командой фарфор , названной в честь более отточенных, ориентированных на пользователя частейВанная комната, как раковина.Если вы используете git diff для получения различий для передачи в другую компьютерную программу, вам может понадобиться разобрать и собрать по пути различное оборудование, выполняя то, что Git называет сантехникой , и здесь вы должны использоватьgit diff-tree для сравнения двух конкретных коммитов.

Команда git diff-tree имеет одну особенную дополнительную особенность: если вы запускаете ее только с одним идентификатором хэша коммита или именем, подобным HEADGit будет извлекать из этого коммита список parent коммитов.Затем Git будет различать родителя (ей) коммита против коммита.Это то, что вы видите, когда запускаете git diff-tree <em>options</em> HEAD.

Чтобы выбрать два подтверждения для сравнения, просто используйте оба хеш-идентификатора или имена для них накомандная строка.

Обычный git diff может также сравнивать другие вещи

Фарфоровая команда git diff может вызывать вместо git diff-tree, git diff-index или git diff-files команды слежения.Они позволяют вам сравнивать содержимое коммита с содержимым index , или коммитом с рабочим деревом, или индексом с рабочим деревом.

Commits, индекс,и рабочее дерево

Помните, что Git всегда имеет три активных копий каждого файла:

  • Замороженная копия в коммите HEADдоступно через git show HEAD:<em>path</em>.
  • Копия рабочего дерева - это обычный файл, который вы можете просматривать и редактировать.Git не использует этот файл!
  • Между этими двумя копиями Git хранит копию файла, который он поместит в следующий коммит, который вы сделаете.Эта копия находится в том, что Git называет, по-разному, index , или область подготовки , или cache .Вы можете просмотреть эту копию с помощью git show :<em>path</em>.

Когда вы запустите git commit, Git упакует все, что находится в индексе , прямо тогда , и заморозит это содержимое, чтобы сделатьновый моментальный снимок.Вот почему вы должны продолжать работать git add так часто.Команда git add копирует содержимое некоторого файла рабочего дерева в индекс, обновляя или даже создавая версию индекса.

Это версия index файл, который имеет значение для Git.Принятые версии замораживаются в коммиты и не могут быть изменены.Они длятся до тех пор, пока длится коммит.Версия work-tree каждого файла - это та, с которой вы можете видеть и работать, но Git не заботится о ней.Версия index каждого файла - это то, что нужно Git для новых коммитов, а создание новых коммитов - причина существования Git, поэтому Git заботится о коммитах и index .

Дерево работы для вас.Git не хочет или не нуждается ни в чем;вам нужно работать и обновлять индекс, а также копировать его, чтобы Git нуждался в новых коммитах.

Резюме: коммиты - это снимки;diff сравнивает снимки

Все это - то, как и почему Git делает снимки . Git не имеет дело с изменениями.Это делает снимки.Вы можете в любое время сравнить два снимка , чтобы увидеть, что между ними отличается.То, что вы увидите, будет зависеть от того, какие два снимка вы выберете.

Вы также можете сравнить снимок (коммит) с предложенным снимком (индекс) или сравнить снимок с вашей работой.или сравнить предложенный снимок (индекс) с рабочим деревом.Команда git diff-tree сравнивает только реальные снимки.Чтобы получить другие сравнения, вам понадобится одна из других сантехнических команд или фарфор git diff.

Команда git status также запускает git diff для вас.Когда вы используете git status, он на самом деле запускает два таких различий.Один сравнивает текущий снимок, HEAD, с индексом - с предложенным коммитом.Отсюда изменения для коммита .Второе сравнение сравнивает индекс с рабочим деревом.Отсюда изменения, не подготовленные для фиксации .Ни в индексе, ни в рабочем дереве нет никаких реальных изменений; изменений, которые показывают git status или git diff, являются результатом сравнения фактических снимков (фиксаций), предложенных снимков (индекса) или потенциальныхснимки (рабочее дерево).

1 голос
/ 12 марта 2019

Вы были почти там.Этого можно добиться, сравнив текущую HEAD с веткой origin .git diff-tree --no-commit-id --name-only -r HEAD..origin/master

Пример

git checkout master
git pull
touch addnewfile.txt
git add -A
git commit -am "added new empty file"
echo 'test' > addexistingfile.txt
git commit -am "added test in existing file"
git diff-tree --no-commit-id --name-only -r HEAD..origin/master

Последняя команда отображает вывод:

addnewfile.txt
addexistingfile.txt
0 голосов
/ 19 марта 2019

Вы можете использовать следующее: -

git diff --name-only $GIT_PREVIOUS_COMMIT $GIT_COMMIT

Или в jenkins есть функция changeSets , которую можно использовать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...