В Git я пытался сделать это squash commit
путем слияния в другую ветку и затем сбрасывал HEAD
на предыдущее место через:
git reset origin/master
Но мне нужно выйти из этого. Как я могу переместить ГОЛОВУ назад в предыдущее место?
У меня есть фрагмент SHA-1 ( 23b6772
) коммита, в который мне нужно переместить его. Как я могу вернуться к этому коммиту?
git
git-checkout
git-reset
git-revert
git-reflog
timpone
источник
источник
git checkout 23b6772
стоит сделать.Ответы:
Прежде чем ответить, давайте добавим некоторый фон, объясняя, что это
HEAD
такое.First of all what is HEAD?
HEAD
это просто ссылка на текущий коммит (последний) в текущей ветке.Там может быть только один
HEAD
в любой момент времени (за исключениемgit worktree
).Содержимое
HEAD
хранится внутри.git/HEAD
и содержит 40 байтов SHA-1 текущего коммита.detached HEAD
Если вы не используете последний коммит, то
HEAD
есть он указывает на предыдущий коммит в историиdetached HEAD
.В командной строке это будет выглядеть так - SHA-1 вместо имени ветви, так как
HEAD
не указывает на конец текущей ветви:Несколько вариантов того, как восстановить систему с отключенной HEAD:
git checkout
Это извлечет новую ветку, указывающую на желаемый коммит.
Эта команда вернется к данному коммиту.
На этом этапе вы можете создать ветку и начать работать с этого момента.
git reflog
Вы всегда можете использовать
reflog
также.git reflog
будет отображаться любое изменение, которое обновило,HEAD
и проверка желаемой записи reflogHEAD
вернет этот коммит.Каждый раз, когда ГОЛОВКА модифицируется, в
reflog
Это вернет вас к желаемой фиксации
git reset --hard <commit_id>
«Переместите» ГОЛОВУ назад к желаемому коммиту.
git rebase --no-autostash
.git revert <sha-1>
"Отменить" данный диапазон фиксации или фиксации.
Команда сброса «отменит» любые изменения, сделанные в данном коммите.
Новый коммит с патчем отмены будет зафиксирован, в то время как оригинальный коммит останется в истории.
Эта схема иллюстрирует, какая команда что делает.
Как вы можете видеть,
reset && checkout
изменитеHEAD
.источник
Делать
Чтобы увидеть, если вы находитесь в правильном положении:
Вы увидите что-то
Затем переписайте историю на вашем пульте, чтобы отразить изменения:
источник
git push --force
. Во многих ситуациях это сделает вас на некоторое время наименее популярным человеком в команде ...git push --force-with-lease
(Thoughtbot статьи: thoughtbot.com/blog/git-push-force-with-lease )revert
как коммиты, я оказался в невероятно сложной ситуации.force-with-lease
дал мне уверенность, чтобы переписать историю мерзавцев ветви, не затрагивая работу других людей. Браво!Самое быстрое решение (всего 1 шаг)
использование
git checkout -
Вы увидите
Switched to branch <branch_name>
. Подтвердите, что это ветка, которую вы хотите.Краткое объяснение: эта команда вернет ГОЛОВУ обратно в последнюю позицию. См. Примечание о результатах в конце этого ответа.
Мнемоника: этот подход очень похож на использование
cd -
для возврата в ранее посещенный каталог. Синтаксис и применимые случаи довольно хороши (например, это полезно, когда вы действительно хотите, чтобы HEAD вернулся туда, где он был).Более методичное решение (2 шага, но запоминающееся)
Быстрый подход решает вопрос ОП. Но что, если ваша ситуация немного отличается: скажем, вы перезапустили Bash, а потом оказались с отключенной HEAD. В этом случае, здесь есть 2 простых, легко запоминающихся шага.
1. Выберите нужную ветку
использование
git branch -v
Вы видите список существующих местных филиалов. Возьмите название филиала, которое соответствует вашим потребностям.
2. Переместите ГОЛОВУ к нему
использование
git checkout <branch_name>
Вы увидите
Switched to branch <branch_name>
. Успех!Результаты
Используя любой из этих методов, вы можете продолжать добавлять и фиксировать свою работу, как и раньше: ваши следующие изменения будут отслеживаться
<branch_name>
.Обратите внимание, что оба
git checkout -
иgit checkout <branch_name>
будут давать дополнительные инструкции, если вы зафиксировали изменения, когда HEAD был отсоединен.источник
git checkout 8acc968
тоgit branch -v
естьMyBranch
в списке ниже ... но затемgit checkout MyBranch
удаляет мои комментарии.git checkout 8acc968
проверю коммит, а не ветку. ЕслиMyBranch
есть коммиты, которые вы хотите, попробуйтеgit checkout MyBranch
. Если он не содержит изменений в коммите 8acc968, вам необходимо объединить эти изменения после проверки ветви.git checkout
чтобы увидеть предыдущий коммит и хотел вернуться к последнему коммиту. Но без последнего коммита я был в значительной степени потерян. Это решение идеально подходит для моей ситуации!Вопрос можно прочитать как:
Я был в отдельном государстве с
HEAD
в23b6772
и напечаталgit reset origin/master
(потому что я хотел кабачки). Теперь я передумал, как мне вернуться кHEAD
тому, чтобы быть в23b6772
?Прямой ответ:
git reset 23b6772
Но я задал этот вопрос, потому что мне надоело набирать (копировать и вставлять) хэши коммитов или их аббревиатуру каждый раз, когда я хотел сослаться на предыдущий,
HEAD
и был в Google, чтобы посмотреть, есть ли какие-то сокращения.Оказывается, есть!
git reset -
(или в моем случаеgit cherry-pick -
)Что, кстати, было так же, как
cd -
вернуться к предыдущему текущему каталогу в * nix! Итак, ура, я узнал две вещи одним камнем.источник
Когда вы запустите команду,
git checkout commit_id
HEAD отсоединится от13ca5593d(say commit-id)
и ответвление будет доступно дольше.Вернитесь к предыдущему местоположению и выполните команду шаг за шагом -
git pull origin branch_name
(скажи мастер)git checkout branch_name
git pull origin branch_name
Вы вернетесь к предыдущему местоположению с обновленным коммитом из удаленного репозитория.
источник
Сегодня я по ошибке проверил коммит и начал работать над ним, делая некоторые коммиты в отключенном состоянии HEAD. Затем я отправил в удаленную ветку следующую команду:
затем
затем
Я наконец-то получил все изменения в моей ветке, которые я сделал в detach HEAD.
источник
Возможно, это не техническое решение, но оно работает. (если у кого-то из ваших товарищей по команде есть такая же ветка в локальной сети)
Давайте предположим , что ваше имя ветви в качестве филиала-ххх .
Шаги для решения:
Примечание: опять же, это не техническое решение, но оно обязательно поможет.
источник