Я хочу снабдить свой линтер файлами, которые были изменены в моей ветке. Список должен включать:
Он не должен включать файлы, которые были изменены в родительской ветке после изменения. Таким образом, если в моей ветке нет последних коммитов из родительской ветки, это не имеет значения.
Что я пробовал до сих пор:
git diff --name-only
дает только то, что изменено, но не зафиксировано/не поставленоgit diff --name-only --staged
дает только то, что поставлено, но не зафиксировано/измененоgit diff --name-only main...
дает только то, что зафиксировано, но не изменено/не поставленоgit diff --name-only main
дает все (зафиксировано/поставлено/изменено), но также включает в себя то, что изменилось в main
В каком-то смысле у меня уже есть список, если я объединил вывод 1, 2 и 3. Но было бы неплохо иметь одну команду. Есть ли что-то подобное?
Ты так близко. git diff main...
определяется как
git diff A...B
эквивалентноgit diff $(git merge-base A B) B
и вы не хотите, чтобы оно сравнивалось со вторым советом, с вашей текущей извлеченной фиксацией, вам нужно сравнение по умолчанию с рабочим деревом, поэтому вы хотите оставить там последний B
.
git diff $(git merge-base main @)
Что вас может сбить с толку, так это то, что в выражениях ревизии отсутствующее имя ревизии обычно по умолчанию имеет значение HEAD
, то есть @
, тогда как в списке аргументов команды отсутствующий аргумент, который не обязательно является именем ревизии, по умолчанию не имеет значения HEAD
. Поэтому, когда вы говорите main...
, он использует HEAD
в качестве версии B
выше.
@knittl Хорошая идея, за исключением, может быть, выбора имени. :) Это не ветка, с которой ОП хочет сравниться, это рабочее дерево. Основная проблема здесь в том, что невозможно назвать «рабочее дерево» объектом команды diff
; это может быть только подразумеваемым. Это похоже на дырку в языке.
@matt да, имя абсолютно дерьмовое, но я сразу не смог придумать лучшего. difffeature
, diff-merge-base
, changes
, …
Спасибо! И действительно, такое ощущение, что в git не хватает функций, которые сделали бы это менее очевидным.
Бонусные баллы, если вы определите псевдоним, позволяющий запускать его как простую команду Git, например.
git branchdiff