Git - Сделать локальный HEAD новым мастером

Я решил вернуться несколько коммитов, потому что путь, который я следил, был неправильным. Поэтому я проверил Added cordova to .gitignore commit и внес некоторые изменения. Как показано ниже:

enter image description here

Теперь, когда я нажимаю новые изменения, появляется сообщение об ошибке:
error: src refspec (detached from aad6423) does not match any.

Как я могу сказать git отменить предыдущие коммиты (в фиолетовом) и продолжить с моей локальной HEAD как master?

Ответ 1

Даже если вам больше не нужна эта ветка, git действительно не любит переписывать историю или отбрасывать изменения. Просто верните и слейте.

git branch new_master              # name current detached HEAD
git checkout master                # switch back to master
git revert --no-edit HEAD~4..HEAD  # create commits reverting back to where the history split
git merge new_master               # merge
git branch -d new_master           # don't need it anymore

Ответ 2

Сделайте HEAD новым локальным master:

$ git checkout -B master

Внесите изменения:

$ git push -f

Ответ 3

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

git push origin :master // deletes remote master
git push origin master  // pushes local master to remote

Другой (возможно, лучший) подход состоял бы в том, чтобы вернуть коммиты для овладения и фиксации ревертов (которые сами совершают). Затем вишни выберите работу, которую вы сделали на своем местном. Во-первых, создайте новую ветку темы локально, чтобы сохранить свою работу.

git checkout -b <topic_branch_name>  // create new branch to save local work
git checkout master
git reset --hard HEAD // sync local master to remote HEAD

git revert <last commit to master>
git revert <second-to-last commit to master>
...
git revert <Added cordova to .gitignore commit>
git push

git cherry-pick <commit hash from topic branch commit(s)>

Ответ 4

Итак, я бы сделал это за пару шагов:

git checkout -b new_master

чтобы получить хороший справочник о том, что вы хотите, чтобы новый мастер был.

git checkout master ; git checkout -b old_master

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

git checkout master ; git reset --hard new_master

это сбросит заголовок ветки, в которой вы находитесь (master), к указанной ссылке (new_master).

git push -f origin

это сделает принудительное нажатие вашей новой главной ветки на удаленный. ОБРАТИТЕ ВНИМАНИЕ, что это плохая практика, если кто-то еще использует ваше удаленное репо, так как это потенциально может нарушить их выборки.

Ответ 5

Поскольку вы подталкивали изменения вверх по течению, лучший подход заключается в том, чтобы вернуть их с другой фиксацией. Конец, который отменяет изменения. Удаление коммитов или веток из вышележащего уровня - это bad. Подробнее см. .