Как вы изменяете зафиксированный файл на git? - PullRequest
0 голосов
/ 10 марта 2020

Я часто пу sh филиал, чтобы освоить, после осознания я сделал небольшие ошибки. Может быть неправильное имя файла или где-то пропущена запятая. Независимо от сценария, я ищу способ полностью изменить файлы с принудительной фиксацией БЕЗ создания новой фиксации сверху.

Я пытался использовать got commit --amend и git rebase, но они всегда добавьте еще один коммит наверх.

И да, я знаю об опасностях этого, но я работаю над этим проектом в одиночку, поэтому он очень нужен.

Ответы [ 2 ]

0 голосов
/ 10 марта 2020

Технически невозможно изменить любой коммит. Но на самом деле это не проблема, потому что технически просто и просто заменить коммит или даже целую цепочку коммитов новыми и улучшенными заменами. Проблема здесь не в замене коммитов, а скорее в том, что 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 репозитория, если он есть, может быть несколько новых коммитов участников, созданных поверх вашего коммита к настоящему моменту: отодвинуть ваше в сторону вам придется отбросить все их в сторону!

0 голосов
/ 10 марта 2020

Если вы хотите sh изменить только последний коммит или альтернативно заменить все последние x коммитов одним фиксированным коммитом, вы можете найти это решение немного проще:

Сброс предыдущего коммита, измените свои изменения, а затем осторожно, pu sh с флагом силы.
Имейте в виду, что после нажатия флага силы вы не сможете получить доступ к своему старому «ошибочному» основному коммиту или любым изменениям, внесенным после коммита, который вы сбросили в ; поэтому перед нажатием убедитесь, что вы ничего не напортачили.

git reset HEAD~1 //Previous commit
//Modify changes
git add -A
git commit -m "..."
git push --force  

Чтобы заменить два последних коммита, в первой строке приведенного выше фрагмента следует указать git reset HEAD~2, номер 3 за последние три и x за последние x.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...