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,

Другие вопросы по тегам