Git是目前開源軟件使用做多的版本管理軟件。
安裝Git
以debian系統(tǒng)為例,安裝命令是
apt install git
安裝成功之后就可以直接clone
遠(yuǎn)程倉庫到本地了,但是如果想向遠(yuǎn)程倉庫提交代碼對的話,就需要做下面幾步
- 用個(gè)人郵箱注冊
github
- 配置本地
git
git config --global user.name "yourname"
git config --global user.email youremail
- 生成
ssh key
ssh-keygen -t rsa -C "youremail"
將生成的~/.ssh/id_rsa.pub
中的內(nèi)容添加到github賬戶,路徑settings -> SSH and GPG keys
Git操作
獲取Git倉庫
這里有一個(gè)概念,Git的倉庫并不只是指Github服務(wù)器上存儲的倉庫,在我們本地存儲的也是Git的倉庫,因此獲取Git倉庫的方法有兩個(gè)
- 獲取遠(yuǎn)程倉庫
git clone remote_url
- 將當(dāng)前目錄初始化為Git倉庫
git init
使用init
命令初始化后,我們會發(fā)現(xiàn)當(dāng)前目錄下多了一個(gè).git
目錄,這里面就是Git的版本控制信息。
將改動納入版本控制
獲取遠(yuǎn)程Git倉庫后,做的最多的就是在工作區(qū)修改、新增和刪除文件,也就是實(shí)實(shí)在在看到的代碼文件,修改完成之后就需要將本次的修改內(nèi)容納入到Git的版本控制中,一般的步驟如下:
git status # 將顯示出做了什么改動,例如modify、add和remove
git diff # 查看文件修改了哪些內(nèi)容
git add # 將文件的改動情況提交到暫存區(qū)
git commit -m "log" # 將暫存區(qū)中的內(nèi)容提交到本地倉庫的master分支
從上面的指令可以看出,在執(zhí)行完commit之后,我們所做的修改已經(jīng)納入到了git的版本控制中,這一點(diǎn)可以通過git log查看到。使用過svn版本控制的童靴從這里可以看出svn和git的本質(zhì)差別,svn的每次提交是提交到svn服務(wù)器,也就是中心;而git則是將修改提交到本地倉庫,有點(diǎn)去中心化的意思。后面我們也會講到git的遠(yuǎn)程倉庫,但遠(yuǎn)程倉庫代碼的意義更多的在于共享。
推送到遠(yuǎn)程倉庫
筆者一般是先創(chuàng)建遠(yuǎn)程倉庫,然后clone
下來,這樣就可以直接提交
git fetch # 拉取遠(yuǎn)程倉庫的修改
git push origin master
將本地倉庫master
分支的修改提交到遠(yuǎn)程倉庫,這里的origin
是遠(yuǎn)程倉庫url
的別名,可以使用git remote -v
來查看。使用git clone
指令獲取的倉庫origin
默認(rèn)值是遠(yuǎn)程倉庫url
,本地創(chuàng)建的Git倉庫需要使用命令來鏈接本地與遠(yuǎn)程。
git remote add origin https://github.com/xxx/test.git
完成提交之后我們可以通過
git log
來查看提交記錄。
修改回退
在實(shí)際工作過程中,有時(shí)候我們會需要撤銷我們的修改,在不同的階段回退的指令是不同的。
只修改了代碼,還沒有add到暫存區(qū)
這個(gè)階段我們可以手動將修改內(nèi)容修改回來,但是如果記不得具體的內(nèi)容或者涉及的文件比較多的時(shí)候可以使用
git cheakout -- filename # 回退工作區(qū)文件的修改,回退到暫存區(qū)中該文件的狀態(tài)
這里我們需要搞清楚暫存區(qū)中文件的狀態(tài)有兩個(gè)映像:工作區(qū)add
提交的和自身commit
到本地倉庫的,否則這里會有一點(diǎn)亂。
已經(jīng)將修改add到暫存區(qū)
這種情況下我們需要把文件的改動從暫存區(qū)中撤除
git reset HEAD filename # 利用本地倉庫master分支的HEAD節(jié)點(diǎn)刷一下暫存區(qū)中的文件狀態(tài),也就是清空工作區(qū)到暫存區(qū)的提交內(nèi)容
完成之后我們可以繼續(xù)修改或者是checkout徹底撤銷之前的修改。
已經(jīng)將修改從暫存區(qū)commit到本地倉庫,有兩種方法
- 強(qiáng)制回退
不推薦
git reset --hard old_commit_id && git push -f # 回退到old_commit_id并將此次修改強(qiáng)制推送到遠(yuǎn)程倉庫
這里只是調(diào)整了本地倉庫master
分支的HEAD節(jié)點(diǎn)的指向,commit_id
可以通過git log
命令獲取到。
- 將回退作為修改
強(qiáng)烈推薦
假設(shè)我們師門使用git log
查詢到最后兩次的提交id是id1
和id0
,我們要回退這兩次修改
git revert id0 && git revert id1 # 回退順序與提交順序相反
或者
git revert id1^..id0
下面講一下cherry-pick - 一個(gè)有生活感的概念
,最后兩次提交還是id1
和id0
,但是需要回退只有id1
,這個(gè)時(shí)候應(yīng)該這么辦
git revert id0 && git revert id1 # 回退id0和id1
git commit id0_modify # 重新提交id0的修改
分支管理
分支的作用在于并行開發(fā),能夠提高開發(fā)效率。
git branch bra_name # 創(chuàng)建分支bra_name
git branch -l # 查看所有分支,當(dāng)前分支前面有*標(biāo)記
git checkout bra_name # 切換到分支bra_name
git merge bra_name # 將bra_name中的修改合并到當(dāng)前分支,注意在合并之前一定要切換到目標(biāo)分支
參考文獻(xiàn)
[1] Git如何優(yōu)雅的進(jìn)行版本回退