Я только что столкнулся с ситуацией, которая кажется мне нелогичной с Git. У меня есть репозиторий с большим количеством коммитов, поэтому на данном этапе у него только одна ветка (владелец).
Предположим, что в этой ветке есть файл с именемМойФайл.txt. Теперь мне нужно создать другую ветку, потому что я хочу внести некоторые изменения в несколько файлов и не хочу делать это напрямую в ветке master, поэтому я запускаю:
git checkout iss53
Теперь схема выглядит так:
Хорошо, я перешел на веткуис53, я бегу ls -l
иМойФайл.txt. Одно из изменений включает удалениеМойФайл.txtфайл, поэтому:
git rm MyFile.txt
Хорошо, ls -l
снова бег показывает, что нетМойФайл.txtбольше нет. Поэтому я переключаюсь обратно навладелецветвь:
git checkout master
НоМойФайл.txtФайл тоже исчез. Моя логика говорит, что если я удалил файл на ветке, он должен быть применентольков эту ветку, так почему же файл удален извладелецА также ветку? Обратите внимание, что я пока не сделал никаких коммитов, только ветвление.
Примечание: Оба изображения взяты изGit-scm.
решение1
Ответ в вашем вопросе:
Обратите внимание, что я пока не сделал никаких коммитов, только ветвление.
Если вы не фиксируете изменения, они всегда сохраняются в вашем рабочем каталоге. Переключение ветки не влияет на ваш рабочий каталог, а рабочий каталог также не влияет на ваш последний коммит. Вы видите, что файл удален, но на самом деле он удален только из вашего рабочего каталога. Если вы хотите очистить изменения и вернуться к последнему коммиту, используйте эту команду:
git reset --hard HEAD
Таким образом, файл будет восстановлен снова.
Может быть, это нелогично для вас, но такое поведение может быть полезным. Представьте, что у вас есть 2 ветки: master
и development
, и вы всегда должны работать над , development
прежде чем переносить изменения в master
. Допустим, вы забыли переключиться на , development
прежде чем начать работать, а затем - до того, как вы сделали коммит - вы поняли, что находитесь на master
. Решение простое, просто переключитесь на , development
а затем выполните коммит.
решение2
Всякий раз, когда я удалял файл из одной из своих веток (которую я называл login), он не удалялся из главной ветки.
- Я переключился на ветку входа
git checkout login
- Удален файл test.html
git rm --cached test.html
- Добавил все в зону подготовки
git add .
- Зафиксировал изменения с помощью
git commit -m 'removed test.html file'
- Переместил локальный репозиторий в удаленный репозиторий Github с помощью
git push