Чтобы переместить указатель ветки извлеченной ветви, можно использовать git reset --hard
команду. Но как переместить указатель ветки не проверенной ветки, чтобы он указывал на другой коммит (сохраняя все остальные вещи, такие как отслеживаемая удаленная ветка)?
git
git-branch
словцо
источник
источник
git branch <branch-name> <SHA-1-of-the-commit>
и сбросить старую ветку?Ответы:
Вы можете сделать это для произвольных ссылок. Вот как переместить указатель ветки:
Общая форма:
Вы можете выбрать nits в сообщении reflog, если хотите - я думаю, что
branch -f
оно отличается от тогоreset --hard
, и это не совсем одно из них.источник
git branch -f
. Чтобы быть конкретным, этот метод выглядит следующим образом: (A) труднее использовать (B) труднее запомнить и (C) более опасноисточник
git update-ref -m "reset: Reset <branch> to <new commit>" <branch> <commit>
. (Вы можете выбрать nits в сообщении reflog, если хотите - я думаю, чтоbranch -f
оно отличается от тогоreset --hard
, и это не совсем одно из них.)git help branch
говорит "-f, --force Сбросить <branchname> в <startpoint>, если <branchname> уже существует. Без -f git branch отказывается изменить существующую ветку."git branch -f master <hash>
и это говорит мне,fatal: Cannot force update the current branch.
мммм, я должен сделать то, что сейчас, проверить какую-то другую случайную ветку, прежде чем мне разрешат использовать эту команду?HEAD
указывает на нее).Вы также можете передать
git reset --hard
ссылку на коммит.Например:
Я нахожу, что я делаю что-то вроде этого редко:
Предполагая эту историю
источник
git update-ref
как описано выше.git reset --hard ...
Нет необходимости повторять это здесь! :-(Просто чтобы обогатить обсуждение, если вы хотите переместить
myBranch
ветку в ваш текущий коммит, просто пропустите второй аргумент после-f
Пример:
git branch -f myBranch
Я обычно делаю это, когда нахожусь
rebase
в состоянии Detached HEAD :)источник
В
gitk --all
:Помните, что пересоздание вместо изменения существующей ветви приведет к потере информации о ветви отслеживания . (Как правило, это не проблема для простых случаев использования, когда есть только один удаленный узел, а ваша локальная ветвь имеет то же имя, что и соответствующая ветвь на удаленном устройстве. Дополнительные сведения см. В комментариях, спасибо @mbdevpl за указание на этот недостаток.)
Было бы здорово, если бы
gitk
имел функцию, где диалоговое окно имеет 3 варианта: перезаписать, изменить существующий или отменить.Даже если вы обычно такой же любитель командной строки, как и я,
git gui
иgitk
довольно хорошо разработаны для подмножества использования git, которое они позволяют. Я настоятельно рекомендую использовать их для того, что у них хорошо получается (например, выборочное размещение фрагментов в / из индекса в git gui, а также просто фиксация. (Ctrl-s для добавления подписи: line, ctrl-enter для фиксации .)gitk
отлично подходит для отслеживания нескольких веток, когда вы сортируете свои изменения в симпатичную серию патчей для отправки в апстрим или что-то еще, где вам нужно отслеживать то, что вы находитесь в середине с несколькими ветками.У меня даже нет графического браузера файлов, но я люблю gitk / git gui.
источник
git status
выход влияет. Кроме того, в некоторых случаяхgit fetch
иgit push
не будет работать без явного указания удаленного, если вы не установите ветвь отслеживания. Я не знаю обо всех случаях, но для меня общее эмпирическое правило заключается в том, что для удобства и скорости работы лучше иметь следящие ветви по порядку.Рекомендуемое решение
git branch -f branch-pointer-to-move new-pointer
в TortoiseGit :источник
Честно говоря, я удивлен, как никто не думал о
git push
команде:Точка (.) Указывает на локальный репозиторий, и вам может понадобиться опция -f, потому что пункт назначения может находиться «за своим удаленным аналогом» .
Хотя эта команда используется для сохранения изменений на вашем сервере, результат точно такой же, как если бы перемещение удаленной ветви (
<branch>
) выполнялось в том же коммите, что и в локальной ветви (<destination>
).источник
-f
чтобы избежать засорения чего-либо локального; например,git fetch origin && git push . origin/develop:develop
это неgit checkout develop && git pull --ff-only
Откройте файл
.git/refs/heads/<your_branch_name>
и измените хэш, хранящийся там, на тот, куда вы хотите переместить заголовок вашей ветви. Просто отредактируйте и сохраните файл в любом текстовом редакторе. Просто убедитесь, что ветвь для изменения не является текущей активной.Отказ от ответственности: Вероятно, не рекомендуемый способ сделать это, но выполняет свою работу.
источник
В случае, если коммит, на который вы хотите указать, находится перед текущей веткой (что должно быть в случае, если вы не хотите отменить последние коммиты текущей ветки), вы можете просто сделать:
источник
git push . <commit>:<branch>
как уже предложено.