關(guān)于git要講明白的東西:工作區(qū)竖慧、暫存區(qū)、本地倉庫鸽疾、分支(時間線)吊洼、HEAD、遠(yuǎn)程倉庫及別名
git與github:
git:就是一個分布式版本控制系統(tǒng)制肮,github是一個為用戶提供git服務(wù)的一個網(wǎng)站(線上代碼倉庫:gitee或者gitlab)冒窍。
git:本地倉庫
github:在線倉庫
在github上創(chuàng)建倉庫之后,可以將此倉庫clone到本地豺鼻,或者將本地的倉庫關(guān)聯(lián)并push上去综液。
關(guān)聯(lián):
1.在本地目錄下關(guān)聯(lián)遠(yuǎn)程repository :
git remote add origin(遠(yuǎn)程鏈接名) 項目地址
建立連接之后,第一次使用pull的時候:git pull origin dev
第一次使用push:git push --set-upstream origin dev
git rebase origin dev 把多分支線整理成一條
2.取消本地目錄下關(guān)聯(lián)的遠(yuǎn)程庫:
git remote remove origin(鏈接遠(yuǎn)程倉庫的名字)
克隆到本地:git clone 項目地址
克隆指定分支:git clone -b +分支 + 地址
IDE使用git:
如果在一個項目中執(zhí)行g(shù)it init被git管理儒飒,就可以在IDE中看到git選項谬莹,使用add和commit,可以在IDE里面直接管理這個倉庫(項目)的分支名桩了,管理remote遠(yuǎn)程倉庫的別名附帽,后面是push上遠(yuǎn)程庫(遠(yuǎn)程倉庫的名字可以和項目名不一致,最好一致)之后顯示的是分支名井誉。
gitlab:可以自己搭建的遠(yuǎn)程倉庫
可以為每個項目添加成員蕉扮,也就是權(quán)限管理
別人push上的更新,可以將更新pull下來颗圣,push和pull都會顯示分支名和成員喳钟。
初次使用需要在上面創(chuàng)建項目屁使,可以將上面的項目clone到本地,或者將本地的項目完整push上去奔则。
git:工作區(qū)--暫存區(qū)--本地倉庫(分支版本庫)---->git遠(yuǎn)程倉庫
git命令和Linux命令使用類似:
設(shè)置用戶名及郵箱:git config --global user.name ""
git config --global user.email ""
創(chuàng)建倉庫:mikdir蛮寂、cd
初始化倉庫:git init
git add 文件多個文件 .(所有)
git commit -m "注釋"
查看倉庫的當(dāng)前狀態(tài):git status
查看更改文件的內(nèi)容:git diff
撤回工作區(qū)最近一次的修改:git checkout -- readme.txt --后面是有空格的
將暫存區(qū)的修改回退到工作區(qū):git reset HEAD readme.txt HEAD大寫
也可以使用下面git status 提示的命令:
獲取版本號:git log、簡化顯示:git log --pretty=oneline
回退:git reset --hard 版本號
獲取版本號:git reflog
克隆到本地:git clone 倉庫地址
推上:git push
使用ssh連接:復(fù)制本機(jī)公鑰到github上保存
拉纫撞纭:git pull
注意:修改文件內(nèi)容之后可以直接push酬蹋,
但是回退版本之后不行,需要開啟強(qiáng)制push:git push -f origin dev
關(guān)于reset和revert的原理:
git每次commit提交抽莱,都會自動把它們串成一條時間線除嘹,這條時間線就是一個分支,默認(rèn)是主分支master岸蜗,HEAD指針指向當(dāng)前在使用的分支的最新版本,使用reset就是更改HEAD指向之前的版本叠蝇,遺棄的版本 但是使用git reflog還是能夠看到左右的版本璃岳,因為git底層會記錄你每一次關(guān)于版本的操作。使用revert就是不改變原來的版本悔捶,新建立一個版本(回退到你指定的版本 不改變此版本后的版本)铃慷。
git revert -n 版本號
適用場景: 如果我們想撤銷之前的某一版本,但是又想保留該目標(biāo)版本后面的版本蜕该,記錄下這整個版本變動流程犁柜,就可以用這種方法。
git reset --hard 目標(biāo)版本號
此時如果用“git push”會報錯堂淡,因為我們本地庫HEAD指向的版本比遠(yuǎn)程庫的要舊馋缅,
要使用git push -f”強(qiáng)制推上去
分支:git branch 查看所有分支
創(chuàng)建:git branch 分支名
切換到分支:git checkout 分支名
創(chuàng)建并切換分支:git checkout -b dev 、 git switch -c dev
刪除分支:git branch -d 分支名 需要不在此分支下
合并分支 :gir merge dev(分支名) --注意:這是合并到dev分支下
分支策略
在實際開發(fā)中绢淀,我們應(yīng)該按照幾個基本原則進(jìn)行分支管理:
首先萤悴,master分支應(yīng)該是非常穩(wěn)定的,也就是僅用來發(fā)布新版本皆的,平時不能在上面干活覆履;
那在哪干活呢?干活都在dev分支上费薄,也就是說硝全,dev分支是不穩(wěn)定的,到某個時候楞抡,比如1.0版本發(fā)布時伟众,再把dev分支合并到master上,在master分支發(fā)布1.0版本拌倍;
你和你的小伙伴們每個人都在dev分支上干活赂鲤,每個人都有自己的分支噪径,時不時地往dev分支上合并就可以了。
所以数初,團(tuán)隊合作的分支看起來就像這樣:
--no-ff方式的合并分支:
git merge --no-ff -m "merge with no-ff" dev
Git分支十分強(qiáng)大找爱,在團(tuán)隊開發(fā)中應(yīng)該充分應(yīng)用。
合并分支時泡孩,加上--no-ff參數(shù)就可以用普通模式合并车摄,合并后的歷史有分支,能看出來曾經(jīng)做過合并仑鸥,而默認(rèn)fast forward合并就看不出來曾經(jīng)做過合并吮播。
Bug分支:
并不是你不想提交,而是工作只進(jìn)行到一半眼俊,還沒法提交意狠,預(yù)計完成還需1天時間。但是疮胖,必須在兩個小時內(nèi)修復(fù)該bug环戈,怎么辦?
幸好澎灸,Git還提供了一個stash功能院塞,可以把當(dāng)前工作現(xiàn)場“儲藏”起來,等以后恢復(fù)現(xiàn)場后繼續(xù)工作:
git stash
首先確定要在哪個分支上修復(fù)bug性昭,假定需要在master分支上修復(fù)拦止,就從master創(chuàng)建臨時分支:git checkout -b issue-101
現(xiàn)在修復(fù)bug,需要把“Git is free software ...”改為“Git is a free software ...”糜颠,然后提交:
修復(fù)完成后汹族,切換到master分支,并完成合并括蝠,最后刪除issue-101分支:
git switch master
git merge --no-ff -m "merged bug fix 101" issue-101
當(dāng)手頭工作沒有完成時鞠抑,先把工作現(xiàn)場git stash一下,然后去修復(fù)bug忌警,修復(fù)后搁拙,再git stash pop,回到工作現(xiàn)場法绵;
更改提交之后會有一個當(dāng)前分支下的修改版本號生成箕速。
[圖片上傳中...(image-c97c2f-1617158140875-0)]
feature分支:用于開發(fā)臨時新上線的功能
開發(fā)一個新feature,最好新建一個分支朋譬;
如果要丟棄一個沒有被合并過的分支盐茎,可以通過git branch -D <name>強(qiáng)行刪除。
多人協(xié)作:
- 查看遠(yuǎn)程庫信息徙赢,使用git remote -v字柠;
- 本地新建的分支如果不推送到遠(yuǎn)程探越,對其他人就是不可見的;
- 從本地推送分支窑业,使用git push origin branch-name钦幔,如果推送失敗,先用git pull抓取遠(yuǎn)程的新提交常柄;
- 在本地創(chuàng)建和遠(yuǎn)程分支對應(yīng)的分支鲤氢,使用git checkout -b branch-name origin/branch-name,本地和遠(yuǎn)程分支的名稱最好一致西潘;
- 建立本地分支和遠(yuǎn)程分支的關(guān)聯(lián)卷玉,使用git branch --set-upstream branch-name origin/branch-name;
- 從遠(yuǎn)程抓取分支喷市,使用git pull相种,如果有沖突,要先處理沖突品姓。
沖突解決:
嘗試合并蚂子,gir merge dev(分支名)
查看狀態(tài):git status
查看文件,手動修改沖突后解決
再次 add commit
查看合并情況:git log --graph --pretty=oneline --abbrev-commit
Rebase:
- rebase操作可以把本地未push的分叉提交歷史整理成直線缭黔;
- rebase的目的是使得我們在查看歷史提交的變化時更容易,因為分叉的提交需要三方對比蒂破。
標(biāo)簽管理:
所以馏谨,tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一起附迷。
命令git tag <tagname>用于新建一個標(biāo)簽惧互,默認(rèn)為HEAD,也可以指定一個commit id喇伯;
命令git tag -a <tagname> -m "blablabla..."可以指定標(biāo)簽信息喊儡;
命令git tag可以查看所有標(biāo)簽。
命令git push origin <tagname>可以推送一個本地標(biāo)簽稻据;
命令git push origin --tags可以推送全部未推送過的本地標(biāo)簽艾猜;
命令git tag -d <tagname>可以刪除一個本地標(biāo)簽;
命令git push origin :refs/tags/<tagname>可以刪除一個遠(yuǎn)程標(biāo)簽捻悯。
自定義GIt:
git config --global color.ui true 醒目顏色
忽略特殊文件:https://github.com/github/gitignore
- 忽略某些文件時匆赃,需要編寫.gitignore;
- .gitignore文件本身要放到版本庫里今缚,并且可以對.gitignore做版本管理算柳!
配置別名:git config --global alias.st status