Գիտը չպետք է անծանոթ լինի բոլորին: Git-ի հմուտ օգտագործումը ծրագրավորողների համար դարձել է հիմնական հմտություն: Չնայած աշխատանքում կան հաճախորդի հզոր գործիքներ, ինչպիսիք են webstorm-ը և vscode-ը, կոդի միաձուլումը շատ հարմար է: Բայց աշխատանքային հարցազրույցների և որոշ տեսարանների համար, որոնք պետք է ցույց տան անձնական ուժ, մենք դեռ պետք է տիրապետենք բավականաչափ git հրամաններին:
Ստորև մենք դասակարգել ենք մի քանի դասական գործողության սցենարներ git միաձուլման կոդի ամենօրյա օգտագործման համար, որը հիմնականում ծածկում է աշխատանքի կարիքները:
- Ի՞նչ եմ հենց նոր ներկայացրել:
Եթե դուք օգտագործում եք git commit -a փոփոխություն (փոփոխություններ) ներկայացնելու համար, և վստահ չեք, թե այս անգամ ինչ բովանդակություն է ներկայացվել։ Դուք կարող եք օգտագործել հետևյալ հրամանը՝ ընթացիկ HEAD-ի վերջին commit-ը ցուցադրելու համար
git show // or git log -n1 -p
2. Սխալ եմ թույլ տվել իմ հանձնման հաղորդագրության մեջ, կարո՞ղ եմ փոխել այն:
Եթե ձեր commit հաղորդագրությունը սխալ է գրված, և այս commit-ը դեռ չի ուղարկվել, կարող եք փոփոխել commit հաղորդագրությունը հետևյալ եղանակով.
git commit --amend --only // This will open your default editor where you can edit the message // or git commit --amend --only -m 'xxxxxxx'
Եթե դուք արդեն կատարել եք այս commit-ը, կարող եք փոփոխել այս commit-ը և ստիպել հրել, բայց դա խորհուրդ չի տրվում:
3. commit (commit)-ում օգտագործողի անունը և էլ․ հասցեն սխալ են
Եթե սա ընդամենը մեկ պարտավորություն է, փոփոխեք այն.
git commit --amend --author "yourname <[email protected]>"
Եթե Ձեզ անհրաժեշտ է փոփոխել ամբողջ պատմությունը, ծանոթանալու git filter-branch-ի մասին
4. Ես ուզում եմ ֆայլը հեռացնել commit-ից
git checkout HEAD^ myfile git add -A git commit --amend
Սա շատ օգտակար կլինի, երբ դուք ունեք բաց պատչ (բաց պատչ), դրան ավելորդ ֆայլ եք ուղարկում, և պետք է ստիպել push (force push)՝ հեռակառավարվող պատչը թարմացնելու համար։
5. Ես ուզում եմ ջնջել իմ վերջին commit (commit)
git reset HEAD^ --hard git push -f [remote] [branch]
Եթե Ձեզ անհրաժեշտ է ջնջել pushed commit-ները, կարող եք օգտագործել հետևյալ մեթոդը. Այնուամենայնիվ, սա անդառնալիորեն կփոխի ձեր պատմությունը և կխառնի նրանց պատմությունները, ովքեր արդեն դուրս են եկել պահեստից: Մի խոսքով, եթե վստահ չեք, մի արեք դա:
Եթե դեռ չեք սեղմել հեռակառավարման վահանակը, պարզապես վերակայեք Git-ը այնտեղ, որտեղ այն եղել է մինչև ձեր վերջին կատարումը (միաժամանակ պահպանելով փուլային փոփոխությունները).
git reset --soft HEAD@{1}
Սա աշխատում է միայն այն դեպքում, եթե նախկինում չեք հրել: Եթե դուք արդեն հրել եք, միակ անվտանգ բանը, որ պետք է անեք, git revert SHAofBadCommit-ն է, որը կստեղծի նոր commit, որը կվերացնի բոլոր փոփոխությունները նախորդ commit-ից; կամ, եթե այն ճյուղը, որը դուք հրում եք, ապահով է վերաբաժանման համար (օրինակ, այլ մշակողները չեն քաշի այս ճյուղը), պարզապես օգտագործեք git push -f:
6. Մղեք փոփոխված commit-ը (փոփոխված commit) դեպի հեռակառավարման վահանակ, բայց զեկուցեք սխալի մասին
Այդ վերահիմնավորումը (տե՛ս ստորև) և փոփոխությունը կփոխարինի հին հանձնառությունը նորով, այնպես որ, եթե դուք նախկինում դրել եք նախապես փոփոխված commit-ը հեռավոր պահոց, այժմ պետք է Ստիպել սեղմել (-f): Միշտ համոզվեք, որ ճյուղ եք նշել:
git push origin mybranch -f
Ընդհանրապես, խուսափեք հրելուց։ Ավելի լավ է ստեղծել և մղել նոր commit, քան առաջ մղել վերանայված commit: Վերջինս սկզբնաղբյուրի պատմության մեջ կոնֆլիկտներ կստեղծեր այդ մասնաճյուղի կամ այդ մասնաճյուղի ենթաճյուղի վրա աշխատող ծրագրավորողների համար:
7. Ես պատահաբար կոշտ վերականգնում եմ արել և ուզում եմ հետ բերել իմ բովանդակությունը
Եթե դուք կատարում եք git-ի վերականգնում, դժվար պատահաբար, սովորաբար կարող եք հետ ստանալ ձեր պարտավորությունները, քանի որ Git-ը պահում է ամեն ինչի տեղեկամատյանները և դրանք պահում է մի քանի օր:
git reflog
Դուք կտեսնեք ձեր անցյալի պարտավորությունների ցանկը և վերակայման պարտավորությունները: Ընտրեք ստանձնման SHA-ը, որին ցանկանում եք վերադառնալ, և նորից վերակայեք՝
git reset --hard SHAxxx
8. Ես պետք է ավելացնեմ բեմականացման բովանդակությունը վերջին commit-ում
git commit --amend
9. Ես ուզում եմ բեմադրել նոր ֆայլի մի մասը, ոչ թե ամբողջ ֆայլը
git add --patch filename.xxx // git add --p filename.xxx : -p Shorthand.
Սա կբացի ինտերակտիվ ռեժիմը, և դուք կկարողանաք օգտագործել s տարբերակը առանձնացնել commit-ները; սակայն, եթե ֆայլը նոր է, նման տարբերակ չի լինի: Նոր ֆայլ ավելացնելիս կատարեք հետևյալը.
git add -N filename.xxx
Այնուհետև, դուք պետք է օգտագործեք e տարբերակը՝ ձեռքով ընտրելու այն տողերը, որոնք պետք է ավելացվեն: Գործարկվում է git diff — քեշը ցույց կտա, թե որ տողերն են ժամանակավորապես պահվում, և որ տողերը պահվում են միայն տեղում:
10. Ես ուզում եմ ժամանակավորապես պահել չպլանավորված բովանդակությունը և փոխել ժամանակավորապես պահված բովանդակությունը չպլանավորված
git stash git stash pop
11.Ես ուզում եմ չբեմադրված բովանդակությունը տեղափոխել նոր մասնաճյուղ
git checkout -b my-branch
12.Ես ուզում եմ չբեմադրված բովանդակությունը տեղափոխել մեկ այլ գոյություն ունեցող մասնաճյուղ
git stash git checkout my-branch git stash pop
13. Ես ուզում եմ հրաժարվել տեղական չհանձնված փոփոխություններից (չկատարված փոփոխություններ)
# one commit git reset --hard HEAD^ # two commits git reset --hard HEAD^^ # four commits git reset --hard HEAD~4 # or git checkout -f # reset the file git reset filename
14. Ես բովանդակություն եմ քաշել սխալ ճյուղից կամ դեպի սխալ ճյուղ
git reflog ab7555f HEAD@{0}: pull origin wrong-branch: Fast-forward c5bc32a HEAD@{1}: checkout: checkout message goes here git reset --hard c5bc32a
15. Ես ուզում եմ դեն նետել իմ տեղական պարտավորությունները, որպեսզի իմ մասնաճյուղը համապատասխանի հեռակառավարմանը
Համոզվեք, որ դուք չեք մղում ձեր բովանդակությունը դեպի հեռակառավարման վահանակ:
git կարգավիճակը ցույց կտա, թե քանի պարտավորություններից եք առաջ (առաջ) աղբյուրից (սկզբից)
git status # On branch my-branch # Your branch is ahead of 'origin/your-branch' by 2 commits. # (use "git push" to publish your local commits) # git reset --hard origin/your-branch
16.Ես ներկայացրել եմ մի քանի commit (commit) նույն մասնաճյուղին, և այդ commit-ները պետք է բաշխվեն տարբեր մասնաճյուղերում
Նախ վերագործարկեք վերջին պարտավորությունը՝
git reset --hard xxx-hash
Հաջորդը, այս ճյուղի հիման վրա ստեղծեք նոր մասնաճյուղ
git checkout -b xxx-branch git cherry-pick xxxxxxx-hash
17. Ես պատահաբար ջնջեցի իմ մասնաճյուղը
Եթե դուք կանոնավոր կերպով սեղմում եք հեռակառավարման վահանակը, այն ժամանակի մեծ մասում պետք է ապահով լինի, բայց երբեմն հնարավոր է ջնջել ճյուղերը, որոնք չեն մղվել դեպի հեռակառավարման վահանակ: Այս պահին ձեզ պետք է հիշեցնել reflog-ը, գրանցամատյանի թարմացված տարբերակը, որը պահում է բոլոր գործողությունների պատմությունը պահեստում (ռեպո):
git reflog 31204cd HEAD@{0}: checkout: moving from your-branch to develop 2e8cd85 HEAD@{1}: commit: text.txt added 73204cd HEAD@{2}: checkout: moving from main to your-branch
Ինչպես տեսնում եք, մենք ջնջված ճյուղից ունենք commit hash, տեսնենք, արդյոք կարող ենք վերականգնել ջնջված ճյուղը:
git checkout -b your-branch-h Switched to a new branch 'your-branch-h' (my-branch-help)$ git reset --hard 2e8cd85 HEAD is now at 4e3cd85 text.txt added (my-branch-help)$ ls README.md text.txt
18. Ջնջել մասնաճյուղը
git push origin --delete your-branch // origin // or git push origin :your-branch git branch -D my-branch // local
19. Ես ուզում եմ հետարկել վերաբազավորումը/միաձուլումը
Դուք կարող եք միաձուլել կամ վերահիմնավորել սխալ ճյուղը, կամ չկարողանաք ավարտել վերահիմնավորումը/միաձուլումը ընթացքի մեջ: Git-ը կպահի բնօրինակ HEAD-ը ORIG_HEAD կոչվող փոփոխականում՝ վտանգավոր գործողություններ կատարելիս, ուստի շատ հեշտ է վերականգնել ճյուղը վիճակի նախքան վերաբաժանումը/միաձուլումը:
git reset --hard ORIG_HEAD
20. Ես արդեն վերակառուցվել եմ, բայց չեմ ուզում ստիպել հրել
Ցավոք, եթե դուք ցանկանում եք արտացոլել այս փոփոխությունները (փոփոխությունները) հեռավոր ճյուղում, դուք պետք է ստիպեք հրում (force push): Դա պայմանավորված է նրանով, որ դուք արագորեն փոխանցել եք ներկայացումը և փոխել Git պատմությունը, և հեռավոր ճյուղը չի ընդունի փոփոխություններ (փոփոխություններ), քանի դեռ նրան հարկադրված չեն սեղմել (ստիպել հրում): Սա հիմնական պատճառներից մեկն է, թե ինչու շատ մարդիկ օգտագործում են միաձուլման աշխատանքային հոսքը վերաբազավորման աշխատանքային հոսքի փոխարեն, ծրագրավորողի ուժային ճնշումը կարող է մեծ թիմերին դժվարության մեջ գցել: Ուշադրություն դարձրեք, երբ այն օգտագործելիս, rebase-ն օգտագործելու անվտանգ միջոց է ոչ թե ձեր փոփոխությունները (փոփոխությունները) արտացոլել հեռավոր մասնաճյուղում, այլ անել հետևյալը.
git checkout your-branch //develop branch git rebase -i develop // your-branch git checkout develop // your-branch git merge --ff-only your-branch //develop branch
21. Անվտանգ միաձուլման ռազմավարություն
— առանց պարտավորությունների Կատարեք միաձուլում (միաձուլում), բայց ինքնաբերաբար մի կատարեք՝ օգտատերերին հնարավորություն տալով ստուգել և փոփոխել նախքան կատարելը: no-ff-ը ապացույցներ կթողնի առանձնահատկությունների ճյուղերի առկայության մասին՝ պահպանելով նախագծի պատմությունը:
git merge --no-ff --no-commit your-branch
22. Ես պետք է միացնեմ ճյուղը commit-ի մեջ
git merge --squash your-branch
23. Ստուգեք՝ արդյոք մասնաճյուղի բոլոր պարտավորությունները միավորվել են
Ստուգելու համար, որ մի ճյուղի բոլոր պարտավորությունները միավորվել են այլ ճյուղերի մեջ, դուք պետք է կատարեք տարբերություն այդ ճյուղերի ղեկավարների (կամ որևէ պարտավորությունների) միջև.
git log --graph --left-right --cherry-pick --oneline HEAD...feature/xxx // or git log develop ^feature/xxx --no-merges
24. Ինչպես լուծել վերահիմնավորման կոնֆլիկտները
Սկզբում գործարկեք git կարգավիճակը՝ պարզելու համար, թե որ ֆայլերը հակասության մեջ են, այնուհետև բացեք համապատասխան ֆայլը՝ ըստ հուշման:
<<<<<<< HEAD some code ========= some code >>>>>>> new-commit
Բոլոր կոնֆլիկտները լուծելուց և փորձարկելուց հետո git-ը ավելացրեք փոխված ֆայլերը, այնուհետև շարունակեք վերանայումը git rebase-ով. շարունակեք:
git add file git rebase --continue
Եթե բոլոր կոնֆլիկտները լուծելուց հետո ստանաք նույն արդյունքը, ինչ նախքան կատարելը, կարող եք կատարել
git rebase - skip
Ամեն անգամ, երբ ցանկանում եք ավարտել վերաբաժանման ամբողջ գործընթացը և վերադառնալ մասնաճյուղի վիճակին մինչև վերաբաժանումը, կարող եք անել.
git rebase --abort
25. Հեռացված կարկատելը
Եթե ինչ-որ մեկը ձեզ ուղարկի GitHub-ում ձգման հարցում, բայց հետո ջնջի իր իսկական պատառաքաղը, դուք չեք կարողանա կլոնավորել նրանց պարտավորությունները կամ օգտագործել git am-ը: Այս դեպքում ավելի լավ է ձեռքով վերանայել նրանց պարտավորությունները, պատճենել դրանք նոր տեղական մասնաճյուղում և կատարել:
Ներկայացնելուց հետո փոփոխեք հեղինակին, տե՛ս Փոխել հեղինակին: Այնուհետև կիրառեք փոփոխությունները և թողարկեք նոր ձգման հարցում:
26.Ես պարզապես ուզում եմ փոխել ֆայլի անունը՝ առանց բովանդակությունը փոփոխելու
git mv --force aaafile bbbfile // aaa file is old, bbbfile is new
27. Ես ուզում եմ պահոցում օգտանունն ու գաղտնաբառը քեշավորել
git config --global credential.helper cache //or git config --global credential.helper 'cache --timeout=3600'
Այսօր կանգ առնենք այստեղ, կշարունակենք ձայնագրել ավելի ուշ: