Является ли удаление файла функцией «git revert» ошибкой? - PullRequest
0 голосов
/ 06 мая 2020

Чтобы воспроизвести поведение, которое выглядит как ошибка, сделаем следующее:

Создание временного каталога:

$ mkdir tmp
$ cd tmp

Создание текстового файла:

$ echo "some text" > tmp.txt

Инициализация пустого Git репозиторий:

$ git init

Промежуточный tmp.txt:

$ git add tmp.txt

Запись изменений рабочего дерева в репозиторий:

$ git commit

Проверка изменений в репозитории:

$ git log --oneline

833f4b3 (HEAD -> master) Воспроизведение ошибки отката: Добавить tmp.txt

Отмена начальной фиксации:

$ git revert 833f4b3

$ ls -al  # Shows that tmp.txt was deleted

После этого логичнее было бы ожидать, что git revert оставит tmp.txt только в постановке, но не удалит его из рабочего дерева. Потому что tmp.txt существовал до первоначальной фиксации.

1 Ответ

1 голос
/ 06 мая 2020

Git не заботится о том, когда файл был создан. Его волнует, что на ревизии. В ревизии файл был создан с определенным содержимым ... затем вы запрашиваете откат (содержимое остается прежним), он удаляет файл.

Чтобы обеспечить некоторый контекст: когда git создает revision, он не сохраняет много информации о файле (когда это файл) ... помимо содержимого ... и нескольких флагов разрешений. Итак, в самой первой ревизии вы создаете объект ревизии, объект ревизии будет указывать на объект дерева, информацию о каталоге root .... с подкаталогами и файлами, присутствующими в этом каталоге. В вашем случае на объекте дерева каталогов root вы увидите , но еще другой объект, файл, о котором мы говорим, который указывает на объект blob (само содержимое файла). Итак, что git делает, чтобы знать, что он вернется, - это сравнить с предыдущей версией той, которую вы хотите вернуть. Предыдущая ревизия не существует, поэтому git понимает, что вы хотите вернуть файл целиком, потому что до этой ревизии файл не существовал .... после ревизии файл действительно существует и имеет некоторое содержимое . Если вы хотите отменить его, файл должен быть go прочь, если содержимое совпадает .... если вы изменили содержимое (например, во второй ревизии), а затем попытались отменить первую ревизию, вы увидите конфликт деревьев ... и конфликт содержимого? Не уверен в конфликте контента. Возникает конфликт дерева, потому что git не будет пытаться удалить файл, если содержимое не соответствует тому, что было в ревизии, в которую он был добавлен при операции возврата.

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