0、寫在前面
作為一名開發者,熟悉使用 git 代碼管理工具是一項必備的基本技能。git 相較 SVN 而言,其優點不言而喻。git 的功能非常強大,其包括的操作指令也非常的多,但是從實用性而言,很多指令可能我們一輩子也用不到,這裡我隻記錄一下自己經常使用的 git 指令,熟練使用了這些指令,其實已經可以完全得心應手的使用 git 工具了。我所使用的開發環境是在 CentOS6.5 系統,下邊的操作指令都是在 CentOS6.5 上進行實驗通過的。
一、GIT的初始化及配置
1.git安裝
- yum方式安裝:
$ yum install git -y
- apt方式安裝:
$ apt install git -y
- 源碼方式安裝:
$ ./configure && make && make install
2.git全局配置
$ git config --global user.name "liwei0526vip"
$ git config --global user.email "[email protected]"
通過
git config
指令的
--global
參數設定了git的使用者名和使用者郵箱,預設情況下這台機器上所有的git倉庫都會使用這個配置,當然也可以對某個倉庫指定具體不同的使用者名和使用者郵箱
3.初始化倉庫
倉庫,英文名repository。可以簡單了解成一個目錄,這個目錄裡面的所有檔案都可以被git管理起來,每個檔案的修改、删除,git都能跟蹤,以便任何時刻都可以追蹤曆史,或者在将來某個時刻可以"還原"。
$ mkdir learngit
$ cd learngit
$ git init
Initialized empty Git repository in /root/learngit/.git/
$ ls -a
. .. .git
可以發現目前目錄下多了一個
.git
的目錄,這個目錄是git來跟蹤管理版本庫的,千萬不要手動修改這個目錄裡面的檔案,否則就把git倉庫給破壞了
4.關于檔案變動跟蹤
首先這裡再明确一下,所有的版本控制系統,其實隻能跟蹤文本檔案的改動,比如 TXT 檔案,網頁,所有的程式代碼等等, Git 也不例外。版本控制系統可以告訴你每次的改動,比如在第5行加了一個單詞 "Linux" ,在第8行删了一個單詞"Windows"。而圖檔、視訊這些二進制檔案,雖然也能由版本控制系統管理,但沒法跟蹤檔案的變化,隻能把二進制檔案每次改動串起來,也就是隻知道圖檔從100KB改成了120KB,但到底改了什麼,版本控制系統不知道,也沒法知道。
5.關于編碼
因為文本是有編碼的,如果沒有曆史遺留問題,強烈建議使用标準的
UTF-8
編碼,所有語言使用同一種編碼,既沒有沖突,又被所有平台所支援。
二、代碼送出
1.檢視repo狀态
$ git status
2.添加檔案到緩存區
$ git add file1.txt
$ git add file2.txt
3.送出到版本庫
$ git commit -m "message" # 一定要寫送出資訊, 便于後續檢視版本資訊
三、管理修改
1.丢棄工作區的修改
$ git checkout -- file.txt
2.丢棄暫存區的修改
$ git reset HEAD file.txt # 丢棄暫存區的修改, 完畢後工作區内容未撤銷
3.撤銷送出(版本回退)
$ git reset --hard HEAD^
4.管理修改的舉例
- 場景1:當你改亂了工作區某個檔案的内容,想直接丢棄工作區的修改時,用指令git checkout -- file。
- 場景2:當你不但改亂了工作區某個檔案的内容,還添加到了暫存區時,想丢棄修改,分兩步,第一步用指令git reset HEAD file,就回到了場景1,第二步按場景1操作。
- 場景3:已經送出了不合适的修改到版本庫時,想要撤銷本次送出,參考版本回退一節,不過前提是沒有推送到遠端庫。
5.檢視工作區與版本庫的差異
$ git diff HEAD -- file.txt
6.檢視送出版本日志
$ git log --pretty=oneline # --pretty選項更清晰顯示
四、遠端庫操作
1.克隆遠端庫
$ git clone http://gitlab.staff.sina.com.cn/liwei42/gitver
2.添加遠端庫(給本地庫)
$ git remote add origin [email protected]:liwei42/gitver.git
3.推送遠端庫
$ git push -u origin master # 第一次推送加'-u'選項, 關聯本地與origin的master分支
4.拉取遠端庫
$ git pull <遠端主機名> <遠端分支名>:<本地分支名>
在預設模式下,取回遠端主機某個分支的更新,再與本地的指定分支合并。git pull是git fetch後跟git merge的縮寫。
比如,要取回origin主機的next分支,與本地的master分支合并,需要寫成下面這樣:
$ git pull origin next:master # 如果要與目前分支合并, 則冒号後面的部分可以省略
相當于:
$ git fetch origin
$ git merge origin/next
手動建立追蹤關系:
$ git branch --set-upstream master origin/next
上面指令指定master分支追蹤origin/next分支。如果目前分支與遠端分支存在追蹤關系,git pull就可以省略遠端分支名
$ git pull origin # 如果目前分支隻有一個追蹤分支,連遠端主機名都可以省略
五、分支管理
1.建立分支
$ git branch b1
2.切換分支
$ git checkout b1 # 切換到b1分支
$ git checkout -b b2 # 建立并切換到b2分支
3.合并分支
$ git merge dev # 合并dev分支到目前分支
$ git merge dev master # 合并dev分支到master分支(可能目前分支并沒有在master上)
$ git --no-ff merge dev # 合并時不使用ff方式, 這樣會在合并分支上保留送出的版本資訊
六、分支政策
1.主分支master
代碼庫應該有一個、且僅有一個主分支。所有提供給使用者使用的正式版本,都在這個主分支上釋出。
2.開發分支develop
主分支隻用來分布重大版本,日常開發應該在另一條分支上完成。這個分支可以用來生成代碼的最新隔夜版本(nightly)。如果想正式對外釋出,就在Master分支上,對Develop分支進行"合并"
3.臨時性分支
- 功能(feature)分支
- 預釋出(release)分支
- 修補bug(fixbug)分支
4.功能分支
它是為了開發某種特定功能,從Develop分支上面分出來的。開發完成後,要再并入Develop。
5.預釋出分支
它是指釋出正式版本之前(即合并到Master分支之前),我們可能需要有一個預釋出的版本進行測試。預釋出分支是從Develop分支上面分出來的,預釋出結束以後,必須合并進Develop和Master分支。它的命名,可以采用release-*的形式。
6.修補bug分支
軟體正式釋出以後,難免會出現bug。這時就需要建立一個分支,進行bug修補。修補bug分支是從Master分支上面分出來的。修補結束以後,再合并進Master和Develop分支。它的命名,可以采用fixbug-*的形式