Просмотр изменений удаленных файлов в git
Предположим, что когда я отхожу от master, на ветке master
моего РЕПО есть файл colors.txt
с таким содержимым:
red
green
blue
yellow
Затем я разветвляюсь на my-branch
, в котором я делаю следующие изменения:
- исключить
colors.txt
-
Добавить
red.txt
с таким содержанием:red
-
Добавить
green.txt
с таким содержанием:green
-
Добавить
blue.txt
с таким содержанием:blue
-
Добавьте
yellow.txt
с этими содержание:yellow
Итак, на master произошли некоторые изменения, которые мне нужны,поэтому я хочу слиться. Однако кто-то также изменил colors.txt
на:
red
green
blue
yellow
orange
purple
Во время слияния единственная информация, которую я получаю, - это то, что я удалил файл colors.txt
, поэтому как я могу увидеть изменения, которые были в файле на master, чтобы я мог надлежащим образом разрешить конфликт (в данном случае, добавив файлы orange.txt
и purple.txt
)?
3 ответа:
Вы можете показать все изменения, внесенные в этот файл на master, используя следующую команду:
git diff HEAD...master -- colors.txt
Это должно привести к такому результату в вашем случае:
red green blue yellow +orange +purple
Использование трех точек для
git diff
покажет изменения всех коммитов, которые являются родителями второго ссылочного коммита, но не первого ссылочного коммита. Таким образом, используя это, вы увидите все изменения, которые были бы объединены, если бы файл не был удален.С помощью
-- colors.txt
изменения, показанныеgit diff
, ограничены этим файл.Более общей версией этой команды будет
git diff HEAD...MERGE_HEAD -- colors.txt
MERGE_HEAD
всегда устанавливается на Объединенный коммит, таким образом, он может заменить объединенное имя ветви. Используя это, вы даже можете настроить псевдоним для повторного использования этой команды:git config --global alias.merge-diff-theirs "diff HEAD...MERGE_HEAD"
После этого вы можете просто сделать
git merge-diff-theirs -- colors.txt
Сложный сценарий, верно? Я думаю, что лучшее, что вы можете попытаться сделать, это выяснить, "когда" цвет.txt был удален. Если бы вы не сливались, я бы сказал: используйте биссект, чтобы узнать, когда файл исчез, чтобы вы могли видеть, что произошло, но вы сливаетесь, так что это не хорошо.
git blame --reverse
может помочь Несколько, сообщив вам, когда в последний раз файл был присутствует в вашем рабочем дереве.git log --name-status -- <file-path>
также может помочь вам увидеть, когда файл исчез (и почему, через красиво написанный комментарий редакции, так ведь?). Я бы посоветовал вам дать difflame testdrive (инструмент, над которым я работал, смешивая вывод blame и diff, мог бы сказать вам точную ревизию, где были удалены строки), но я думаю, что, поскольку файл был удален Полностью, он сломается.. хотя не уверен. Вот ссылка на всякий случай: https://github.com/eantoranz/difflame . .. если вы можете узнать, на какой ревизии файл был удален, вы можете узнать Почему он был удален и вы должны понять,что вам нужно создать файл для нового цвета, который был добавлен к цвету.txt при сохранении цвета.txt удален, так что слияние "завершено".
Хорошо, я проверил следующее:
- проверка новой ветви цветовой тест
- добавьте оранжевый/фиолетовый к существующим цветам .txt и commit
- переключиться обратно на "master"
- удалить цвета.txt
- попробуйте выполнить слияние, которое завершится неудачей
Для меня
git diff colors-test.. -- colors.txt
дает следующий результат:-red -green -blue -yellow -orange -purple
Где
color-test
- ветвь, в которую я добавил оранжевый/фиолетовый, а..(nothing)
указывает наHEAD
. Это может быть нормально, когда файл тем не менее, это небольшое, полное различие может быть лучше.Чтобы узнать, в каком коммите вы удалили файл, вы можете попробовать что-то вроде
git log --name-status -- colors.txt
И вы найдете коммит с
D colors.txt
, который является коммитом, в котором вы удалили файл, в моем случае короткий хэш-этоe1bb165
. Возможно, вы захотите провести различие против фиксации перед этимgit diff colors-test..e1bb165~1 -- colors.txt
Что дает мне
green blue yellow -orange -purple
Когда вы передадите переключатель
Надеюсь, это поможет.-R
вgit diff
, вы получите+
вместо-
(входные данные реверсированный).