零、背景
雖然我多年前就使用 github了,但一直局限於簡單的命令,什麼分支合併刻意的去學過、用過,但是早已忘記了。
最近準備把手上的新項目從 SVN 上遷移到 Git 上,這裡需要對 Git 做一下簡單、全面、初級的了解,算是理論篇,也可以當做手冊來使用。
以後的日子裡,在具體使用 Git 的過程中,我也會介紹一些實踐操作,比如 svn 遷移 git、git 如何管理項目、git 如何合併分支等。
另外 Git 官網有完善的文檔,也提供了一本教程書籍《Pro Git》。
如果你經常使用 Git 的話建議下載讀一讀,對各種操作心中有個初步印象,至少知道有什麼功能,不至於實際使用中遇到問題手忙腳亂的。
文末也會提供了電子書的下載方式,有興趣的可以找來讀讀。
一、什麼是Git
Git 是 Linus Torvalds 開發的一個原始碼版本控制軟體。
是的,就是那個大名鼎鼎的 Linus,linux 作業系統系統內核就是他實現的。
其實Linus Torvalds自己實現這個版本控制軟體也是被逼的。因為之前他們使用的版本控制軟體是BitKeeper,2005年BitKeeper不讓 linux 內核社區免費使用這個軟體了,Linus Torvalds一怒之下自己實現了一個。
版本控制的好處有兩個。
對於過去,所有文件的變更都有記錄,從而使得所有的操作可以追溯,甚至回到某個歷史的狀態。
對於未來,可以多人分工合作實現不同的功能,最終測試通過了可以合併到一起,從而做到社區維護一個項目。
常見的版本控制軟體有CVS、SVN(Apache Subversion)、BitKeeper、Git。
我只用過 Git 和 SVN,所以這裡簡單對比一下這兩個版本控制軟體吧。
二、Git vs SVN
1.模式
Git 是分布式的,SVN 是中心式的。
分布式的好處是我們可以本地提交代碼,而中心式的必須連接中心伺服器才能提交代碼。
當然,由於 Git 功能多了,使用起來也很複雜,而 SVN 實現就簡單粗暴,操作相當簡單。
2. 目錄管理
SVN 中,一個項目可以看到很多目錄:branches、document、release、tags、trunk。
而在 Git 中,一個項目只需要一個 document 和 src 即可。
也就是說 SVN 中通過不斷的 copy 出 branches、release、tags來進行版本管理,而 Git 的代碼只有一份,通過隱藏的某些技術來進行版本管理。
3.分支管理
SVN 中每個分支都會把項目的所有代碼複製到 branches 裡面起一個新的名字(比如發一次版本時名字上加上版本號後綴)
而git則會通過技術手段,創建一個虛擬的變更節點樹來管理代碼。一個分支就是一個指針,指向某個樹節點。
如下圖,灰色代表具體的提交記錄,我們稱為樹的節點;紅色代表分支指針;棕黃色是主幹指針。
具體來說,這個圖有兩個分支,master是主幹分支,testing是測試分支。
4.tag & release
上面提到 SVN 通過 copy 實現管理,所以對於 tag 和 release 都需要分別 copy 一份所有的代碼放在一個新的目錄裡。
而對於 Git,只需要對樹節點增加一個有含義的別名,就可以通過這個名字快速找到這個階段的項目代碼。
比較常見的操作時每次發布的時候,打一個版本 tag,比如v1.2.3。有了 tag,git 中就不需要 release 目錄了。
5. 合併代碼
svn合併代碼非常痛苦。
而git內部有一個變更樹,合併代碼相當簡單。
三、安裝配置
對於 windows 可以去 github 下載:
地址:https://git-for-windows.github.io
而對於 linux,則可以直接命令行安裝:
命令:sudo apt-get install git
顯示配置列表:
git config -l
配置用戶名和郵箱:
git config --global user.name "name"
git config --global user.email "email"
設置顏色高亮:
git config --global color.ui true
註:Git 用戶的配置文件位於 ~/.gitconfig
四、基本操作
SVN 的倉庫比較簡單,只有工作倉庫與遠程倉庫。
而 Git 則有四個類型的倉庫:
1. 工作區(Workspace)
2. 暫存區(staing/index)
3. 本地倉庫(Repository)
4. 遠程倉庫(Remote)
基本操作如下:
拉遠程倉庫代碼:git clone url
添加文件(工作區=》暫存區):git add .
刪除文件(工作區=》暫存區):git rm file
重命名文件(工作區=》暫存區):git mv fromFIle toFile
提交到本地倉庫(暫存區=》本地):git commit -m "變更理由"
推動到遠程倉庫(本地=》遠程):git push origin master
拉取遠程倉庫內容(遠程=》ALL):git pull origin master
查看本地狀態:git status
對於一個新項目,如果在git託管網站上創建好了的話,直接拉下來修改即可。
git clone url
cd leetcode-solutions
touch README.md
git add README.md
git commit -m "add README"
git push -u origin master
如果本地已經有對應的目錄了,可以先創建項目,然後推送到遠程。
cd leetcode-solutions
git init
git remote add origin url
git add .
git commit
git push -u origin master
五、分支
列出本地分支:git branch
列出遠程分支:git branch -r
列出本地和遠程分支:git branch -a
新增分支(head停留在當前分支):git branch newBranchName
新增分支(head切換到新分支):git checkout -b newBranchName
切換到分支:git checkout newBranchName
tips:切換分支前,如果工作區或暫存區有修改沒有提交,會發生衝突而切換失敗。
刪除分支:git branch -d oldBranchName
刪除遠程分支:git push origin :oldBranchName
刪除遠程分支:git push origin -d oldBranchName
合併分支(生成新分支,形成一個環):git merge master
追加合併分支(旁路分支刪除):git rebase master
七、高級操作
如果多人並行開發,往往涉及到拉取其他人的代碼,或者推送給其他人。
添加其他人的倉庫:git remote add remoteName url
拉取所有分支的變化:git fetch
獲取其他人的遠程倉庫:git fetch remoteName
推送到其他人的遠程倉庫:git push remoteName branchName
完整推送命令:git push origin(倉庫名) master (本地分支名):master(遠程分支名)
比較差異:git diff
取消commit操作:git commit –amend
註:fetch 和 pull的區別是pull會將拉取的數據合併到當前分支,fetch 僅僅拉取數據不合併。
注2:origin含義為clone時的默認remoteName
查看基本操作記錄:git log
查看具體操作記錄:git reflog
查看具體修改內容:git show commitID
查看某人提交內容:git log --author=someone
指定某次提交為head:git reset commitID
回滾修改的文件:git checkout -- files
八、最後
其實這篇文章主要是記錄 Git 的操作命令,只能當做一個簡單的命令手冊。
具體操作還是需要邊查手冊邊練習。
git官網有豐富的文檔,還出了一本書,叫做《Pro Git》,可以找來瀏覽一下。
在公眾號裡回復"Pro Git"可以獲得《Pro Git》電子書
參考資料:
https://git-scm.com/doc
本文首發於公眾號:天空的代碼世界,微信號:tiankonguse-code。
我是誰:
我是天空,這裡有計算機技術、理財、讀書、電影、以及一個程式設計師的生活。謝謝你的關注、讚賞、留言、轉發、點讚、閱讀。
推薦閱讀:
讀《美麗新世界》
騰訊的競爭力與組織架構
《小狗錢錢》讀書筆記
一齣好戲是部好電影
說三個事情
緩存的兩個概念與一個技術
讀《韭菜的自我修養》
❖ 點讚、留言、分享朋友圈 ❖
❖都是對筆者的一種支持 ❖