Sobes.tech
Middle

Чӣ гуна навиштани тағйиротҳо дар шохаи асосӣ (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 <шуруъ-хеш>^..<охирин-хеш>
# Бекор кардани тағирот, ки ҳамчун як порсия татбиқ шудаанд, бе эҷоди комитҳои ҷудогона барои ҳар як
ngit 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 - шохаи манбаъ, ки аз он комитҳоро мегирем

Пас аз истифодаи 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 дар шохаи асосӣ танҳо дар ҳолатҳои истисноӣ ва бо итминон дар оқибатҳои он, одатан пас аз мувофиқа бо тамоми гурӯҳ, истифода мешавад.