Ответ 1
Если ваш репозиторий не используется другими людьми, вы можете безопасно выполнить git push -f
, чтобы перезаписать удаленную ветвь.
Я все еще пытаюсь узнать (основные?) тонкости Git и сумел попасть в беду. Я понял, что я допустил некоторые ошибки в HEAD, проверил старшую фиксацию и начал кодирование оттуда. Когда я пытаюсь нажать, мне говорят, что моя текущая фиксация позади, и мне нужно объединиться с HEAD. Git рекомендует "git pull". Однако HEAD имеет код, который я хочу игнорировать. Как решить эту проблему? Большое спасибо за помощь.
Flowchart:
-------- HEAD (bad) ---------------------- + (behind conflict, requires
\ / merge with HEAD, which is
\------- Current commit (good) ----/ bad and needs to be ignored)
Если ваш репозиторий не используется другими людьми, вы можете безопасно выполнить git push -f
, чтобы перезаписать удаленную ветвь.
Вот что вы можете сделать:
git checkout <branch-to-modify-head>
git reset --hard <commit-hash-id-to-put-as-head>
git push -f
Если вы не нажмете push, git выкинет эту ошибку: обновления были отклонены, потому что конец вашей текущей ветки отстает.
Обратите внимание, что это повлияет на вашу историю git, так что другой способ сделать это - вернуть все, что вы не хотите. Таким образом, вы сохраняете свою историю:
git revert commit-id
Приветствия
Как я это делаю:
git reset --hard <commit-SHA>
git push origin HEAD:<name-of-remote-branch>
Это способ git рекомендует и делает git push -f
может быть проблематичным для всех остальных в команде разработчиков
ANeves прав, "git push -f" работает только потому, что вы были единственным человеком, использующим репозиторий. Это не приемлемое решение для большинства людей.
Здесь ваша текущая история фиксации:
---A-B < HEAD (bad)
\
C < my_branch (good)
У вас есть необходимые решения: Как мне переписать, а не "слить" , ветку на другую ветку в Git?
Чтобы вернуться,
git checkout my_branch
git merge -s ours HEAD
Это остановит все изменения в ветке HEAD и даст вам следующее:
--A-B-D < HEAD, my_branch (both good)
\ /
C
D фактически совпадает с C в этом случае, у него просто разные родители.
Я немного опоздал на вечеринку - мне пришлось сделать:
git push -f origin HEAD:<name-of-branch>
Единственное, что сработало для меня:
git checkout <OLD_COMMIT>
git branch temp
git checkout temp
git branch -f master temp
git checkout master
git branch -d temp
Для тех из нас, кто работает с защищенными ветвями, push -f не вариант.
Вместо:
Checkout HEAD
diff {hash of desired commit to use as new HEAD} > myChange.patch
git apply
commit
push
Если у вас есть изменения, которые вы хотели бы объединить с новой версией HEAD, например OP, я бы сначала сделал их резервные копии, исправил бы удаленное репо, а затем применил изменения.
Это также сохраняет вашу историю репо.