Как я могу отменить последнюю фиксацию в репозитории Git bare?
принимая во внимание, что есть несколько команд git, которые не имеют смысла в голом репозитории (потому что голые репозитории не используют индексы и не имеют рабочего каталога),
git reset --hard HEAD^
не является решением для отмены последнего изменения в таком репозитории.
поиск через Интернет, все, что я мог найти, связанные с темой этой, в котором мне представлены три способа сделать это:
1. "обновите ref вручную (который включает сантехнику)";
2. "git push -f
не "голый " репозиторий";
3. "git branch -f this $that
".
какое решение вы считаете более подходящим или какие другие способы это сделать? К сожалению, документация, которую я нашел о git bare repositories, довольно плоха.
4 ответов
можно использовать . Чтобы удалить последнюю фиксацию, вы должны использовать:
$ git update-ref HEAD HEAD^
или если вы не находитесь в ветке, из которой вы не можете удалить последнюю фиксацию:
$ git update-ref refs/heads/branch-name branch-name^
вы также можете передать sha1, если хотите:
$ git update-ref refs/heads/branch-name a12d48e2
см. документацию git-update-ref.
если вы используете следующее в голом РЕПО:
git reset --soft <commit>
тогда вы не сталкиваетесь с проблемами, которые вы используете --hard
и --mixed
параметры в голом РЕПО, так как вы не пытаетесь изменить что-то, чего у голого РЕПО нет (т. е. рабочее дерево и индекс). В вашем случае конкретно вы хотели бы использовать (из голого РЕПО):
git reset --soft HEAD^
до переключение ветвей на удаленном РЕПО do:
git symbolic-ref HEAD refs/heads/<branch_name>
на git push -f
должно работать нормально:
если вы клонируете это голое РЕПО, удалите последнюю фиксацию (git reset --hard HEAD^
Как вы упомянули, но в локальном не-голом РЕПО) и нажмите назад (-f
):
- вы не меняете SHA1 для других коммитов, предшествующих удаленному.
- вы уверены, что отталкиваете точное содержимое голого РЕПО за вычетом дополнительной фиксации (потому что вы только что клонировали его первым).
вы также можете использовать нотацию git refspec и сделать что-то вроде этого:
git push -f origin +<commit you want to revert to>:<destination_head | branch_name>
это заставляет обновление ветви назначения (как обозначено ref) к исходному фиксации, как обозначено +<object ref>
часть.