Технически невозможно изменить любой коммит. Но на самом деле это не проблема, потому что технически просто и просто заменить коммит или даже целую цепочку коммитов новыми и улучшенными заменами. Проблема здесь не в замене коммитов, а скорее в том, что Git является распределенным , обновляя каждую копию хранилища, включая все клоны, которые все остальные сделали .
Вопрос, на который вы должны ответить в первую очередь, прежде чем делать что-либо еще: У кого еще есть этот коммит? Чтобы получить коммит, который вы сделали, вы должны дал это кому-то еще. Если у кого-то еще есть, они могут сказать своим друзьям, которые сообщают своим друзьям, и через несколько миллисекунд один сделанный вами коммит распределяется по десяти тысячам клонов.
Обычно вы даете новый скажем, GitHub, используя git push
. Если вы уже сделали git push
, то, по крайней мере, в репозитории Git на GitHub есть ваш коммит. Любой другой, кто может получить доступ к вашему хранилищу, может также скопировать его оттуда. Все ли они собираются перейти с вашего предыдущего коммита на ваш новый и улучшенный коммит? Если это так, не стесняйтесь заменить ваш плохой коммит на новый и улучшенный. Или, если никто другой не должен иметь его, или вам все равно, если они его имеют, вы можете продолжить.
Таким образом, есть два шага: заменить коммит локально, затем убедить другие Gits, чтобы сделать то же самое
Чтобы заменить коммит локально, вы можете:
- использовать
git commit --amend
(самый простой для последнего) - использовать
git reset
, как указано в другом ответе, только что опубликованном - , используйте
git rebase -i
, как предлагается в комментариях и почти дублированную ссылку - делайте все, что вам нравится: этот репозиторий ваш клон, ты можешь делать что хочешь! Но три метода, описанные выше, вероятно, самые простые.
Как только вы сделали локальную замену, вы должны убедить другой Git - тот, что на GitHub или где бы вы ни находились git push
- что они должны выбросить ваши старые коммиты в пользу ваших новых и улучшенных коммитов замены. Для этого вам, как правило, нужно использовать git push --force
или git push --force-with-lease
.
Обе операции сообщают другой Git: Да, я знаю, что это действие выбросит некоторые старые коммиты , Сделайте это в любом случае! Они переворачивают то, что в противном случае является вежливым запросом, , пожалуйста, если все в порядке, задайте для вашей ветви имя принудительной командой: Установите имя своей ветви! Пока поскольку у вас есть разрешение выдвигать такие требования, другой Git будет подчиняться вашей Git 's force-pu sh.
Разница между простой git push --force
и git push --force-with-lease
заключается в том, что с --force-with-lease
ваш Git отправляет более сложную команду в форме: Я думаю, что ваша ветвь _____ указывает на коммит _____. Если я прав, вместо этого установите _____. В любом случае, дайте мне знать, если я был прав. (Ваш Git заполняет эти пробелы названием ветви, которую вы хотите их Git, чтобы изменить, т.е. именем, которое вы используете в своем git push
- и два коммита га sh ID.)
Это означает, что опция --force-with-lease
позволяет вам обновлять общий репозиторий GitHub, проверяя, что вы делаете просто заменяет вашу ошибку. Если ваш репозиторий GitHub не является общим, вам не понадобится более интересная опция.
Использовать git commit --amend
легко
После выполнения коммита, если вы понимаете, что с мелочью что-то не так это, вы просто:
- исправьте все необходимые файлы и
git add
их при необходимости - затем запустите
git commit --amend
Опция --amend
говорит вашему Git: отодвинуть последний коммит с пути, заставив этот новый коммит заменить его, а не добавляя к нему. У вас есть возможность снова редактировать сообщение о коммите - вы можете использовать --no-edit
чтобы подавить это, если сообщение о коммите хорошо - и когда вы закончите, старый коммит нигде не будет виден. Это все еще есть в вашем хранилище , вы просто не можете увидеть это больше. Старый коммит останется на некоторое время - по крайней мере, на 30 дней по умолчанию - и вы сможете вернуть его, если потребуется, но в основном он будет заменен новым; новый - то, что вы увидите.
Убрав старый коммит с пути и заменив его новым и улучшенным, вам теперь может понадобиться использовать git push --force
или git push --force-with-lease
, чтобы убедить другого Git хранилище для также отбрасывает старый коммит в сторону нового в пользу нового. Помните, что у этого другого Git репозитория, если он есть, может быть несколько новых коммитов участников, созданных поверх вашего коммита к настоящему моменту: отодвинуть ваше в сторону вам придется отбросить все их в сторону!