Գիտը չպետք է անծանոթ լինի բոլորին: Git-ի հմուտ օգտագործումը ծրագրավորողների համար դարձել է հիմնական հմտություն: Չնայած աշխատանքում կան հաճախորդի հզոր գործիքներ, ինչպիսիք են webstorm-ը և vscode-ը, կոդի միաձուլումը շատ հարմար է: Բայց աշխատանքային հարցազրույցների և որոշ տեսարանների համար, որոնք պետք է ցույց տան անձնական ուժ, մենք դեռ պետք է տիրապետենք բավականաչափ git հրամաններին:

Ստորև մենք դասակարգել ենք մի քանի դասական գործողության սցենարներ git միաձուլման կոդի ամենօրյա օգտագործման համար, որը հիմնականում ծածկում է աշխատանքի կարիքները:

  1. Ի՞նչ եմ հենց նոր ներկայացրել:

Եթե ​​դուք օգտագործում եք 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'

Այսօր կանգ առնենք այստեղ, կշարունակենք ձայնագրել ավելի ուշ: