Чтобы перенести указатель на ветку вывешенной ветки, можно использовать команду 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>