Git отменяет публичный коммит только в локальном репозитории
Предположим, что существует публичный коммит "xxxx", который, по- моему, вызвал ошибку, и я хочу поэкспериментировать локально с отменой этого коммита.
Если я правильно понимаю из документации по git revert
( 1, 2), он обрабатывает изменения, необходимые для возврата целевого коммита xxxx, и автоматически помещает их в публичный репозиторий. Это верно? Это та последняя часть, о которой я беспокоюсь.
То есть будет git revert xxxx
вернуть хххх в публичный репозиторий?
Если так, есть ли способ сделать это только в моей локальной рабочей папке, чтобы я мог создать копию HEAD с отмененным коммитом и поэкспериментировать с ним, не затрагивая других разработчиков?
Нужно ли использовать --no-commit
опция: git revert xxxx --no-commit
?
Или есть другой способ сделать это?
Благодарю.
2 ответа
Вопреки тому, что вы, очевидно, читали или слышали, git revert
ничего не толкает в удаленный репозиторий. Он просто добавляет один (или, возможно, больше) новый коммит в HEAD вашей ветви, который функционально отменяет коммит или передает вам передаваемые параметры. Если у вас был коммит abcd1234
и ты побежал
git revert abcd1234
Затем Git добавит новый коммит в вашу ветку, чтобы отменить этот коммит.
В общем, все идет только с вашего локального Git на удаленный через git push
, так что пока вы на самом деле этого не делаете, вы должны быть в чистоте.
Если вы чувствуете себя очень осторожно, вы всегда можете создать новую ветку и проверить исправление ошибки, используя git revert
, Между прочим, многие люди, которые используют репозитории, такие как GitHub, будут настраивать критические ветки так, что даже в качестве меры предосторожности невозможно даже напрямую перейти к ним.
Нет, он не будет автоматически выдвигать возврат к публичному репо.
git revert <commit>
создаст только новый коммит в вашем локальном репо и git revert <commit> --no-commit
смените рабочий каталог на то, что будет после выполнения git revert <commit>
но на самом деле не создавать новый коммит, и вы можете использовать git revert --abort
отменить операцию.
Мы можем проиллюстрировать графиками:
Предположим, что публичный репозиторий и ваш локальный репозиторий сначала синхронизируются на master
ветка:
A---B---C---D master, origin/master
Если вы хотите отменить изменения коммита
B
в вашем местном репо. После выполненияgit revert <commit id for B>
, история коммитов будет:A---B---C---D---B' master | origin/master
Как вы можете видеть, есть создать новый коммит
B'
отменить изменение для коммитаB
, в то время какorigin/master
по-прежнему указывают на совершениеD
, Если вы не выполнитеgit push
, тогда публичное репо будет обновлено.Если вы выполните
git revert <commit id for B> --no-commit
, это изменит рабочий каталог git-репо, но обаmaster
а такжеorigin/master
по-прежнему указывают на совершениеD
,A---B---C---D master, origin/master
Если вы хотите, чтобы рабочий каталог был чистым, вы можете использовать
git revert --abort
,