Как мне «переместить» мои коммиты из «без ветки» в реальную ветку? - PullRequest
36 голосов
/ 21 января 2012

Я допустил ошибку и начал делать коммиты "до последнего тега", что делает мои коммиты "без ветки" Они должны были быть применены во главе уже существующего филиала. Я не отодвинул свои изменения. Я нашел несколько других вопросов, когда коммиты находятся в ветке неправильный , но теперь у меня есть ветка no , поэтому я не знаю, как с этим справиться.

Предпочтительно, я бы хотел полностью стереть свою ошибку и «переместить» мои изменения в конец правой ветви. Если я должен оставить свою ошибку в истории, я должен объединить их как минимум.

Ответы [ 5 ]

67 голосов
/ 21 января 2012

В данный момент вы находитесь в состоянии отсоединенная ГОЛОВА . Чтобы решить эту проблему, все, что вам нужно сделать, это создать новую ветку с git branch <branchname> или git checkout -b <branchname>. Это даст вам локальную ветку, с которой вы можете играть, и даже удалить, когда закончите.

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

Ваша "ошибка" должна быть не удалена, вы просто создали новые коммиты поверх предыдущих. Вы не изменили историю или что-то в этом роде.

РЕДАКТИРОВАТЬ: В ответ на ваш комментарий, вам нужно сделать:

git branch temp
git checkout master # or any other branch
git merge temp
git branch -d temp
16 голосов
/ 21 января 2012

Вы можете просмотреть все свои коммиты, используя git reflog

Так что вы можете просто перейти в другую ветку и сделать git cherry-pick <commit-hash> для необходимых коммитов.путь разветвления, как упоминалось spatz.

7 голосов
/ 20 ноября 2012

Примечание: у вас также есть

enter image description here

В обоих случаях решение заключается в создании ветви tmp и объединении ее с фактической ветвью.

5 голосов
/ 10 апреля 2014

Другое решение, которое не включает создание временной ветки, описано здесь . Вы просто сливаетесь с последним коммитом, а не с временной веткой.

$ git checkout master
$ git merge d2bdb98

Если вы не знаете, на каком коммите вы находитесь, вы можете найти его с помощью git log. Я не знаю, отличается ли это решение от «сбора вишни», но оно дало ожидаемые для меня результаты.

1 голос
/ 25 марта 2014

У меня только что была ситуация, когда у меня была ветка master, которую я хотел зафиксировать, но случайно зафиксировал отсоединенный HEAD (обратите внимание, хеш коммита здесь не важен, но только для иллюстрации ситуации):

$ git branch
* (detached from 29d2cfb)
  master

Вот мое быстрое решение:

$ git branch -f master HEAD
$ git checkout master
Switched to branch 'master'
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

Кусок торта.

Обратите внимание, что этот трюк работает только в том случае, если master первоначально указывал на тот же коммит, над которым вы сделали свой ошибочный коммит. Если это не так, вам придется выполнить ребазинг (или выбор вишни, или слияние ...).

...