Как да извършите презаписване на промените в главния клон (main branch)?
sobes.tech AI
Отговор от AI
Използвайте git revert или git rebase (в интерактивен режим или git rebase --onto за по-сложни сценарии) с последващ git push -f.
git revert създава нов комит, който отменя промените от посочените комити. Това е по-безопасен вариант, тъй като се запазва историята.
# Отмяна на последния комит
git revert HEAD
# Отмяна на конкретен комит по неговия хеш
git revert <commit-hash>
# Отмяна на диапазон от комити (без последния)
git revert <начален-хеш>..<краен-хеш>
# Отмяна на диапазон от комити (включително и двата)
git revert -n <начален-хеш>^..<краен-хеш>
# Отмяна на промени, прилагани като една цялост без създаване на отделни комити за всяка от тях
git revert -n <commit-hash-или-диапазон>
# Прилагане на създадения комит
git commit -m "Revert changes"
git rebase позволява да пренапишете историята на комитите. Може да се използва за изтриване, обединяване или промяна на реда на комитите. Изисква внимание, особено при общи клонове.
# Стартиране на интерактивен rebase за последните N комита
git rebase -i HEAD~N
# В отворения редактор сменете 'pick' с 'drop' срещу комитите, които искате да изтриете.
# Запазете и затворете файла.
# Сценарий с rebase --onto: преместване на комитите A, B, C от клон feature към master,
# игнорирайки комит D, който беше на feature.
# Текущият клон feature
# X -- Y -- Z -- D -- A -- B -- C (feature)
# /
# W (master)
# Цел: X -- Y -- Z -- W -- A -- B -- C (master)
git rebase --onto master D feature
# Където:
# master - целевият клон, към който преместваме
# D - комитът, до който изключваме преместването от изходния клон feature
# feature - изходният клон, от който взимаме комитите за преместване
След прилагане на git revert или git rebase на главния клон, ще е необходимо принудително изпращане на промените (git push -f или git push --force-with-lease), тъй като локалната история се разминава с отдалечената.
# Принудително изпращане след rebase
git push -f origin main
# По-безопасно принудително изпращане
git push --force-with-lease origin main
Важно: Презаписването на историята на общ клон (main) е силно нежелателно, тъй като може да наруши работата на други разработчици, които вече са синхронизирали с предишната версия на историята. Предпочита се git revert. git rebase на главния клон трябва да се използва само в изключителни случаи и при пълна увереност в последствията, обикновено след съгласуване с цялата екип.