Удаление файла из ветки в git также подразумевает удаление его из основной ветки?

5251
nKn

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

Master branch

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

git checkout iss53 

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

New branch

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

git rm MyFile.txt 

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

git checkout master 

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

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

2

1 ответ на вопрос

2
Hamza Abbad

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

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

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

git reset --hard HEAD 

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

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

Похожие вопросы