Переместить указатель ветки на другой коммит без проверки
Чтобы переместить указатель ветки извлеченной ветви, можно использовать git reset --hard
команда. Но как переместить указатель ветки не проверенной ветки, чтобы он указывал на другой коммит (сохраняя все остальные вещи, такие как отслеживаемая удаленная ветка)?
11 ответов
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
один, и это не совсем один из них.
Вы также можете пройти 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
Просто чтобы обогатить обсуждение, если вы хотите переехать myBranch
перейти к вашему текущему коммиту, просто пропустите второй аргумент после -f
Пример:
git branch -f myBranch
Я обычно делаю это, когда я rebase
в то время как в состоянии ОТДЕЛЬНАЯ ГОЛОВА:)
Git 2.23.0 представил git-switch
команда, которая также может быть использована для этого.
git switch -C <branch-name> [<start-point>]
В
-C
(верхний регистр C) указывает, что если
<branch-name>
уже существует, он будет сброшен на.
С
-c
(строчная буква C) он попытается создать новую ветку, но не удастся, если она уже существует.
<start-point>
может быть хешем, тегом или другим именем ветки.
Если вы хотите переместить невыбранную ветку в другую фиксацию, самый простой способ - запустить команду git branch с параметром -f, который определяет, на что должна указывать HEAD ветки:
git branch -f
Будьте осторожны, так как это не сработает, если ветка, которую вы пытаетесь переместить, является вашей текущей веткой. Чтобы переместить указатель ветки, выполните следующую команду: git update-ref -m "reset: сбросить на" refs / Heads /
Команда git update-ref безопасно обновляет имя объекта, хранящееся в ссылке.
Надеюсь, мой ответ вам помог. Источником информации является этот фрагмент.
В gitk --all
:
- щелкните правой кнопкой мыши на коммите вы хотите
- -> создать новую ветку
- введите название существующей ветви
- нажмите return в диалоговом окне, которое подтверждает замену старой ветви с таким именем.
Помните, что пересоздание вместо изменения существующей ветви приведет к потере информации о ветви отслеживания. (Как правило, это не проблема для простых случаев использования, когда есть только один удаленный узел, а ваша локальная ветвь имеет то же имя, что и соответствующая ветвь на удаленном узле. Дополнительные сведения см. В комментариях, спасибо @mbdevpl за указание на этот недостаток.)
Было бы круто если gitk
была функция, в которой диалоговое окно имело 3 варианта: перезаписать, изменить существующий или отменить.
Даже если вы обычно такой же наркоман из командной строки, как я, git gui
а также gitk
довольно хорошо разработаны для подмножества использования git, которое они позволяют. Я настоятельно рекомендую использовать их для того, что у них хорошо получается (например, выборочное размещение фрагментов в / из индекса в git gui, а также просто фиксация. (Ctrl-s для добавления подписи: line, ctrl-enter для фиксации.)
gitk
отлично подходит для отслеживания нескольких веток, когда вы сортируете свои изменения в симпатичную серию патчей для отправки в апстрим или что-то еще, где вам нужно отслеживать то, что вы находитесь в середине с несколькими ветками.
У меня даже нет графического браузера файлов, но я люблю gitk/git gui.
Рекомендуемое решениеgit branch -f branch-pointer-to-move new-pointer
в TortoiseGit:
- "Git Show log"
- Проверьте "Все филиалы"
- В строке, на которую вы хотите переместить указатель ветви (new-pointer):
- Щелкните правой кнопкой мыши "Создать ветку в этой версии"
- Рядом с "Ветвью" введите название ветви для перемещения (ветка-указатель для перемещения)
- В разделе "Base On" проверьте правильность нового указателя.
- Проверьте "Сила"
- Хорошо
Честно говоря, я удивлен, как никто не думал о git push
команда:
git push -f . <destination>:<branch>
Точка ( .) Указывает на локальный репозиторий, и вам может понадобиться опция -f, потому что пункт назначения может находиться "за своим удаленным аналогом".
Хотя эта команда используется для сохранения ваших изменений на вашем сервере, результат точно такой же, как при перемещении удаленной ветви (<branch>
) на тот же коммит, что и локальная ветка (<destination>
)
Открыть файл .git/refs/heads/<your_branch_name>
, и измените хэш, хранящийся там, на тот, в который вы хотите переместить заголовок своей ветки. Просто отредактируйте и сохраните файл в любом текстовом редакторе. Просто убедитесь, что ветвь, которую нужно изменить, не является текущей активной.
Отказ от ответственности: вероятно, не рекомендуется, но выполняет свою работу.
Для проверенной ветки в случае, если фиксация, на которую вы хотите указать, находится перед текущей веткой (что должно иметь место, если вы не хотите отменить последние фиксации текущей ветки), вы можете просто сделать:
git merge --ff-only <commit>
Это более мягкая альтернатива git reset --hard
, и не удастся, если вы не в описанном выше случае.
Чтобы сделать то же самое для ветки без проверки, эквивалент будет:
git push . <commit>:<branch>