Просмотр изменений удаленных файлов в git


Предположим, что когда я отхожу от master, на ветке master моего РЕПО есть файл colors.txt с таким содержимым:

red
green
blue
yellow

Затем я разветвляюсь на my-branch, в котором я делаю следующие изменения:

  1. исключить colors.txt
  2. Добавить red.txt с таким содержанием:

    red
    
  3. Добавить green.txt с таким содержанием:

    green
    
  4. Добавить blue.txt с таким содержанием:

    blue
    
  5. Добавьте yellow.txt с этими содержание:

    yellow
    

Итак, на master произошли некоторые изменения, которые мне нужны,поэтому я хочу слиться. Однако кто-то также изменил colors.txt на:

red
green
blue
yellow
orange
purple

Во время слияния единственная информация, которую я получаю, - это то, что я удалил файл colors.txt, поэтому как я могу увидеть изменения, которые были в файле на master, чтобы я мог надлежащим образом разрешить конфликт (в данном случае, добавив файлы orange.txt и purple.txt)?

3 2

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, вы получите + вместо - (входные данные реверсированный).

Надеюсь, это поможет.