ветка git switch — как быть в курсе событий с мастером?

#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 это делает…