Принимая во внимание, что есть несколько команд git, которые не имеют смысла в чистом репозитории (поскольку голые репозитории не используют индексы и не имеют рабочего каталога),
git reset --hard HEAD^
не является решением для отмены последнего изменения в таком репозитории.
Поискав в Интернете, все, что я смог найти, связанное с этой темой, - это то , в котором мне представлены три способа сделать это:
1. "обновить ссылку вручную (что включает в себя сантехнику)";
2. " git push -f
из репозитория non-bare";
3. " git branch -f this $that
".
Какое решение, по вашему мнению, более подходящее, или какие еще есть способы сделать это? К сожалению, документация, которую я нашел о репозиториях git bare, довольно скудна.
Ответы:
Вы можете использовать
git update-ref
команду. Чтобы удалить последнюю фиксацию, вы должны использовать:Или, если вы не в ветке, из которой не можете удалить последнюю фиксацию:
Вы также можете передать sha1, если хотите:
См. Документацию по команде git-update-ref .
источник
git update-ref <ref> <newvalue>
качестве правой ветви, например, "refs / Heads / master" вместо HEAD. Надеюсь, я правильно понял ваш вопрос.branch-name
аргументации. При использованииupdate-ref
с «веткой» вы обязательно должны указать полное ссылочное имя ветки (т.е. добавитьrefs/heads/
к обычному короткому имени ветки). Если вы просто используете короткое имя, вы в конечном итоге создадите / обновите$GIT_DIR/branch-name
вместо$GIT_DIR/refs/heads/branch-name
. Наличие обоихbranch-name
иrefs/heads/branch-name
вызовет предупреждения «имя ссылки… неоднозначно».Если вы используете следующее в чистом репо:
тогда вы не столкнетесь с проблемами, которые вы используете,
--hard
и--mixed
параметрами в голом репо, поскольку вы не пытаетесь изменить то, чего нет в голом репо (например, рабочее дерево и индекс). В вашем случае конкретно вы хотели бы использовать (из чистого репо):Чтобы переключить ветки на удаленном репо, выполните:
Чтобы увидеть текущую выбранную ветку, используйте:
https://mirrors.edge.kernel.org/pub/software/scm/git/docs/git-symbolic-ref.html
источник
git checkout other_branch
не работает на голом.git push -f
Должен работать нормально:если вы клонировать , что голое репо, удалить последний коммит (
git reset --hard HEAD^
как вы уже, но в местном , не голую репо) и толчок назад (-f
):источник
git reset --soft <sha1>
как показано в моем ответе ниже, не быть рекомендуемой практикой для перемещения HEAD на голом репо?reset --soft
должен работать, если выполняется непосредственно на голом репо. Я подозреваю, что это делается редко, потому что голое репо - это обычно репо восходящего потока (то есть репо, в которое вы отправляете данные), и в большинстве случаев у вас нет прямого локального доступа к нему. Но если вы это сделаете, то это, безусловно, еще один хороший пример использования "reset --soft
" (как в stackoverflow.com/questions/5203535/… ) Итак, +1 к вашему ответу.Вы также можете использовать нотацию git refspec и сделать что-то вроде этого:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
Это принудительно обновляет целевую ветку (как обозначено ссылкой) в исходную фиксацию, как обозначено
+<object ref>
частью.источник