一 Git. 的安裝
安裝了 XCode 集成了 git, 所以直接在終端使用
$ git --version
git version 2.4.9 (Apple Git-60)
安裝完成之后需要在終端中配置一下
$git config --global user.name "your name"
$git config --global user.email "your email"```
> 注意: git config 命令的--global 參數(shù),使用這個(gè)參數(shù)表示當(dāng)前使用的這臺(tái)機(jī)器上的 git 倉(cāng)庫(kù)都會(huì)使用這個(gè)配置,當(dāng)然可以對(duì)某個(gè)參數(shù)指定不同的username 和 email
#二. 創(chuàng)建版本庫(kù)
版本庫(kù):(respository),可以理解為一個(gè)目錄,在這個(gè)目錄下得所有文件都被 git 管理起來(lái),所有的增刪改查都會(huì)被 git 記錄下來(lái), 便于任何時(shí)候都可以追蹤歷史,或者還原
- 1.創(chuàng)建一個(gè)目錄 并進(jìn)入到該目錄下
``` shell
$mkdir test
$cd test/
- 2.初始化這個(gè)目錄,變成可以管理的倉(cāng)庫(kù)
$git init
Initialized empty Git repository in /Users/Chris/work/test/.git/
- 3.在當(dāng)前目錄下會(huì)多一個(gè) .git 目錄,默認(rèn)是隱藏目錄
$ls -ah //命令可以查看
- 4.添加文件到倉(cāng)庫(kù)中,例如添加了一個(gè) readme.text 文件到當(dāng)前目錄下,然后加到 git緩存區(qū)$git add readme.text 或者 $git add . ("."表示添加當(dāng)前目錄下所有的可提交的文件);
$git add .
$git commit -m "add readme.text"
三. 版本回退
- 1.如果需要查看工作區(qū)的狀態(tài),可以使用
$git status 命令查看
- 2.如果 $git status 提示有文件被修改,可以使用 $git diff 查看修改的內(nèi)容
$git diff
- 3.$git log 命令可以顯示最近到最遠(yuǎn)的提交日志,如果輸出的信息太多,可以加上 --pretty=oneline 參數(shù), 顯示的 hash 值太長(zhǎng)可以加上 --abbrev-commit 需要查看歷史合并記錄 加上 --graph
$git log --abbrev-commit --pretty=oneline --graph
- 4.根據(jù)看到的一大串?dāng)?shù)據(jù),既是對(duì)應(yīng)每個(gè)提交點(diǎn)的 commit id 可以回退到任意點(diǎn)
$git reset --hard 123456(commit id)//可以不用整串都輸進(jìn)來(lái)
$git reset --hard HEAD //表示撤銷(xiāo)當(dāng)前緩存中的修改內(nèi)容
$git reset --hard HEAD^ //表示退到上一個(gè)提交點(diǎn) HEAD^^以此類(lèi)推
$git reset --hard HEAD~100 //回到100個(gè)提交點(diǎn)
- 5.需要重返未來(lái)的提交點(diǎn),可以使用 reflog 查看命令歷史,以便確定要回到未來(lái)的哪個(gè)版本上
$git reflog
四. 工作區(qū)和暫存區(qū)
- 工作區(qū): 就是我們能看到的目錄,如 test 文件夾就是一個(gè)工作區(qū)
- 版本庫(kù): 工作區(qū)中有個(gè).git 文件夾,這個(gè)不是工作區(qū),而是 git 的版本庫(kù)
git的版本庫(kù)有很多東西,最重要的就是稱(chēng)為 stage 或者叫 index 得暫存區(qū),還有 git 為我們創(chuàng)建的第一個(gè)分支 master, 以及指向 master 的一個(gè)指針叫做 HEAD,我們已經(jīng)知道把一個(gè)文件添加到 git 版本庫(kù)分為兩個(gè)步驟:
1.把文件添加進(jìn)去,實(shí)際上就是把修改的文件添加到暫存區(qū)
$git add .
2.提交修改,實(shí)際上就是把暫存區(qū)的所有內(nèi)容提交到當(dāng)前分支
$git commit -m "add message"
簡(jiǎn)單的理解為:需要提交的文件修改統(tǒng)統(tǒng)放到暫存區(qū),然后一次性提交所有暫存區(qū)的所有修改,如果文件沒(méi)有 add 到暫存區(qū)中,那么就不會(huì)加入到 commit 中
五. 撤銷(xiāo)修改
丟棄工作區(qū)的修改
$git checkout -- readme.txt
意思就是把 readme.txt 文件所在工作區(qū)的修改撤銷(xiāo),這里有兩種情況:
- 1.readme.txt 自修改后還沒(méi)有放到暫存區(qū),那么撤銷(xiāo)修改就回到和當(dāng)前版本庫(kù)一樣的狀態(tài)
- 2.readme.text 已經(jīng)添加到暫存區(qū),又做了修改,那么現(xiàn)在撤銷(xiāo)修改就回到暫存區(qū)后的狀態(tài)
- 總之,就是讓這個(gè)文件回到最近一次 git commit 或者 git add 時(shí)的狀態(tài),$ git reset HEAD file 可以把暫存區(qū)的修改撤銷(xiāo)掉(unstage)重新放回到工作區(qū)
$ git reset HEAD readme.txt
六. 刪除文件
當(dāng)我們使用 $rm 命令刪除掉工作區(qū)中的一個(gè)文件,這個(gè)時(shí)候 git 就知道你刪除了文件,那么工作區(qū)和版本庫(kù)的文件就不一致了,$git status 可以查看那些文件被刪除掉了,那么解決的辦法有兩個(gè):
- 1.如果確定是要沖版本庫(kù)中刪除該文件,那么使用
$git rm filename //filename:刪掉的文件
$git commit
- 2.如果是刪除了,因?yàn)榘姹編?kù)里還有,所以可以把誤刪的文件恢復(fù)到最新提交的狀態(tài)
$git checkout -- filename
git checkout 其實(shí)使用版本庫(kù)里面的版本替換工作區(qū)的版本,無(wú)論工作區(qū)是被修改還是刪除,都可以一鍵還原回來(lái),但是要小心的是,只能恢復(fù)到文件最新的版本,你會(huì)丟失最近一次提交后所修改的內(nèi)容
七. 遠(yuǎn)程倉(cāng)庫(kù)
我們直接使用 github 作為遠(yuǎn)程倉(cāng)庫(kù)來(lái)實(shí)現(xiàn)
- 1.首先你需要有一個(gè) github 賬號(hào)我們使用 ssh 方式 來(lái)實(shí)現(xiàn)本地git 和遠(yuǎn)程 github同步,也可以使用 https 來(lái)實(shí)現(xiàn),這里我們通過(guò) SSH加密,所以需要提前設(shè)置,創(chuàng)建 SSH KEY, 首先在你的用戶(hù)目錄下看是否有.ssh 目錄,如果有的話(huà)再進(jìn)去看看是否有 id_rsa 和 id_rsa.pub 兩個(gè)文件($ls -ah ~/),如果有的話(huà)直接到下一步,如果沒(méi)有的話(huà),打開(kāi)終端開(kāi)始創(chuàng)建 SSH KEY:
$ssh-keygen -t rsa -C "youremail@example.com"
然后一路回車(chē),默認(rèn)即可,如果順利的話(huà)可以在用戶(hù)的主目錄下找到.ssh 目錄,里面有 id_rsa 和id_rsa.pub 兩個(gè)文件,這就是 ssh key 的密鑰對(duì), id_rsa 是私鑰不能泄露, id_rsa.pub是公鑰
- 2.登陸 Github 打開(kāi) account settings->SSH Key->add SSH Key,添加上 id_rsa.pub 文件里面的內(nèi)容
注意:在 github上提交的所有內(nèi)容任何人都是可以看到的,如果不想讓別人看到的 git 庫(kù), 有兩個(gè)辦法, 在 github 上交保護(hù)費(fèi),把倉(cāng)庫(kù)私有,另一個(gè)辦法就是搭建自己的 git 服務(wù)器,再或者是 git osc 上可以建立免費(fèi)得私有倉(cāng)庫(kù)
八. 添加遠(yuǎn)程
倉(cāng)庫(kù)前面我們已經(jīng)建好了本地 git 倉(cāng)庫(kù), 接下來(lái)我們就將代碼提交到 github上,并且想保持兩個(gè)倉(cāng)庫(kù)同步
- 1.首先在 github 上建立一個(gè)新的倉(cāng)庫(kù),最好與本地保持一致的倉(cāng)庫(kù)名稱(chēng)
- 2.關(guān)聯(lián)本地倉(cāng)庫(kù)到遠(yuǎn)程倉(cāng)庫(kù)
$git remote add origin git@github.com:chrislian/test.git
添加以后遠(yuǎn)程庫(kù)的名字就是 origin, 也可以改成其他的
- 3.我們?cè)谶h(yuǎn)程倉(cāng)庫(kù)建立了一個(gè)與本地倉(cāng)庫(kù)同名的,通常還會(huì)設(shè)置一些 README.md,LICENSE,gitignore 等文件,因此我們需要將這些文件合并到本地倉(cāng)庫(kù)中
$git pull
- 4.默認(rèn)情況下 git pull 只會(huì)抓取遠(yuǎn)程最新的代碼,并不會(huì)合并到當(dāng)前分支
- 5.我們希望每次 git pull如果有最新的希望直接幫我們合并到當(dāng)前的分支,打開(kāi)配置文件, vi .git/config 最后面添加
[branch "master"]
remote = origin
merge = refs/heads/master
也可添加其他分支,但是即使添加多個(gè)分支,git 只會(huì)幫我們合并當(dāng)前分支,其他分支需要手動(dòng)合并
$git merge origin/develop
- 6.把本地分支推倒遠(yuǎn)程分支
$git push origin master
九. 從遠(yuǎn)程克隆
$git clone git@github.com:chrislian/test.git
Github 上給出的地址不止一個(gè),還可以用 https
$git clone https://github.com/chrislian/test.git
注意:實(shí)際上 git 支持多種協(xié)議,使用 https 除了速度會(huì)慢意外,還有個(gè)最大的麻煩是每次需要輸入密碼,但是在某些只開(kāi)放 http 端口的公司內(nèi)部就無(wú)法使用 ssh 協(xié)議,只能使用 https
十. 分支管理
git 的分支是與眾不同的,無(wú)論是創(chuàng)建,切換,刪除,都可以在1秒之內(nèi)完成,不論你的版本是一個(gè)文件還是上萬(wàn)個(gè)文件
- 1.查看所有分支:
$git branch -a
- 2.創(chuàng)建分支:
$git branch develop
- 3.切換分支:
$git checkout develop
- 4.創(chuàng)建+切換分支:
$git checkout -b develop
- 5.合并某分支到當(dāng)前分支:
$git merge master
- 6.刪除分支:
$git branch -D develop
- 7.重命名分支:
$git branch -m develop develop2
- 8.刪除遠(yuǎn)程分支:
$git push origin --delete develop
當(dāng) git 無(wú)法完成自動(dòng)合并分支的時(shí)候,就必須手動(dòng)解決沖突再提交,合并分支后查看合并日志使用 $git log --graph 命令查看分支的合并圖,通常查看日志的時(shí)候,個(gè)人喜歡喜歡這樣:
$git log --abbrev-commit --pretty=oneline --graph
當(dāng)你接到一個(gè)代號(hào)為101的bug任務(wù)時(shí),很自然的,你想創(chuàng)建一個(gè)分支 "issue-101"來(lái)修復(fù)他,但是你當(dāng)前在"dev"分支上并且修改的還未提交。這個(gè)時(shí)候就可以用 "stash"功能,把當(dāng)前的工作現(xiàn)場(chǎng)儲(chǔ)藏起來(lái),等以后恢復(fù)現(xiàn)場(chǎng)繼續(xù)工作。在解決問(wèn)題以后 切換回來(lái) "dev" 分之后以,用 $git stash list命令看看
$git stash liststash@{0}:WIP on dev :23523456 add message
Git已經(jīng)把內(nèi)容存在某一個(gè)地方了,但是需要恢復(fù)一下,有兩個(gè)辦法
- 1.使用 apply 來(lái)恢復(fù),但是恢復(fù)以后 stash 內(nèi)容并不是刪除,你需要用 drop 刪除
$git stash apply stash@{0} //恢復(fù)$git stash drop stash@{0} //刪除
- 2.另一種就是使用
$git stash pop //恢復(fù)的同時(shí)把stash 也刪除了。
丟棄一個(gè)沒(méi)有被合并過(guò)得分支 可以用過(guò) branch -D來(lái)強(qiáng)制刪除
$git branch -D develop
十一. 多人協(xié)作
- 當(dāng)你從遠(yuǎn)程倉(cāng)庫(kù)克隆的時(shí)候,已經(jīng)把本地的master 分支和遠(yuǎn)程的master 分支對(duì)應(yīng)起來(lái)了,并且倉(cāng)庫(kù)的默認(rèn)名稱(chēng)是origin。要查看遠(yuǎn)程庫(kù)的信息,使用 remote 命令或者 remote -a
$git remote
$git remote -v //顯示更詳細(xì)的信息
- 當(dāng)你的同伴從遠(yuǎn)程庫(kù)clone 時(shí),默認(rèn)情況下同伴只能看到master分支。那么你的同伴需要在dev 分支上開(kāi)發(fā),就必須創(chuàng)建遠(yuǎn)程的 origin 的dev 分支到本地分支
$git checkout -b dev origin/dev
- 這樣就可以時(shí)不時(shí)的 把dev分支push 到遠(yuǎn)程上,而碰巧你也同樣做了修改,并試圖推送這個(gè)時(shí)候會(huì)提示推送失敗,那么需要用 $git pull 把罪行的提交從 origin/dev 抓下來(lái),在本地合并解決沖突在推送。
- 如果 $git pull 也失敗了,原因是因?yàn)闆](méi)有指定本地 dev分支到遠(yuǎn)程的 origin/dev分支,根據(jù)提示設(shè)置 dev 和 origin/dev的鏈接
$git branch --set-upstream dev origin/dev
$git pull
十二. 標(biāo)簽管理
- 1.打上標(biāo)簽
$git tag V0.001
- 2.在歷史提交中打上標(biāo)簽可以使用
$git tag V0.002 commit_id
- 3.查看標(biāo)簽
$git tag
- 4.刪除一個(gè)標(biāo)簽
$git tag -d V0.001
- 5.如果沒(méi)有推送到遠(yuǎn)程,打錯(cuò)的標(biāo)簽可以在本地安全的刪除,如果要覆蓋某個(gè)V0.001標(biāo)簽
$git tag -f V0.001
- 6.推送所有未推送的本地標(biāo)簽
$git push origin --tags
- 7.刪除本地標(biāo)簽:
$git tag -d V0.002
- 8.刪除遠(yuǎn)程標(biāo)簽:
$git push origin :refs/tags/V0.002