Git Оформить заказ, похоже, не работает - PullRequest
0 голосов
/ 18 марта 2020

Я хочу оформить определенный коммит и выполнить сборку при этом коммите, но когда я делаю git checkout <sha> ., он не обновляет файлы, а журнал остается при последнем коммите (HEAD of branch).

Если я хочу построить с определенным коммитом, нужно ли создавать новую ветку с этим коммитом?

Я что-то не так делаю или это поведение по умолчанию?

Должен ли я нужно сбросить файлы после git checkout <sha> .?

Ответы [ 2 ]

1 голос
/ 18 марта 2020

git checkout может делать несколько разных вещей.

Когда вы пишете git checkout <branch>, Git извлекает файлы в рабочем дереве, соответствующие коммиту в конце этой ветви, и устанавливает переход к указанному вами (то есть, HEAD установлен на эту ветвь).

Когда вы пишете git checkout <sha> или git checkout <tag>, вы создаете то, что называется detached HEAD . Другими словами, рабочее дерево извлекается для этого коммита и HEAD обновляется, но ветки нет; если вы создадите коммит в этот момент, он не будет ни в одной ветви. Это все еще полезно, когда вы хотите go к более старой ревизии и смотреть на вещи, но не вносить никаких изменений.

Когда вы пишете git checkout <revision> <paths>, то, что вы написали здесь, вы спрашиваете Git чтобы изменить рабочее дерево и индекс (промежуточную область), чтобы указанные вами файлы были версиями для данной конкретной ревизии. Другими словами, написав git checkout <sha> ., вы попросили Git изменить рабочее дерево и индекс, чтобы он полностью соответствовал этой фиксации, но вы не изменили то, на что указывает HEAD (фактический указатель ветви). Задание определенных путей может быть хорошим способом извлечения указанных c старых версий файлов, если вам нужно, но, вероятно, это не то, что вы хотели.

Если вы сделали коммит сейчас, вы бы в какой бы ветке вы ни находились, но у вас будут все файлы в точности как в указанной вами ревизии, что означает, что вы, вероятно, отмените много работы. Чтобы отменить это и вернуться в нормальное состояние, выполните git reset HEAD ., а затем git checkout .. Это отменит изменения в рабочем дереве и оставит вас с чистым рабочим деревом при коммите, на котором вы были.

Чтобы создать и проверить новую ветку с заданной ревизией, напишите git checkout -b <new-branch> <revision>. Если вы просто хотите создать его в данной ревизии, не проверяя его, используйте git branch <new-branch> <revision>.

1 голос
/ 18 марта 2020

Я что-то не так делаю или это поведение по умолчанию?

Я думаю, что git checkout <sha1 of commit> . не работает. Вы должны использовать git checkout <sha1 of commit>, следовательно, избегайте . в конце.

Если я хочу построить с определенным коммитом, мне нужно создать новую ветку с этим коммитом

Нет, проверка работает нормально. Если вы хотите добавить новую функцию, рекомендуется создать новую ветку .

Лучше всего.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...