Зачем использовать `git commit` в отключенном состоянии? - PullRequest
8 голосов
/ 17 декабря 2010

Используя git log Я нашел старую версию своего проекта, с которой я хотел связываться.Я сделал git checkout version52, в результате чего проект находился в состоянии detached , внес некоторые изменения, а затем git commit.Я не знал, что это произойдет в отдельном состоянии.

После этого я вернулся к своему мастеру с git checkout master, но когда я сделал git log, мои изменения больше не отображаются.Теперь я понимаю, что изменения застряли в моем version52.

. Я могу достаточно легко применить эти изменения с помощью git merge version52, но мне было просто интересно, какой смысл быть способным совершать изменения в отдельных состоянияхв мерзавце?Как новичок я некоторое время путался, и я не понимаю, почему это разрешено или когда использовать такую ​​функцию.

РЕДАКТИРОВАТЬ: Извините, я ранее писал «отключен», но я имел в виду «отключен».В git это происходит, когда вы решаете просмотреть ранее зарегистрированную версию вашего проекта.

Ответы [ 2 ]

6 голосов
/ 17 декабря 2010

В будущем вы должны были создать ветку для работы

git branch branchName version52
git checkout branchName

или

git checkout -b brannchName version52

Отредактировано после комментария

Модель объектов git, о которой я писал здесь , просто отслеживает дерево объектов. Ветвь - это указатель на коммит. Хотя оба они связаны, вам не нужно иметь ветку, указывающую на конец строки коммитов.

Когда вы создаете коммит, вы все равно создаете дерево объектов, которые будут существовать в хранилище, пока оно не станет старым, и вы запустите git-gc, чтобы очистить эти осиротевшие коммиты. Я думаю, что вас беспокоит то, что в ветке нет обязательных требований для коммитов. Это создает гибкость в инструменте, который иногда ловит пользователей, но git - продвинутый инструмент.

В вашем случае вы сделали коммит, а затем вернулись в свою основную ветку и думали, что потеряли свои коммиты, но если бы вы посмотрели на вывод git reflog, вы бы увидели ша кома, который вы создали, даже хотя это не было на ветке. Вы могли бы создать здесь ответвление git branch branchName <sha of commit>. Или вы могли бы объединить или перебазировать эти коммиты с / на другую ветку, не пройдя дополнительные шаги по созданию и удалению ветки только для этого. Итак, это всего лишь несколько дополнительных шагов, всего несколько нажатий клавиш; но это полезно в некоторых случаях.

Дело в том, что ветвь - это всего лишь сокращение от дерева коммитов, так же как тег - это сокращение от конкретного коммита. За исключением того, что когда вы делаете коммиты на ветке, указатель ветки перемещается вместе с последним коммитом.

Всегда есть указатель head, который указывает на последнюю фиксацию, которую вы извлекли, поэтому вы никогда не будете действительно «отключены»

3 голосов
/ 17 декабря 2010

Самостоятельная фиксация отдельной головы довольно бесполезна, но она также используется при интерактивном перебазировании, которое позволяет переписать историю дерева, если вы пометите коммит для редактирования.

После gitдостигает такого коммита, в то время как его перебазирование останавливает процесс, и вы можете изменить этот коммит с помощью git commit --amend или даже вставить новые коммиты, как вы это обычно делаете.Самое главное, что такие коммиты не относятся ни к одной ветви, как ясно показывает git status, поэтому вы фиксируете отсоединенную головку.

Многие пользователи Git, включая меня, считают, что интерактивный перебазирование является одной из наиболее полезных функций git иэто не сработало бы, если бы фиксация на отсоединенной головке была невозможна.

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