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