序言:目前去枷,Git是比較流行的版本管理系統(tǒng)久免。相比于SVN,我更偏愛(ài)Git! 本文將詳細(xì)介紹使用Git的一些心得谢揪。
什么是Git?
Git是一種分布式版本控制系統(tǒng)(DVCS)蕉陋,也稱(chēng)為分散式。每個(gè)開(kāi)發(fā)人員都擁有存儲(chǔ)庫(kù)的完整副本拨扶,該存儲(chǔ)庫(kù)位于云中(遠(yuǎn)程倉(cāng)庫(kù))凳鬓。
安裝Git
本人使用的是Mac,終端自帶Git工具
- Mac:通過(guò)Homebrew安裝
# 安裝homebrew
/usr/bin/ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install)"
# 安裝Git
brew install git
- Linux
sudo apt-get update
sudo apt-get install git
使用Git
創(chuàng)建本地存儲(chǔ)庫(kù)
git init
- 執(zhí)行完git init后本地倉(cāng)庫(kù)已初始化完成患民。ls -a可以查看到.git的隱藏文件
更新倉(cāng)庫(kù)內(nèi)容
創(chuàng)建文件并修改內(nèi)容
# 創(chuàng)建一個(gè)README文件
touch READEM.md
# 寫(xiě)入一些內(nèi)容到READEM.md
echo 'hello,world' >> READEM.md
# 打印READEM.md文件內(nèi)容
cat READEM.md
查看倉(cāng)庫(kù)狀態(tài)
git status
# 或者 git status -s
將變更的文件納入版本管理
git add .
# . 是將所有的文件遞歸納入版本管理缩举,若單個(gè)添加git add READEM.md 即可
將納入版本管理的文件提交到本地倉(cāng)庫(kù)
git commit -m 'first commit'
查看日志
git log # 命令是查看全部提交日志
git log -2 # 查看最近2次的提交日志
git log -p # 查看歷史紀(jì)錄以來(lái)哪幾行被修改
git log --stat --summary # 查看每個(gè)版本變動(dòng)的檔案和行數(shù)
日志的樣式略微難看,這里給大家推薦一個(gè)配置
# 給git log起一個(gè)別名:git lg
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(red)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
# 更改之后
git lg # 命令是查看全部提交日志
....
分支
創(chuàng)建分支
git branch dev1
Git創(chuàng)建分支時(shí)匹颤,它只是創(chuàng)建一個(gè)帶有該分支名稱(chēng)的指針仅孩,該指針指向已創(chuàng)建分支的commit
切換到dev1分支進(jìn)行開(kāi)發(fā)
git checkout dev1
接下來(lái)的所有操作都在dev1分支上,我們?nèi)匀粊?lái)更新倉(cāng)庫(kù)的文件內(nèi)容
touch dev1.txt
echo 'this is text file' >> dev1.txt
# 查看狀態(tài)
git status -s
# 納入版本控制
git add .
# 提交
git commit -m 'create a dev1 text file'
# 查看日志
git lg
合并分支
假設(shè)印蓖,這條分支的任務(wù)已完成辽慕,我們切換到主線master上去
git checkout master
此時(shí),我們?cè)俨榭慈罩旧馑啵](méi)有剛剛提交的'create a dev1 text file'溅蛉。原因是:之前所有的操作都在dev1分支上執(zhí)行公浪,現(xiàn)在切回到master分支自然沒(méi)有剛剛的日志記錄。在實(shí)際項(xiàng)目開(kāi)發(fā)中寫(xiě)了不就沒(méi)有意義了嗎船侧?** 所有我們要將dev1分支與master合并欠气!**
git merge dev1
合并問(wèn)題
合并之后再次查看日志,你會(huì)發(fā)現(xiàn)并沒(méi)有存在dev1分支的存在勺爱,與我們相像的并不一致救巷,這是為何腥刹?
原因:這是因?yàn)镚it使用快進(jìn)模式(fast-forward)合并了分支须尚。這里需要注意git給我們打印的輸出信息,如上圖所示:master和dev1是共同的祖先浩螺!
** 在我們合并分支時(shí)望伦,不推薦使用fast-forward模式陆馁!可以通過(guò)--no-ff(無(wú)快進(jìn)模式)命令來(lái)處理**
# 新建分支dev2重復(fù)dev1的操作绳匀,再次合并
git merge --no-ff dev2
通過(guò)這種方式來(lái)合并分支台腥,可以完美的顯示分支的生命跡象投放!
刪除分支
假設(shè)分支合并完成奈泪,此分支已沒(méi)有作用,我們應(yīng)該移除此分支灸芳,以后可再次創(chuàng)建命名為dev1分支
git branch -d dev1
合并沖突
下面模擬一下合并沖突問(wèn)題涝桅!
- 在master分支上更新倉(cāng)庫(kù)并提交
# master分支更新倉(cāng)庫(kù)并提交
echo 'this is a test log' >> README.md
git status -s
git add .
git commit -m 'readme file change content'
# master分支更新倉(cāng)庫(kù)并提交
echo 'this is two' >> README.md
git status -s
git add .
git commit -m 'readme file change content two'
# 切換到dev2分支,更新倉(cāng)庫(kù)并提交
git checkout dev2
echo 'this is dev2 change' >> README.md
git status -s
git add .
git commit -m 'readme file change content dev2 change'
# 再次切換到master分支烙样,更新倉(cāng)庫(kù)并提交
git checkout master
echo 'this is three' >> README.md
git status -s
git add .
git commit -m 'readme file change content three'
# 做完上述工作冯遂,接下來(lái)合并
合并
git merge dev2
很顯然,合并失斱嘶瘛蛤肌!此時(shí),兩個(gè)分支的版本存在沖突批狱,Git已經(jīng)不知道怎么做了裸准。** 在master更新倉(cāng)庫(kù)并提交之后版本已經(jīng)改變,master已不是上次上傳的版本赔硫,而dev2分支還是從上一次合并的HEAD開(kāi)始炒俱;所以這時(shí)是無(wú)法合并的。而Git所做的事情是:指出存在這些內(nèi)容不兼容的部分爪膊。**
- 接著权悟,我們看一下倉(cāng)庫(kù)狀態(tài):git status
-
進(jìn)入README文件(vi README.md)查看更新的內(nèi)容,會(huì)發(fā)現(xiàn)多出了<<<<<<<HEAD惊完、========僵芹、>>>>>>>>dev2,這里有兩個(gè)部分:
- 第一部分:在<<<<<<< HEAD和=======之間小槐,是master分支更新的內(nèi)容拇派;
-
第二部分:在=======和>>>>>>> dev2之間荷辕,是dev2分支更新的內(nèi)容;
readme文件
-
解決辦法
- 使用HEAD-master版本
- 使用dev2版本
- 兩個(gè)版本的組合
- 使用HEAD-master版本
# 將master分支提交的信息保留件豌,去掉dev2分支的內(nèi)容疮方,并且去掉<<<<<<<HEAD、========茧彤、>>>>>>>>dev2
# 保存如下:
this is a test log
this is two
this is three
# esc退出編輯模式骡显,快捷鍵shift + : 再輸入wq,回車(chē)即可曾掂,保存并退出
# 查看狀態(tài)
git status -s
** 在一開(kāi)始合并時(shí)惫谤,查看倉(cāng)庫(kù)狀態(tài)README文件還是Unmerge 狀態(tài),在git status -s下是紅色的:UU README.md珠洗;而現(xiàn)在是AA README.md **
readme文件
git add .
git commit -m 'save HEAD version, remove dev2 version'
# 這里雖然使用了HEAD版本溜歪,但是保存了dev2分支的生命跡象
# 合并完成,刪除dev2分支
git branch -d dev2
- 使用dev2版本
# 與第一種解決辦法同理
- 兩個(gè)版本的組合
# 兩個(gè)版本組合就是兩者都保留许蓖,所以只需要去掉<<<<<<<HEAD蝴猪、========、>>>>>>>>dev2即可
# esc退出編輯模式膊爪,快捷鍵shift + : 再輸入wq自阱,回車(chē)即可,保存并退出
git add .
git commit
版本合并完之后如下:
版本回退(刪除)
- 命令
git reset --hard <版本號(hào)> # 回退到對(duì)應(yīng)的版本號(hào)米酬,這里的版本號(hào)就是日志前面的7個(gè)字符
git reset --hard -HEAD^ # 刪除最后一次提交的版本沛豌,也就是回退到最后倒數(shù)第二次版本
git reset --hard -HEAD~ # 刪除最后一次提交的版本,也就是回退到最后倒數(shù)第二次版本
git reset --hard -HEAD^^ # 刪除最后兩次次提交的版本淮逻,也就是回退到最后倒數(shù)第三次版本
.... 其他的依次類(lèi)推
強(qiáng)推到某個(gè)分支
git push origin 分支名 --force
or
git push -f origin 分支名
clone命令
在碼云或者Github上要克隆別人的代碼琼懊,需要用到clone命令
git clone <倉(cāng)庫(kù)地址:url/ssh> # 如下圖所示
[圖片上傳失敗...(image-b0ef86-1550730346214)]