Как мне "переместить" мои коммиты из "без ветки" в реальную ветку?
Я допустил ошибку и начал совершать коммиты "с последним тегом", который закладывает мои фиксации в "никакой ветке". Они должны были применяться во главе уже существующего ветки. Я еще не внес изменений. Я нашел еще несколько вопросов, когда коммиты находятся в неправильной ветке, но теперь у меня нет ветки, поэтому я не знаю, как с этим справиться.
Предпочтительно, я хотел бы полностью удалить мою ошибку и "переместить" мои изменения в конец правой ветки. Если я должен оставить свою ошибку в истории, мне нужно объединить их по крайней мере.
Ответы
Ответ 1
В настоящее время вы находитесь в состоянии отсоединенного HEAD. Чтобы решить эту проблему, все, что вам нужно сделать, это создать новую ветвь с git branch <branchname>
или git checkout -b <branchname>
. Это оставит вас с локальным филиалом, с которым вы можете играть, и даже удалите его, когда закончите.
Ветви в git - это просто указатели на фиксации, поэтому, если вы создадите новую ветку, где вы являетесь новой ветвью, указывается на текущую фиксацию, а затем вы можете объединить ее или что-то еще.
Ваша "ошибка" не должна быть стерта, вы просто создали новые коммиты поверх предыдущих. Вы не изменяли историю или что-то в этом роде.
EDIT: в ответ на ваш комментарий вам нужно сделать следующее:
git branch temp
git checkout master # or any other branch
git merge temp
git branch -d temp
Ответ 2
Вы можете просмотреть все свои транзакции, используя git reflog
Итак, вы можете просто попасть в другую ветку и сделать git cherry-pick <commit-hash>
для требуемых коммитов.
Но я бы предпочел использовать ветку как spatz
.
Ответ 3
Примечание. У вас также есть
![enter image description here]()
В обоих случаях выполнение ветвления tmp
и объединение ее обратно в фактическую ветвь - это решение.
Ответ 4
Другое решение, которое не предусматривает создание временной ветки, описано здесь. Вы просто объединяетесь с последним коммитом, а не с временной веткой.
$ git checkout master
$ git merge d2bdb98
Если вы не знаете, какой коммит вы используете, вы можете найти его с помощью git log
. Я не знаю, отличается ли это решение от "сбора вишни", но оно дало ожидаемые результаты для меня.
Ответ 5
У меня была ситуация, когда у меня была ветвь 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
изначально указывал на тот же самый коммит, который вы совершили с ошибкой. Если это не так, вам придется переустанавливать (или вишневый выбор или слияние...).