Git қотақбас!!!

Git қиын: жобаны бір пәсте жоғалтып алу оңай, және оны қалай қайтаруға болатыны түсініксіз. Git документациясы - қақпан: дұрыс шешімді табу үшін бәрін бастапқы қалпына әкелетін фичаның атын алдын ала білу керек.

Осы сайтта пиздец жағдайдан шығудың жолдарын көпшілікке жазып берейін.

Білә, мен бәрін құрттым, git-те сиқырлы уақыт машинасы бар ма!?!

git reflog
# бұл командамен гит-тің ішінде 
# cіз жасаған барлық тармақтардағы өзгерістерді көре аласыз  
# әрбір элементтің HEAD@{индекс} индексі бар 
# бүлдірерден бұрынғы индексті тауып алыңыз
git reset HEAD@{index}
# сиқырлы уақыт машинасы

Бұл команданы байқаусызда жойып алған заттарды кері қайтаруға, жобаны амын шығарған кодты алып тастауға, сәтсіз merge-дан кейін жобаны қайта қалпына келтіру үшін, немесе барлық нәрсе істеп тұрған кезге қайта оралу үшін қолданыңыз. Өзім reflog-ты жиі қолданамын және осы фичаны қосқан адамға алғысым шексіз.

Білә, мен коммит жасадым, кейін бір затты ұмытып кеткенім есіме түсті!

# өз өзгерісіңізді енгізіңіз
git add . # немесе жеке-жеке файлдарды қосыңыз
git commit --amend --no-edit
# енді осы өзгеріс сіздің соңғы коммитіңіздің ішінде
# ЕСКЕРТУ: жарияланған коммиттерді ешқашан өзгертпеңіз!

Егер мен коммит жасасам, содан кейін тесттер, линтерлар қоссам осындай бәле шығады. Біляяя тең белгісінің алдына пробел қоюды ұмытып кеттім. Жаңа өзгерісті енгізудің басқа да әдісі бар. Жаңа коммит жасаңыз, содан кейін rebase -i теріңіз. Сонда екі коммит қосылады. Бірақ бірінші әдіс тезірек.

ЕСКЕРТУ: Ортақ тармаққа кеткен коммиттарды ешқашан өзгертпеңіз! Тек локал тармақтағы коммиттерді өзгертіңіз, немесе таяқ жейсіз.

Білә, соңғы коммиттың атын өзгерту керек!

git commit --amend
# атты өзгертуге арналған редактор ашылады

Осы атау талаптары заебал болды.

Білә, мен мастерға коммит жасадым, бірақ ол жаңа тармақта болу керек!

# бұл команда мастердің қазіргі күйінен жаңа тармақ ашады
git branch жаңа-тармақтың-аты
# мастердың соңғы коммитін жояды
git reset HEAD~ --hard
git checkout жаңа-тармақтың-аты
# енді сіздің коммитіңіз осы тармақта болады :)

Егер қашықтағы/ортақ тармаққа коммитті жіберіп қойған болсаңыз, онда бұл жұмыс істемейді. git reset HEAD@{артқа-қайтуға-коммиттер-саны} көмектесе алады.

Білә, байқамай басқа тармаққа коммит жасап қойдым!

# соңғы коммитті болдырмайды, бірақ өзгерістер қолжетімді қалады
git reset HEAD~ --soft
# өзгерістерді жасырын қоймада сақтайды
git stash
# керек тармаққа өту үшін
git checkout керекті-тармақ
git stash pop
git add . # немесе жеке файл қосыңыз
git commit -m "сіздің коментариіңіз"
# енді өзгерістер керекті тармақта

Көптеген адамдар осындай жағдайда cherry-pick-ты қолдануды ұсынды. Ұнаған әдісті таңдаңыз!

git checkout керек-тармақтың-аты
# келесі команда мастердың соңғы коммитін көшіреді
git cherry-pick master
# мастерда соңғы коммитті жояды
git checkout master
git reset HEAD~ --hard

Білә, diff-ты ашуға тырысудамын, бірақ ешқандай өзгеріс жоқ?!

Егер файлды өзгерткеніңізге сенімді болсаңыз және diff ештеңе шығармай тұрса, бәлкім сіз (git add) командасымен өзгерістерді индекстедіңіз. Өзгерістерді көру үшін арнайы staged флагын қосасыз.

