Как я могу отменить последний коммит в репозитории git bare? - PullRequest
86 голосов
/ 07 января 2011

Принимая во внимание, что есть несколько команд git, которые не имеют смысла в пустом хранилище (потому что пустые хранилища не используют индексы и не имеют рабочего каталога),

git reset --hard HEAD^ 

не является решением для отмены последнего изменения в таком хранилище.

При поиске в Интернете все, что я мог найти в этой теме, это это , в котором мне предлагаются три способа сделать это:
1. «обновить ссылку вручную (что связано с сантехникой)»;
2. «git push -f из не пустого хранилища»;
3. «git branch -f this $that».

Какое решение вы считаете более подходящим или какие есть другие способы сделать это? К сожалению, документация, которую я нашел о репозиториях git bare, довольно скудная.

Ответы [ 4 ]

123 голосов
/ 07 января 2011

Вы можете использовать команду git update-ref. Чтобы удалить последний коммит, вы должны использовать:

$ 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 .

29 голосов
/ 12 апреля 2011

Если вы используете следующее в голом репо:

git reset --soft <commit>

, тогда вы не столкнетесь с проблемами, связанными с использованием опций --hard и --mixed в голом репо, так как выне пытаться изменить что-то, чего нет в репо (то есть рабочее дерево и индекс).В вашем конкретном случае вы бы хотели использовать (из простого репо):

git reset --soft HEAD^

Кому переключать ветви на удаленном репо do:

git symbolic-ref HEAD refs/heads/<branch_name>
7 голосов
/ 07 января 2011

git push -f должно работать нормально:
, если вы клонируете этот голый репо, удалите последний коммит (git reset --hard HEAD^, как вы упомянули, но в локальном репозитории без обнажения) и отодвиньте назад (-f):

  • вы не изменяете SHA1 для других коммитов, предшествующих удаляемому вами.
  • вы уверены, что отодвигаете точное содержимое голого репо за вычетом дополнительного коммита(потому что вы только что сначала клонировали его).
2 голосов
/ 31 января 2012

Вы также можете использовать нотацию git refspec и сделать что-то вроде этого:

git push -f origin +<commit you want to revert to>:<destination_head | branch_name>

Это принудительно обновляет ветку назначения (как обозначено ссылкой) до исходного коммита, как обозначено+<object ref> часть.

...