Как переместить HEAD обратно в предыдущее место? (Отдельная головка)

В git я пытался выполнить squash commit путем слияния в другой ветке и затем сброса HEAD в предыдущее место с помощью:

git reset origin/master

Но мне нужно выйти из этого. Как переместить HEAD обратно в предыдущее место?

У меня есть SHA1 frag (23b6772) коммита, который мне нужно переместить.
Как я могу вернуться к этой фиксации?

50
задан timpone 30 дек. '16 в 0:53
источник поделиться
3 ответов

Перед ответом добавьте некоторый фон, объяснив, что это за 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 не указывает на кончик текущей ветки

введите описание изображения здесь


Несколько вариантов восстановления после отсоединенной головки:


git checkout

git checkout <commit_id>
git checkout -b <new branch> <commit_id>
git checkout HEAD~X // x is the number of commits t go back

Это проверит новую ветвь, указывающую на требуемую фиксацию.
Эта команда проверит чек на коммит.
На этом этапе вы можете создать ветку и начать работу с этой точки.

# Checkout a given commit. 
# Doing so will result in a `detached HEAD` which mean that the `HEAD`
# is not pointing to the latest so you will need to checkout branch
# in order to be able to update the code.
git checkout <commit-id>

# create a new branch forked to the given commit
git checkout -b <branch name>

git reflog

Вы всегда можете использовать reflog.
git reflog отобразит любое изменение, которое обновило HEAD и проверив нужную запись reflog, установит HEAD обратно на эту фиксацию.

Каждый раз, когда HEAD изменяется, в reflog

появится новая запись,
git reflog
git checkout HEAD@{...}

Это вернет вас к вашему желаемому фиксации

введите описание изображения здесь


git reset HEAD --hard <commit_id>

"Верните свою голову назад к желаемому фиксации.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.
  • Примечание: (Поскольку Git 2.7)
    вы также можете использовать git rebase --no-autostash.


git revert <sha-1>

"Отменить" заданный диапазон фиксации или фиксации.
Команда reset "отменяет" любые изменения, сделанные в данной фиксации.
Новая фиксация с патчем отмены будет совершена, а исходная фиксация останется в истории.

# add new commit with the undo of the original one.
# the <sha-1> can be any commit(s) or commit range
git revert <sha-1>

Эта схема иллюстрирует, какая команда выполняет что.
Как вы можете видеть там reset && checkout изменить HEAD.

введите описание изображения здесь

130
ответ дан CodeWizard 30 дек. '16 в 0:56
источник поделиться

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

Если

вы находитесь в "отдельной голове"
(т.е. тип git status, вы видите HEAD detached at <commit_id>)

и

существующая ветка соответствует вашим потребностям
(т.е. тип git branch -v, вы видите имя ветки с связанными сообщениями фиксации, представляющими работу, которую вы хотите продолжить)

Тогда

просто проверьте, что ветвь (т.е. тип git checkout <branch_name>, вы видите Switched to branch <branch_name>).

Результаты

Теперь вы можете продолжать добавлять и выполнять свою работу по-прежнему; изменения будут отслеживаться на <branch_name>.

Обратите внимание, что если вы сохранили работу, когда HEAD был отсоединен, в большинстве случаев эта работа будет автоматически объединена в описанном выше процессе. Если вы видите сообщение о конфликте слиянием, не паникуйте. Существует несколько замечательных руководств с простыми шагами для устранения конфликта и завершения слияния.

5
ответ дан ownsourcing dev training 09 авг. '16 в 17:10
источник поделиться

Вопрос может быть прочитан как:

Я был в состоянии отсоединения с HEAD в 23b6772 и набрал git reset origin/master (потому что я хотел сквош). Теперь я передумал, как вернуться к HEAD в 23b6772?

Прямой ответ: git reset 23b6772

Но я столкнулся с этим вопросом, потому что мне стало больно печатать (копировать и вставлять) хэши фиксации или его аббревиатуру каждый раз, когда я хотел ссылаться на предыдущий HEAD, и был Googling, чтобы увидеть, есть ли какая-либо стенография.

Оказывается, есть!

git reset - (или в моем случае git cherry-pick -)

Что, кстати, было таким же, как cd -, чтобы вернуться в предыдущий текущий каталог в * nix! Так ура, изучил две вещи одним камнем.

0
ответ дан antak 22 июля '17 в 7:46
источник поделиться

Другие вопросы по меткам