git diff --staged

¯\_(ツ)_/¯ (Йә білем, бұл фича, баг емес. Бірақ басында нихуя түсінксіз!)

Білә, маған 5 коммит бұрын тұрған коммитті болдырмау керек!

# болдырмау керек коммитті табыңыз
git log
# скролл қолдану арқылы коммиттерді көре аласыз
# керек коммиттің хешін сақтаңыз
git revert [сақталған хеш]
# таңдалған коммитті болдырмау үшін git жаңа коммитті жасайды
# коммиттің атын өзгертіңіз
# немесе жай ғана сақтаңыз

Артқа барудың және ескі файлды жаңа файлға көшірудің керегі жоқ! Егер бір хуйняны коммит жасап қойған болсаңыз, онда оны revert арқылы жоюға болады.

Тағы сізде бүкіл коммитті болдырмаудың орнына бір ғана файлды болдырмау мүмкіндігі бар! Алайда git-тің қотақ стилі бойынша бұл мүлдем басқа командалар жинағы.

Білә, маған файлдағы өзгерісті болдырмау керек!

# қайтару керек коммиттің хешін табыңыз
git log
# скролл қолдану арқылы коммиттерді көре аласыз
# керек коммиттің хешін сақтаңыз
git checkout [сақталған хеш] -- файлға/апарар/жол
# файлдың соңғы версиясы сіздің индексіңізде пайда болады
git commit -m "Еееее, енді өзгерістерді болдырмау үшін маған копи паст жасаудың керегі жоқ!"

Осыған басым жеткен кезде ХУЕТЬ етіп қалдым. Ебать охуенный осы фича. Бірақ шыны керек, өзгерістерді болдырмайтын checkout -- командасы сәл ыңғайсыздау. :линус-торвальдсқа-қолы-қышып-тұр:

Білә впизду, мен берілемін.

cd ..
sudo rm -r сайтан-алғыр-git-репозиторий
git clone https://some.github.url/сайтан-алғыр-git-репозиторий.git
cd сайтан-алғыр-git-репозиторий

sudo командасын ескерткен адам Eric V. Осы қалжыңда sudo-ны қолдану бойынша шағымдар Эрикке жіберілсін.

Жалпы, егер сіздің тармағыңыз соооншама бығып кетсе, тіпті қашықтықтағы репозиторийдің күйіне "гит-рассталған әдіспен" оралу керек болса, онда мынаны көріңіз, бірақ бұл әдіс қайтымсыз!

# origin соңғы күйін алу
git fetch origin
git checkout master
git reset --hard origin/master
# индекстелмеген файлдарды жою 
git clean -d --force
# енді checkout/reset/clean командаларын әр бұзылған тармақта қайталау керек

*Ескерту: Бұл сайт түпкілікті нұсқаулық ретінде саналмайды. Иә, мәселелерді басқа оңай жолдармен шешуге болады, бірақ осы шешімдерге мен қиналып өз миыммен жеттім. Енді сізбен бөлісіп отырмын. Қабылдаңыз немесе кетіңіз!

Осы сайтты басқа тілдерге аударған адамдарға көп рахмет: Michael Botha (af) · Khaja Md Sher E Alam (bn) · Eduard Tomek (cs) · Moritz Stückler (de) · Franco Fantini (es) · Hamid Moheb (fa) · Senja Jarva (fi) · Michel (fr) · Alex Tzimas (gr) · Elad Leev (he) · Aryan Sarkar (hi) · Ricky Gultom (id) · fedemcmac (it) · Meiko Hori (ja) · Zhunisali Shanabek (kk) · Gyeongjae Choi (ko) · Rahul Dahal (ne) · Martijn ten Heuvel (nl) · Łukasz Wójcik (pl) · Davi Alexandre (pt_BR) · Catalina Focsa (ro) · Daniil Golubev (ru) · Nemanja Vasić (sr) · Björn Söderqvist (sv) · Kitt Tientanopajai (th) · Taha Paksu (tr) · Andriy Sultanov (ua) · Tao Jiayuan (zh) . Қосымша жәрдем бергендер: Allie Jones · Artem Vorotnikov · David Fyffe · Frank Taillandier · Iain Murray · Lucas Larson · Myrzabek Azil

Өз тілінде аударымды қосу үшін GitHub репозоторийға PR жіберіңіз