issue管理模式
git開(kāi)發(fā)流程
多人協(xié)作
- git config --global alias.st status —— 這樣st就是status的意思了留量,以后git status只需要輸入git st。
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
工作流程與代碼
- 第一步哟冬,獲取代碼
- 如果是已有代碼楼熄,需要納入git體系
git init
+git checkout -b develop
+git add .
+git commit -m ''
+git remote add origin xxx
+git push origin master:develop
完成初始化git并在本地develop分支提交,然后上傳代碼到遠(yuǎn)程倉(cāng)庫(kù)的develop分支浩峡。 - 如果是已在git遠(yuǎn)程倉(cāng)庫(kù)中的代碼可岂,則
git clone xxx
+git branch -a
+git checkout --track origin/develop
+git checkout -b feature-login (origin/feature-login)
,完成克隆代碼并從遠(yuǎn)程分支develop分支檢出本地develop分支翰灾,并創(chuàng)建(檢出遠(yuǎn)程)feature分支在本地進(jìn)行功能的開(kāi)發(fā)缕粹。
- 如果是已有代碼楼熄,需要納入git體系
- (合作開(kāi)發(fā))每天開(kāi)始工作前,要做的是把代碼從遠(yuǎn)程倉(cāng)庫(kù)中
git pull (--rebase)
- 開(kāi)發(fā)過(guò)程(本地)
上次提交過(guò)后预侯,這次又寫(xiě)了一些代碼致开,但是寫(xiě)錯(cuò)了想退回去之前的工作空間狀態(tài)
開(kāi)發(fā)時(shí)想查看git狀態(tài)和信息git reset [版本號(hào)] 是回退本地倉(cāng)庫(kù)但工作空間不變。 git reset --hard xxx 回退本地倉(cāng)庫(kù)并還原工作空間到 某次提交過(guò)后狀態(tài) 萎馅。 git reset --hard [filename/版本號(hào)] git checkout [文件名] 退回到 上次暫存區(qū)(add)狀態(tài) 的工作目錄双戳。
每天干完活之后git status git log git reflog git blame filename 查看本文件最后一次修改記錄
(工作空間棧)如果你沒(méi)保存修改的內(nèi)容就切換分支,則會(huì)丟失本次修改(被目標(biāo)branch的最新commit重 寫(xiě))糜芳。但是你又想切換分支怎么辦飒货?可以使用儲(chǔ)藏功能來(lái)保存工作現(xiàn)場(chǎng)魄衅,然后再切換分支,等需要時(shí)候再恢復(fù)工作空間git add . git commit -m 'update xxxx' git push <remote> <localbranch:remotebranch> 或git push -u <remote> <localbranch:remotebranch>以后就只需要在本分支直接push origin即可
當(dāng)功能分支開(kāi)發(fā)完畢之后,需要合并到開(kāi)發(fā)分支上并上傳代碼扣墩,同時(shí)刪除本地和遠(yuǎn)程的功能分支git stash —— 隱藏當(dāng)前工作空間的修改 git stash list —— 列出stash 記錄 git stash -pop 恢復(fù)現(xiàn)場(chǎng)并刪除一個(gè)stash記錄塘辅。 git stash apply —— 恢復(fù)現(xiàn)場(chǎng)晃虫,但不刪除stash記錄 git stash drop —— 刪除一條stash記錄
階段性開(kāi)發(fā)完成亚脆,可以發(fā)布release了//以下兩步的作用是保證你本地的feature-login分支的代碼為最新哲银,因?yàn)橛锌赡苣闶呛蛣e人合作開(kāi)發(fā)的該功 能,如果你剛更新過(guò)或者你是一個(gè)人在開(kāi)發(fā)則可以省略此操作 git checkout feature-login //切換到本地feature-login分支 git pull --rebase //拉取最新代碼 git checkout develop //切換到本地develop分支 git pull --rebase //拉取最新的遠(yuǎn)程origin/develop分支代碼呻惕,因?yàn)榭赡芤呀?jīng)有人提交了代碼 git merge --no-ff feature-login //從本地feature-login分支合并代碼荆责,--no-ff為禁止fast-farward模式 git push //推送到遠(yuǎn)程分支 //代碼已經(jīng)合并完,可以刪除本地特性分支和遠(yuǎn)程特性分支 git branch -d feature-login //刪除本地feature-login特性分支 git branch -r -d origin/feature-login //刪除遠(yuǎn)程origin/feature-login特性分支
git checkout develop //切換本地分支到develop分支 git pull //拉取遠(yuǎn)程Git倉(cāng)庫(kù)中的最新的develop分支的代碼 git checkout -b release-1.2.0 //創(chuàng)建本地發(fā)布分支 git tag tagname <first-10-chars-commid-id>—— 為最后一次 <某次>commit打tag 或git tag -a <tagname> -m "blablabla..."—— 帶有注釋的標(biāo)簽做院。 git push -u origin release-1.2.0 //推送本地發(fā)布分支到遠(yuǎn)程Git倉(cāng)庫(kù)( git push origin --tags 退送所有本地標(biāo)簽。git tag -d tagname—— 刪除本地tag)
鎮(zhèn)帖之寶
下載速度太慢的解決方法:修改Host
https://www.ipaddress.com/在里面分別查詢(xún)一下域名ip
- github.com
- github.global.ssl.fastly.net
得到:
- 140.82.114.3 github.com
- 199.232.69.194 github.global.ssl.fastly.net
然后添加這兩個(gè)句話(huà)添加到末尾 C:\Windows\System32\drivers\etc
然后到cmd中刷新DNS緩存:ipconfig /flushdns
收工1舫帧<!
git-bash使用
- cat echo等都可以用
- 選中復(fù)制柑营,中鍵黏貼屈雄。
- 更新環(huán)境變量HOME內(nèi)容為gitws地址,下載Gitbash:https://git-scm.com/downloads一路安裝由境。
- 更新ssh密鑰棚亩,指令:ssh-keygen -t rsa -C "your_email@youremail.com",不輸入文件名也行一路回車(chē)虏杰。然后到讥蟆。然后在ws下的.ssh目錄下有公鑰.pub和私鑰。進(jìn)入到github上點(diǎn)開(kāi)設(shè)置-ssh和gpg密鑰纺阔,用記事本打開(kāi).pub然后把內(nèi)容上傳title可以隨意瘸彤。bash中鍵入ssh -T git@github.com 測(cè)試是否成功驗(yàn)證
- 配置環(huán)境:用戶(hù)名git config --global user.name yourusername 和郵箱git config --global user.email yourusername@email.com。相當(dāng)于機(jī)器自報(bào)家門(mén)
- 可以下載帶有UI的git笛钝,比如下載source-tree质况,在sourcetree中使用ssh的方法1
幾個(gè)名詞的解釋?zhuān)?/h2>
workspace(WS):工作區(qū),程序員進(jìn)行開(kāi)發(fā)的地方玻靡。平常我們開(kāi)發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)的一個(gè)分支结榄,基于此分支進(jìn)行開(kāi)發(fā)。在這里我們編寫(xiě)文件刪除文件...囤捻,但這些文件在沒(méi)被add到index中的時(shí)候是不受git管理的臼朗。而你pull下來(lái)的東西也不會(huì)改變你的工作區(qū)而是本地倉(cāng)庫(kù),而是改變你工作區(qū).git的文件夾中的記錄。你push的也不是工作區(qū)的而是add后commit到本地倉(cāng)庫(kù)视哑。區(qū)分本地倉(cāng)庫(kù)和工作區(qū)的區(qū)別绣否,一般說(shuō)的操作都是說(shuō)本地倉(cāng)庫(kù)而不是工作區(qū),比如回退是指本地倉(cāng)庫(kù)回退到某次commit的狀態(tài)而不是ws挡毅。但pull是把遠(yuǎn)程倉(cāng)庫(kù)的拉取到WS
-
index(staged暫存):暫存區(qū)蒜撮,將工作區(qū)的文件通過(guò)git add加入git管理體系中」虺剩可以通過(guò)git status查詢(xún)暫存區(qū)狀態(tài)
commit:快照段磨,就是一些修改的記錄。
repository :倉(cāng)庫(kù)耗绿。github上的一個(gè)項(xiàng)目薇溃;
Fork:叉子。在別人的github頁(yè)面缭乘,點(diǎn)擊fork按鈕,將別人的倉(cāng)庫(kù)復(fù)制一份到自己的倉(cāng)庫(kù)琉用,此時(shí)我們自己的github就有一個(gè)一模一樣的倉(cāng)庫(kù)堕绩,但是URL不同。你可以自行修改項(xiàng)目?jī)?nèi)容而不會(huì)影響原始的庫(kù)邑时,也可以將自己的修改通過(guò)合并請(qǐng)求(a pull request)的方式請(qǐng)求原始庫(kù)的開(kāi)發(fā)者更新你的修改奴紧;
Clone:克隆。將github中的倉(cāng)庫(kù)克隆到自己電腦本地倉(cāng)庫(kù)中;
Push:推晶丘。將本地倉(cāng)庫(kù)推送同步到遠(yuǎn)程github倉(cāng)庫(kù)(需要權(quán)限)
Pull request:將你github倉(cāng)庫(kù)的修改同步到代碼原始開(kāi)發(fā)者那(fork過(guò)來(lái)的那個(gè)人)
fetch:去取來(lái)黍氮。也就是說(shuō)當(dāng)你fork了別人的項(xiàng)目,你可以pull request合并你的代碼到作者代碼浅浮。同樣沫浆,作者修改了自己的代碼你也可以fetch下來(lái)同步到自己的本地倉(cāng)庫(kù)。
branches:分支滚秩。
workspace(WS):工作區(qū),程序員進(jìn)行開(kāi)發(fā)的地方玻靡。平常我們開(kāi)發(fā)就是拷貝遠(yuǎn)程倉(cāng)庫(kù)的一個(gè)分支结榄,基于此分支進(jìn)行開(kāi)發(fā)。在這里我們編寫(xiě)文件刪除文件...囤捻,但這些文件在沒(méi)被add到index中的時(shí)候是不受git管理的臼朗。而你pull下來(lái)的東西也不會(huì)改變你的工作區(qū)而是本地倉(cāng)庫(kù),而是改變你工作區(qū).git的文件夾中的記錄。你push的也不是工作區(qū)的而是add后commit到本地倉(cāng)庫(kù)视哑。區(qū)分本地倉(cāng)庫(kù)和工作區(qū)的區(qū)別绣否,一般說(shuō)的操作都是說(shuō)本地倉(cāng)庫(kù)而不是工作區(qū),比如回退是指本地倉(cāng)庫(kù)回退到某次commit的狀態(tài)而不是ws挡毅。但pull是把遠(yuǎn)程倉(cāng)庫(kù)的拉取到WS
index(staged暫存):暫存區(qū)蒜撮,將工作區(qū)的文件通過(guò)git add加入git管理體系中」虺剩可以通過(guò)git status查詢(xún)暫存區(qū)狀態(tài)
commit:快照段磨,就是一些修改的記錄。
repository :倉(cāng)庫(kù)耗绿。github上的一個(gè)項(xiàng)目薇溃;
Fork:叉子。在別人的github頁(yè)面缭乘,點(diǎn)擊fork按鈕,將別人的倉(cāng)庫(kù)復(fù)制一份到自己的倉(cāng)庫(kù)琉用,此時(shí)我們自己的github就有一個(gè)一模一樣的倉(cāng)庫(kù)堕绩,但是URL不同。你可以自行修改項(xiàng)目?jī)?nèi)容而不會(huì)影響原始的庫(kù)邑时,也可以將自己的修改通過(guò)合并請(qǐng)求(a pull request)的方式請(qǐng)求原始庫(kù)的開(kāi)發(fā)者更新你的修改奴紧;
Clone:克隆。將github中的倉(cāng)庫(kù)克隆到自己電腦本地倉(cāng)庫(kù)中;
Push:推晶丘。將本地倉(cāng)庫(kù)推送同步到遠(yuǎn)程github倉(cāng)庫(kù)(需要權(quán)限)
Pull request:將你github倉(cāng)庫(kù)的修改同步到代碼原始開(kāi)發(fā)者那(fork過(guò)來(lái)的那個(gè)人)
fetch:去取來(lái)黍氮。也就是說(shuō)當(dāng)你fork了別人的項(xiàng)目,你可以pull request合并你的代碼到作者代碼浅浮。同樣沫浆,作者修改了自己的代碼你也可以fetch下來(lái)同步到自己的本地倉(cāng)庫(kù)。
branches:分支滚秩。
注:如果你沒(méi)被作者授權(quán)為他某個(gè)倉(cāng)庫(kù)的合作者专执,你不能push。只能fork過(guò)來(lái)然后修改完pull request請(qǐng)求作者合并郁油,作者通過(guò)請(qǐng)求后就能合并代碼本股。
圖文結(jié)合:
基本操作
可見(jiàn)本地創(chuàng)建一個(gè)工作區(qū)拄显,使用git add 指令會(huì)添加到暫存區(qū),再使用commit 把暫存區(qū)的文件提交到本地倉(cāng)庫(kù)案站。還可以使用remote add origin 添加遠(yuǎn)程origin躬审。然后git push (-u)(第一次提交帶u) origin master。當(dāng)然了上面的遠(yuǎn)程倉(cāng)庫(kù)是你在github上創(chuàng)建的,如果是新項(xiàng)目盒件,必須新建一個(gè)倉(cāng)庫(kù)蹬碧。
通用操作
- git log <–pretty=oneline>
—— 查詢(xún)某個(gè)git倉(cāng)庫(kù)的commit記錄。包含唯一hash標(biāo)識(shí)炒刁、提交者(git config usr.name/user.email配置的內(nèi)容)恩沽、時(shí)間戳。
1.1 git log --graph --oneline --decorate --all 可以查看圖形化的分支提交記錄
1.2 git log --graph --pretty=oneline --abbrev-commit
—— 同上 - git reflog 查詢(xún)完整log
- git status 查看文件的修改情況翔始,提交情況罗心。
- git blame filename 查看文件的最后修改記錄,包括修改者城瞎,修改時(shí)間渤闷,修改內(nèi)容
- git reflog 顯示每一次操作指令。
本地倉(cāng)庫(kù)到自己github:
github上創(chuàng)建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)脖镀。
git init
—— 初始化一個(gè)目錄為工作區(qū)飒箭,創(chuàng)建本地倉(cāng)庫(kù)。git add ./文件名
—— 添加文件到工作空間暫存區(qū)蜒灰。-
git commit -m '備注'
—— 將工作區(qū)的暫存區(qū)文件提交到本地倉(cāng)庫(kù)并附帶備注弦蹂。圖片說(shuō)明了哪個(gè)分支,哪個(gè)commit_Id强窖,做了哪些備注凸椿。有幾個(gè)文件被修改,插入了幾行新的翅溺。
git remote add origin(該為主機(jī)名脑漫,可以自己命名) url
—— 本地倉(cāng)庫(kù)添加一個(gè)遠(yuǎn)程主機(jī)并命名。git push <-u>(設(shè)置默認(rèn)遠(yuǎn)程分支=寫(xiě)的遠(yuǎn)程分支) origin(遠(yuǎn)程主機(jī)名) 本地分支名<:遠(yuǎn)程分支名>(不寫(xiě)為同分支名咙崎,如不存在則新建)
——將本地倉(cāng)庫(kù)分支推送到遠(yuǎn)程倉(cāng)庫(kù)的分支(需要有權(quán)限优幸,如果不是自己的github的倉(cāng)庫(kù),則需要?jiǎng)e人授權(quán)倉(cāng)庫(kù)的contributor權(quán)限)叙凡。此外url可以有多種格式:https://github.com/用戶(hù)名/遠(yuǎn)程倉(cāng)名.git 劈伴、git://開(kāi)頭的靠ssh協(xié)議、或git@github.com:用戶(hù)名/遠(yuǎn)程倉(cāng)名.git握爷。
6.1 git push
—— 推送當(dāng)前分支跛璧,只有1個(gè)遠(yuǎn)程跟蹤分支或有默認(rèn)主機(jī)時(shí)使用。當(dāng)多個(gè)用戶(hù)共同開(kāi)發(fā)的時(shí)候新啼,可能你的提交比你的同伴晚追城,所以你需要先pull下最新版本,然后在本地合并后繼續(xù)push燥撞。
6.2 git branch --set-upstream-to=origin/dev dev
—— 繼續(xù)6.1座柱。pull失敗時(shí)迷帜,可能是本地分支dev沒(méi)有和遠(yuǎn)程分支建立連接,不知道你從哪個(gè)分支pull到哪個(gè)分支色洞。git reset hash碼(git log顯示的commit標(biāo)識(shí))
—— 回退本地倉(cāng)庫(kù)到某次commit后的狀態(tài)(也就是移動(dòng)HEAD指針到某次commit處)戏锹。而如果要回退到回退處之后的版本(當(dāng)前和會(huì)退前之間的commit點(diǎn)),git log是查不到版本號(hào)的火诸,用git reflog查詢(xún)每一次指令锦针。
7.1 git reset -hard 版本號(hào)
—— 是使得WS也回退到某次commit的樣子,而不只是本地倉(cāng)庫(kù)置蜀。
7.2 git reset - hard HEAD^
—— HEAD指向當(dāng)前版本奈搜,一個(gè)表示上一個(gè)版本。兩個(gè)^就是上上版本盯荤,或者HEAD~2馋吗。
7.3 git reset HEAD filename
—— 將暫存區(qū)的東西測(cè)撤回到工作區(qū)git restore <filename>
—— 放棄、撤回秋秤、恢復(fù)工作區(qū)中某個(gè)文件的修改宏粤。
8.1 git restore --staged <filename>
—— 當(dāng)你add某個(gè)文件到暫存區(qū),你要使用這個(gè)指令來(lái)從暫存區(qū)中移除該文件灼卢,然后再使用8的指令來(lái)恢復(fù)該文件商架。git checkout -- filename
—— 檢回文件。丟棄工作區(qū)修改到最近一次add或commit狀態(tài)芥玉。即將工作空間的文件恢復(fù)到本地倉(cāng)庫(kù)的版本。如果工作空間的文件修改后被add到暫存區(qū)了备图,則恢復(fù)到暫存區(qū)狀態(tài)灿巧。除非使用8.1從暫存區(qū)退出,然后才能恢復(fù)到本地倉(cāng)庫(kù)版本揽涮。
9.1 git checkout commmit_id 檢出某個(gè)版本的信息抠藕。這也會(huì)直接把HEAD移到那個(gè)版本導(dǎo)致git log和commit記錄沒(méi)了。需要git reflog 和git reset --hard commit_id 回到現(xiàn)在git tag tagname <first-10-chars-commid-id>
—— 為最后一次 <某次>commit打tag
10.1 git tag -a <tagname> -m "blablabla..."
—— 帶有注釋的標(biāo)簽蒋困。
10.2 git show tagname
—— 展示tag對(duì)應(yīng)的commit修改的內(nèi)容
10.3 git push origin <tagname>
—— 推送一個(gè)本地標(biāo)簽到遠(yuǎn)程倉(cāng)庫(kù)
10.4 git push origin --tags
—— 推送本地所有標(biāo)簽到遠(yuǎn)程
10.5 git tag -d tagname
—— 刪除本地tag
獲取別人的代碼到自己github并本地倉(cāng)庫(kù)修改:
- 在github上fork別人的代碼到自己的github上作為倉(cāng)庫(kù)盾似。
- git clone 倉(cāng)庫(kù)網(wǎng)址url
—— 克隆一個(gè)一模一樣的遠(yuǎn)程庫(kù)到本地庫(kù)。當(dāng)然不一定要從主機(jī)github上克隆雪标。且自動(dòng)關(guān)聯(lián)主機(jī)且默認(rèn)遠(yuǎn)程倉(cāng)庫(kù)主機(jī)名叫origin零院。使用git clone -o 名字 url 可以修改默認(rèn)名。 - 本地到自己github操作見(jiàn)以上村刨。
- 添加一個(gè)遠(yuǎn)程主機(jī)關(guān)聯(lián)(使用原作者url)
- git fetch origin(遠(yuǎn)程主機(jī)名) master(分支名告抄,不寫(xiě)=所有分支,下同)
—— 獲取原作者某個(gè)分支的最新版本嵌牺。 - git branch -a(ll)
—— 查看所有分支打洼。 - git diff 源分支 目標(biāo)分支或者git log -p master(本地分支名)..origin(遠(yuǎn)程主機(jī)名)/遠(yuǎn)程分支名
—— 比較本地和某個(gè)關(guān)聯(lián)的差別龄糊。 - git merge origin(遠(yuǎn)程主機(jī)名)/遠(yuǎn)程分支名
—— 合并當(dāng)前本地分支和遠(yuǎn)程分支。 - git pull origin(遠(yuǎn)程主機(jī)名) master(遠(yuǎn)程分支名) :本地分支名
—— 相當(dāng)于 fetch+merge募疮。缺少檢查差別的這步炫惩。如果遠(yuǎn)程分支和本地分支一個(gè)名字則:本地分支可以省略。 - git remote -v :查看遠(yuǎn)程主機(jī)名列表
WS未提交當(dāng)前內(nèi)容卻想進(jìn)行其他工作事項(xiàng)時(shí)阿浓。
- git stash
—— 隱藏當(dāng)前工作空間的修改 -
git stash list
—— 列出stash 記錄
3 git stash -pop 恢復(fù)現(xiàn)場(chǎng)并刪除一個(gè)stash記錄他嚷。
3.1 git stash apply
—— 恢復(fù)現(xiàn)場(chǎng),但不刪除stash記錄
3.1 git stash drop
—— 刪除一條stash記錄
如果你沒(méi)保存自上次commit后修改的內(nèi)容就切換分支搔扁,則回丟失本次修改(被目標(biāo)branch的上次commit重寫(xiě)而丟失)爸舒。但是你又想切換分支怎么辦?可以使用儲(chǔ)藏功能來(lái)保存工作現(xiàn)場(chǎng)
分支管理
多人協(xié)作中稿蹲,github上存放鏡像扭勉,其中有master分支是要發(fā)布的版本,其余分支是并行的苛聘,可以合并到主分支上涂炎。各分支是不同開(kāi)發(fā)者從他們的本地倉(cāng)庫(kù)分支推上來(lái)的。
分支
git使用一個(gè)"鏈表"來(lái)記錄倉(cāng)庫(kù)里的每次"修改記錄"(提交)设哗。用于保存提交的記錄鏈表是可以被命名的唱捣,它就是我們常說(shuō)的分支。
如master分支网梢,可以當(dāng)作一個(gè)鏈表頭震缭,指向最新一次commit。其中的eb6b50類(lèi)似的數(shù)值是hash值战虏,用來(lái)唯一標(biāo)識(shí)一個(gè)提交或其他git的結(jié)構(gòu)拣宰,有點(diǎn)類(lèi)似于指針和地址味道。
一個(gè)倉(cāng)庫(kù)中可以同時(shí)存在多個(gè)分支烦感,我們可以基于任何一次提交巡社,新建一個(gè)分支,并讓之后的提交都沿著新分支流動(dòng)手趣。
HEAD指針晌该,指向當(dāng)前正在操作的分支的最新的提交點(diǎn),你所處分支變化了绿渣,HEAD就會(huì)跟著變化朝群。
注:分支名指向分支的最新一次提交,HEAD指向當(dāng)前分支的最新一次提交 中符,由于git倉(cāng)庫(kù)是使用“鏈表”的形式管理各個(gè)提交的潜圃,隨意修改鏈表頭的位置,即可回退到某一個(gè)版本上(git reset)舟茶。
相關(guān)指令:
- git branch谭期,創(chuàng)建新分支堵第、查看倉(cāng)庫(kù)中有哪些分支、查看當(dāng)前分支隧出、等等踏志。其實(shí)就是創(chuàng)建一個(gè)指向某次提交的指針,每次新提交都從分支指向的commit后插入
1.1 git branch name —— 創(chuàng)建分支胀瞪。
1.2 git branch -a —— 查看所有分支(包括遠(yuǎn)程倉(cāng)庫(kù))针余。
1.3 git branch -r —— 查看遠(yuǎn)程倉(cāng)庫(kù)分支。
1.4 git branch –d name —— 刪除分支凄诞。
1.5 git branch --set-upstream branch-name origin/branch-name
—— 建立本地分支和遠(yuǎn)程分支之間的連接圆雁,這樣在某個(gè)分支上pull和push就不需要指定目標(biāo)分支了直接git pull 或git push。一般也就master和dev需要建立兩邊同步帆谍,其他的不需要上傳下載的本地分支也就不需要建立連接的 - git checkout伪朽,切換分支、創(chuàng)建并切換分支汛蝙、等烈涮,其實(shí)就是移動(dòng)HEAD的指向。
2.1 git checkout -b name —— 創(chuàng)建并切換分支窖剑。
2.2 git checkout -b dev origin/dev
—— 從遠(yuǎn)程倉(cāng)庫(kù)克隆下來(lái)的倉(cāng)庫(kù)在本地只有master分支坚洽,其他分支需要?jiǎng)?chuàng)建遠(yuǎn)程分支的本地分支。
2.3 git checkout name —— 切換分支西土。 - git switch
3.1 git switch -c dev
—— 也是切換并創(chuàng)建分支讶舰,使用switch避免了checkout的兩種用途(撤回、切換分支)的混淆 - git merge name —— 合并分支name到當(dāng)前分支需了,使用fast forward模式(直接丟棄被合并分支)绘雁。
4.1 git merge –no-ff -m “注釋” name —— 禁用fast forward合并模式來(lái)合并,保留被合并分支援所。
4.2 如果合并出現(xiàn)沖突,則不會(huì)在合并的時(shí)候自動(dòng)提交合并體欣除,而是停下來(lái)等用戶(hù)修改完沖突后提交住拭。可以用git status查看時(shí)哪些沖突历帚。沖突的文件中會(huì)被類(lèi)似如下顯示文本滔岳,手動(dòng)選擇一個(gè)然后刪去所有文字即可手動(dòng)合并。
<<<<<<< HEAD:index.html
contact : email.support@github.com
=======
please contact us at support@github.com
>>>>>>> iss53:index.html
- git cherry-pick commit_id
—— 把某次提交的內(nèi)容合并到本分支上挽牢。比如我們把master的bug修復(fù)了谱煤。但是在修復(fù)之前咱們?cè)賒ev上進(jìn)行了很多開(kāi)發(fā)是沒(méi)修復(fù)這個(gè)bug的基礎(chǔ)的,為了修復(fù)dev上的bug禽拔,可以用這個(gè)指令把master上修復(fù)bug的commit的內(nèi)容合并到本分支上刘离,并創(chuàng)建一個(gè)新的commit室叉。
利用分支進(jìn)行開(kāi)發(fā)的工作流程
簡(jiǎn)單的說(shuō)就是有一個(gè)穩(wěn)定的master,有一個(gè)不穩(wěn)定的dev硫惕,而每個(gè)人都有自己的一個(gè)獨(dú)立dev分支取名為自己的名字茧痕,然后各自往dev上提交,如果遇到bug了就創(chuàng)建臨時(shí)分支來(lái)debug恼除,有其他的小嘗試比如新功能也不要再dev上開(kāi)發(fā)踪旷,先額外再創(chuàng)建一個(gè)分支在上面開(kāi)發(fā),在合并到自己的dev上豁辉。等dev開(kāi)發(fā)到1.0/2.0版本了令野,在合并到master上發(fā)布。
長(zhǎng)期分支
在每次合并新穩(wěn)定內(nèi)容到master后徽级,創(chuàng)建一個(gè)next或develop分支進(jìn)行后續(xù)的開(kāi)發(fā)气破。
特性分支
多個(gè)分支同時(shí)開(kāi)發(fā),然后簡(jiǎn)單的三方合并灰追。
遠(yuǎn)程分支
你clone下來(lái)后堵幽,自動(dòng)生成一個(gè)origin的遠(yuǎn)程主機(jī)和分支origin/master。同時(shí)本地也生成一個(gè)分支叫master弹澎,指向同一個(gè)提交
此后你基于此一直開(kāi)發(fā)朴下,即master一直后移,且別人把新的內(nèi)容推到遠(yuǎn)程倉(cāng)庫(kù)苦蒿,但是只要你沒(méi)和遠(yuǎn)程倉(cāng)庫(kù)交互殴胧,這個(gè)遠(yuǎn)程分支就不會(huì)移動(dòng)。
通過(guò)git fetch指令可以同步遠(yuǎn)程倉(cāng)庫(kù)數(shù)據(jù)到本地佩迟。
推送本地分支
就是push了
分支的衍合
之前的合并是使用三方合并即分支1和分支2及其共同祖節(jié)點(diǎn)(也就是分叉點(diǎn))三者的合并团滥,然后生成1次新的提交。
以上是合并的樣子报强,而衍合如下所示灸姊。以要進(jìn)行衍合的分支的最后一次提交為基礎(chǔ)生成一系列文件補(bǔ)丁,在基底(衍合目標(biāo))最后一次提交上秉溉,逐個(gè)使用補(bǔ)丁力惯。最后生成一個(gè)新的合并。
如何看懂diff內(nèi)容
- git diff
—— 用于查看staging area 和 working area 的文件差別召嘶。 - git diff refs/remotes/origin/master
—— 用遠(yuǎn)程某個(gè)分支比較當(dāng)前工作區(qū) - git diff commit_id filename
—— 比較某個(gè)文件的歷史版本和工作區(qū)的該文件對(duì)比父晶。
輸出格式
- 開(kāi)頭表示源文件,就是命令指定的那個(gè)文件弄跌。
+++ 開(kāi)頭的是目標(biāo)文件甲喝。
空格開(kāi)頭的行,是源文件和目標(biāo)文件中都出現(xiàn)的行铛只。
差異按照差異小結(jié)進(jìn)行組織埠胖,每個(gè)差異小結(jié)的第一行都是定位語(yǔ)句糠溜,由@@開(kāi)頭,@@結(jié)尾押袍。
- 開(kāi)頭表示源文件,就是命令指定的那個(gè)文件弄跌。
表示源文件第1行開(kāi)始的2行和目標(biāo)文件第1行開(kāi)始的4行構(gòu)成差異小結(jié)诵冒。然后目標(biāo)文件3、4行多了2句話(huà)谊惭∑觯空格開(kāi)頭的白色行是- + 兩個(gè)文件都有的。- 開(kāi)頭的是源文件有的(已經(jīng)提交的)圈盔,+是工作空間中的文件的內(nèi)容豹芯。
配置別名
為什么要配置別名因?yàn)閼械么蜃至?br>
git config --global alias.st status
—— 這樣st就是status的意思了,以后git status只需要輸入git st驱敲。
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
—— 好用铁蹈!
想要?jiǎng)h除配置就去看文件的內(nèi)容刪除就好了。
如果是加了--glbal 就是針對(duì)當(dāng)前用戶(hù)的配置众眨。否則就是針對(duì)當(dāng)前庫(kù)的握牧。用戶(hù)配置在用戶(hù)目錄下的.gitconfig。而針對(duì)庫(kù)的配置在.git/config
git的原理
存儲(chǔ)結(jié)構(gòu)
blob
git將每個(gè)文件存下來(lái)娩梨。并且通過(guò)計(jì)算文件的內(nèi)容SHA-1 哈希值為校驗(yàn)和(40個(gè)字節(jié))沿腰。如果修改了內(nèi)容、名字狈定、目錄颂龙,該值都會(huì)變,通過(guò)判斷校驗(yàn)和是否變了判斷文件是否修改纽什。然后以40個(gè)字節(jié)的頭2個(gè)字節(jié)為目錄名措嵌,后38個(gè)字節(jié)16進(jìn)制為名字保存文件
tree
tree類(lèi)似于目錄。一個(gè)tree可以存儲(chǔ)tree和blob對(duì)象的記錄芦缰,每一條記錄都含有一個(gè)指向blob或子樹(shù)的SHA-1指針企巢,并附帶對(duì)象權(quán)限、類(lèi)型让蕾、文件名等信息浪规。
commit
對(duì)象的存儲(chǔ)
如何存儲(chǔ)一個(gè)blob呢?{blob 文件內(nèi)容長(zhǎng)度\0}花括號(hào)內(nèi)容為文件頭涕俗,后面拼接文件內(nèi)容行成新內(nèi)容。然后計(jì)算新內(nèi)容的SHA-1校驗(yàn)和神帅,然后用zlib壓縮數(shù)據(jù)再姑,以SHA-1前2個(gè)字節(jié)為目錄,后38個(gè)字節(jié)為文件名進(jìn)行磁盤(pán)的寫(xiě)入找御。所有的git對(duì)象都是以這種方式存儲(chǔ)的元镀。
綜合以上所說(shuō):我們知道了Git和所有版本控制軟件一樣绍填,只能跟蹤文本文件(就是代碼等)。對(duì)于圖片栖疑、影音讨永,雖然也能進(jìn)行版本控制,但是只能知道其是否刪除和修改遇革,但是修改了哪些內(nèi)容是不知道的卿闹。這類(lèi)非純文本(包括word和markdown)是以二進(jìn)制形式串起來(lái)編碼的。