2

Я только что столкнулся с ситуацией, которая кажется мне нелогичной с Git. У меня есть репо с большим количеством коммитов, поэтому на этом этапе у него только одна ветка (мастер).

Мастер филиал

Предположим, что в этой ветке есть файл с именем MyFile.txt. Теперь мне нужно создать другую ветку, потому что я хочу внести некоторые изменения в несколько файлов, и я не хочу делать это основной веткой напрямую, поэтому я запускаю:

git checkout iss53

Теперь схема выглядит так:

Новый филиал

Хорошо, я переключился на ветку iss53, я запускаю ls -l и MyFile.txt. Одним из изменений является удаление файла MyFile.txt, поэтому:

git rm MyFile.txt

Хорошо , запуск ls -l снова показывает, что MyFile.txt больше нет. Итак, я переключаюсь обратно в главную ветку:

git checkout master

Но ... файл MyFile.txt также исчез. Моя логика говорит, что если я удалил файл в ветке, он должен применяться только к этой ветке, так почему же файл удаляется и из основной ветки? Обратите внимание, что я еще не делал никаких коммитов, просто разветвляюсь.

Примечание: оба изображения взяты из Git-scm.

1 ответ1

2

Ответ на ваш вопрос:

Обратите внимание, что я еще не делал никаких коммитов, просто разветвляюсь.

Если вы не фиксируете изменения, они всегда сохраняются в вашем рабочем каталоге. Переключение ветки не влияет на ваш рабочий каталог, и рабочий каталог также не влияет на ваш последний коммит. Вы видите, что файл удален, но в действительности он удаляется только из вашего рабочего каталога. Если вы хотите отменить изменения и вернуться к последнему коммиту, используйте эту команду:

git reset --hard HEAD

Таким образом, файл будет восстановлен снова.

Может быть, это не логика для вас, но такое поведение может быть полезным. Представьте, что у вас есть две ветви: master и development , и вы всегда должны работать над development прежде чем переносить изменения в master . Допустим, вы забыли переключиться на development прежде чем начать работать, а затем, перед тем как совершить сделку, вы поняли, что вы master . Решение простое, просто переключитесь на development затем зафиксируйте.

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .