Переместить указатель перехода на другую фиксацию без проверки

Чтобы перенести указатель на ветку вывешенной ветки, можно использовать команду git reset --hard. Но как переместить указатель ветки не проверенной ветки, чтобы указать на другую фиксацию (сохраняя все остальные вещи, такие как отслеживаемая удаленная ветвь)?

Ответ 1

NB Если вы просто хотите переместить ветку на другую фиксацию, самый простой способ -

git branch -f branch-name new-tip-commit

как подробно объяснил Крис Джонсен.

Вы можете сделать это для произвольных ссылок. Вот как переместить указатель на ветку:

git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

Общая форма:

git update-ref -m "reset: Reset <branch> to <new commit>" <ref> <commit>

Если хотите, вы можете выбрать nits о сообщении reflog - я считаю, что branch -f отличается от reset --hard, и это не совсем то, что из них.

Ответ 2

git branch -f <branch-name> <new-tip-commit>

Ответ 3

Вы также можете передать git reset --hard ссылку на фиксацию.

Например:

git checkout branch-name
git reset --hard new-tip-commit

Я нахожу, что я делаю что-то вроде этого полу-часто:

Предполагая эту историю

$ git log --decorate --oneline --graph
* 3daed46 (HEAD, master) New thing I shouldn't have committed to master
* a0d9687 This is the commit that I actually want to be master

# Backup my latest commit to a wip branch
$ git branch wip_doing_stuff

# Ditch that commit on this branch
$ git reset --hard HEAD^

# Now my changes are in a new branch
$ git log --decorate --oneline --graph
* 3daed46 (wip_doing_stuff) New thing I shouldn't have committed to master
* a0d9687 (HEAD, master) This is the commit that I actually want to be master

Ответ 4

Чтобы обогатить обсуждение, если вы хотите переместить ветвь myBranch на свой текущий, просто опустите второй аргумент после -f

Пример:

git branch -f myBranch


Я обычно делаю это, когда я rebase, находясь в состоянии отдельного состояния HEAD:)

Ответ 5

В gitk --all:

  • щелкните правой кнопкой мыши на фиксации, которую вы хотите.
  • создать новую ветку
  • введите имя существующей ветки
  • нажмите кнопку возврата в диалоговом окне, в котором подтверждает замену старой ветки этого имени.

Остерегайтесь того, что повторное создание вместо изменения существующей ветки потеряет информацию о отслеживании-ветки. (Обычно это не проблема для простых случаев использования, когда только один удаленный компьютер и ваш локальный филиал имеют то же имя, что и соответствующая ветвь на пульте дистанционного управления. См. Комментарии для получения более подробной информации, спасибо @mbdevpl за указание этого недостатка.)

Было бы здорово, если бы gitk имела функцию, в которой в диалоговом окне было 3 варианта: перезаписать, изменить существующее или отменить.


Даже если вы обычно как наркоман из командной строки, как я, git gui и gitk довольно хорошо разработаны для подмножества git использования, которое они разрешают. Я настоятельно рекомендую использовать их для того, на что они хороши (т.е. Выборочно размещать ханки в/из индекса в git gui, а также просто совершать. (Ctrl-s добавить строку с выводом: line, ctrl-enter для фиксации.)

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

У меня даже нет графического браузера файлов, но я люблю gitk/ git gui.

Ответ 6

Рекомендованное решение git branch -f branch-pointer-to-move new-pointer в TortoiseGit:

  • "Git Показать журнал"
  • Отметьте "Все ветки"
  • В строке вы хотите, чтобы указатель ветки переместился на (new-pointer):
    • Щелкните правой кнопкой мыши "Создать ветвь в этой версии"
    • Рядом с "Ветвь" введите имя ветки для перемещения (указатель-указатель на перемещение)
    • В разделе "Base On" проверьте правильность нового указателя.
    • Отметьте "Сила"
    • Ok

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

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

Ответ 7

Честно говоря, я удивлен, как никто не думал о команде git push:

git push -f . <destination>:<branch>

Точка (.) Указывает на локальный репозиторий, и вам может потребоваться опция -f, поскольку пункт назначения может находиться "за своим удаленным аналогом".

Хотя эта команда используется для сохранения ваших изменений на вашем сервере, результат точно такой же, как если бы перемещение удаленной ветки (<branch>) в тот же коммит, что и локальная ветка (<destination>)

Ответ 8

В случае, если коммит, на который вы хотите указать, опережает текущую ветвь (что должно произойти, если вы не хотите отменить последние коммиты текущей ветки), вы можете просто сделать:

git merge <commit>