#git
Вопрос:
У меня есть две ветви, test
и master
.
В test
, я удалил файл.c, но в master я этого не сделал. Я работал над тестовой ветвью и хотел переключиться обратно на master, чтобы быстро внести в нее изменения.
git checkout master
git pull origin master
Это установило для моей текущей ветви значение master, но не восстановило файл.c, как я ожидал.
git reset --hard HEAD
сбрасывает хранилище так, как мне бы хотелось, но это не кажется правильным решением.
Если я переключу ветви, как мне получить локальную копию, соответствующую той ветви, на которую я переключился? Я бы ожидал git pull
этого, но, возможно, я неправильно понял.
Ответ №1:
Наиболее вероятное объяснение произошедшего заключается в том , что , когда вы были в ветке test
, после удаления file.c
вы не зафиксировали это изменение. Как только вы зафиксируете изменение, эта фиксация будет в ветке test
, а затем , когда вы переключитесь на другую ветку, в которой все еще есть файл, например master
, файл вернется.
Обратите внимание, что недоразумение можно увидеть в вашей формулировке вопроса (что, кстати, является очень распространенным недоразумением).:
В
test
, я удалил файл.c, но вmaster
я этого не сделал.
Что вы на самом деле сделали, так это удалили file.c
из своей рабочей папки, пока вы test
проверяли филиал. Но вы еще не зафиксировали это удаление ни в одной ветке.
Изменение, по сути, следует за вами от ветки к ветке, просто ожидая, когда вы что-то с ним сделаете. Но это не будет следовать за вами повсюду. Если вы попытаетесь переключиться на ветку, в которую file.c
были внесены изменения, это приведет к конфликту, поэтому Git остановится и скажет вам, чтобы вы что-то сделали с вашим изменением, прежде чем продолжить (например, сохранили, зафиксировали или отменили его).
Примечание сбоку: команда сброса, которую вы использовали:
git reset --hard HEAD
по сути, отменяет все ваши ожидающие изменения. Если бы у вас были другие изменения, над которыми вы работали, они также были бы отменены и потенциально потеряны навсегда. Если вы хотите просто отменить ожидающее изменения в определенном файле, вы можете использовать:
git checkout file.c
# or the newer:
git restore file.c
Комментарии:
1. Это правильный ответ. Я бы просто добавил, что если вы хотите вернуть только тот файл, который вы изменили, вы можете
git checkout file.c
вернуться к сохраненной версииfile.c
.2. @Калеб хорошее дополнение. Я включил ваш комментарий. Примечание сбоку, я только что заметил, что
restore
не отображается «Обновлен 1 путь из индекса», какcheckout
это делает…