Я не эксперт по git, но я столкнулся с таким поведением и мне удалось вернуться в рабочее состояние, поэтому вот мои советы, все из которых работают с git версии 2.28.0 (и, вероятно, более ранние версии) . Я подозреваю, что кто-то, кто был более опытен в git
, мог бы упростить этот ответ.
Это происходит со мной, когда я что-то сделал, чтобы испортить мою локальную ветку master
/main
, из-за чего она не синхронизируется с той, которую она должна отслеживать. Я еще не понял, что я сделал, чтобы все испортить, поскольку это случалось недостаточно часто, чтобы я мог диагностировать ошибку в своем поведении. [Обновление: я думаю, что теперь я видел одно поведение в моем собственном рабочем процессе, которое вызывает это. Я захожу на GitHub, чтобы просмотреть PR, и использую ссылку для копирования из информации о инструкциях командной строки, чтобы узнать, как получить копию PR в моей рабочей области. Первая из двух копируемых команд — git checkout -b ...
. Однако иногда я непреднамеренно делаю это в рабочей области, в которой уже есть ветка с таким именем (как правило, я уже пробовал более ранний черновик PR), поэтому команда не работает, я все еще нахожусь в своей главной/основной ветке. , а затем вставляется следующая команда и объединяет ветку с моим master/main. Затем мне требуется некоторое время, чтобы понять, что все запуталось].
Я замечаю, что попал в это состояние двумя способами:
- через всплывающее окно редактора, когда я делаю
git pull origin master
(как указано в OP)
- когда PR, который я отправил на GitHub, показывает коммиты в форме
Merge branch 'master' of https://github.com/[myOrg]/[myRepo] into master
Вот как я исправляю это, когда это происходит:
- First, I find the oldest merge commit with this message in my branch's history:
- browse the log:
git log
- искать в прошлом самый старый коммит с сообщением
Merge branch 'master' of https://github.com/[myOrg]/[myRepo] into master
- найдите SHA коммита непосредственно перед этим (т. е. точку, в которой моя ветка
master
отклоняется от той, которую она должна отслеживать)
- Back my branch up to that SHA:
git checkout [SHA]
- this will put your branch into 'detached HEAD' state
- Переименуйте мою испорченную основную ветку, чтобы убрать ее с пути
git branch -m master master-broken
(по желанию вы можете удалить ее, но это безопаснее, и вы всегда можете удалить ее позже)
- Переименуйте мою текущую отдельную ветку HEAD в master:
git checkout -b master
- Верните ветку туда, где она должна быть:
git pull [upstream source] master
(где, в случае OP, я ожидаю, что это будет git pull origin master
)
Ключевым моментом для понимания этого исправления является осознание того, что в ветке master
нет ничего особенного — это просто соглашение. Так что нет проблем с его удалением (или переименованием) и созданием нового с тем же именем.
person
Brad
schedule
04.03.2021
git commit
в первую очередь? - person bozdoz   schedule 07.03.2013pull
всегда просто добавляют к тому, что было раньше, или вы тем временемcommit
делаете что-то еще? Возможно, вам следует вместо этого делатьgit pull --rebase
? - person vonbrand   schedule 07.03.2013git commit
. @vonbrand - я не совсем понимаю, что вы спрашиваете оpull
- person Studio4Development   schedule 08.03.2013