1. 程式人生 > >【學習筆記】版本控制工具 GIT

【學習筆記】版本控制工具 GIT

前言

  1. GIT是一個分散式的版本控制工具。
  2. 參考資料 git官方教程-中文版廖雪峰老師的git教程
  3. 下文面向windows系統,所有操作使用git自帶的git bash。
  4. 編輯文字文件時不要使用記事本,可以用sublime text或notepad++.

本地使用

安裝及建立版本庫

下載git,安裝,進入git bash,確認使用者資訊如下。

$ git config --global user.name "Your Name"
$ git config --global user.email "[email protected]
"

常用命令

在bash中進入一個路徑不含中文的空資料夾,使用git init命令建立版本庫
使用git add filename命令把檔案新增到暫存區
使用git commit -m "message"命令把暫存區的內容提交到版本庫。
使用git diff filename檢視對檔案的修改
使用git status檢視當前狀態(包括 未跟蹤的檔案/已修改但沒有暫存的檔案/已暫存且沒有提交的檔案)
使用git rm在暫存區中刪除一個檔案,用法與git add相似。

版本回退

使用git log命令檢視版本歷史
使用git reset --hard commit_id切換到目標版本,HEAD指向當前版本,HEAD^指向上個版本,HEAD~100指向上100個版本
使用git reflog

檢視提交歷史,以便找到未來的commit_id

工作區和暫存區

工作區,Working Directory 就是在電腦裡能看到的目錄。
版本庫,Repository 就是在目錄中的一個.git資料夾,存了與git有關的很多內容,如配置,分支,暫存區等。
暫存區,Stage 需要提交的檔案通過git add放到暫存區,然後通過git commit統一提交到分支。
git diff filename比較工作區與暫存區
git diff --cached filename比較暫存區與版本庫
git diff HEAD -- filename比較工作區與版本庫

------------
-----------版本庫-------------------------------------------- | | git diff --cached | | | -------------暫存區------------------------------------ git diff HEAD | | git diff | | | -----工作區--------------------------------------------------------------

刪除修改

  1. 僅修改了工作區,使用git checkout -- filename把該檔案恢復到最近的git commitgit add
  2. 已經暫存,使用git reset HEAD filename刪除暫存區,然後修改工作區
  3. 已經提交,參考版本回退。

遠端倉庫

  1. Git是分散式版本控制系統,同一個git版本庫可以分佈到不同的機器上。首先需要一個原始版本庫,此後別的機器就可以克隆這個版本庫,且不同機器上的版本庫是完全一樣的,沒有主次之分。
  2. 實際情況是找一臺電腦充當伺服器,其它人把倉庫從伺服器上克隆到自己電腦上,再將各自的提交推送到伺服器庫裡,也能從伺服器庫中拉取別人的提交。
  3. 可以自行建立伺服器,也可以直接使用github,以下均使用github。

初始設定:新增SSH

  1. 註冊github賬號。
  2. 每臺電腦建立自己的SSH Key,在git bash裡執行$ ssh-keygen -t rsa -C "[email protected]"。注意修改郵箱。
  3. 在使用者主目錄裡找到.ssh資料夾,顯示副檔名。id_rsa檔案就是私鑰不能洩露,id_rsa.pub是公鑰,可以告訴任何人。
  4. 登陸github,開啟賬戶設定,新增SSH Key,title任意填,Key裡複製id_rsa.pub裡的內容。
  5. 確認新增,你的github賬戶即可與你的電腦通訊。

本地向GITHUB上推送

  1. 在github上新建與本地倉庫同名的空版本庫(Repository),注意不要有readme。
  2. 建立遠端庫連結:本地倉庫目錄下執行$ git remote add origin [email protected]:LittleFall/learngit.git,其中LittleFall修改為你的github賬戶名,learngit修改為你的倉庫名。origin可以修改為其它的名字,表示遠端庫。如果因名字寫錯等原因需要刪除遠端庫連結,使用git remote rm origin.
  3. 注意,第一次新增時會有SSH的確認,輸入yes再按兩次回車即可,以後不會出現。
  4. 使用git push把本地分支推送的遠端庫中。git push -u origin master,僅第一次使用需要加-u.

從遠端庫克隆

  1. 開發時最好首先設定遠端庫,再在各個本地庫中克隆。
  2. 在github上新建一個庫gitskills,可以加上readme以驗證效果。
  3. 在本地的一個目錄中使用$ git clone [email protected]:LittleFall/gitskills.git即可克隆,注意修改使用者名稱。
  4. 會發現目錄下出現了gitskills目錄,裡面有一個readme.md檔案和.git資料夾。
  5. 有使用其它協議的克隆方法,但似乎這樣最好。

分支管理

git將每次提交(commit)串成時間線,稱為分支,目前只有一個分支:主分支master。可以通過建立其它分支來修改程式,最後合併到主分支裡。
注意:分支實際上是指向提交的。

基本操作

  1. 列出所有分支git branch
  2. 建立分支 git branch name,切換分支git checkout name,建立並切換分支git checkout -b name.
  3. 合併指定分支到當前分支git merge name。注意不修改mater時會使用Fast-forward合併模式,直接把mater指標移動到待合併的分支指標上。
  4. 刪除分支git branch -d name

解決衝突

  1. git合併分支可能會產生衝突。git會將衝突標記在工作區的檔案中,類似於
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
  1. 開啟這個檔案,將列出的部分直接修改成需要的值
Creating a new branch is quick and simple.
  1. 儲存,add,commit,此時衝突已被解決。
  2. 使用git log --graph --pretty=oneline --abbrev-commit可以形象地看到分支合併過程。
  3. 記得在合併且衝突解決後刪除副分支。
  4. 使用git merge --no-ff -m "message" branchname來合併分支且不使用Fast-forward模式,會使用recursive模式,新建一個commit,所以需要-m來記錄資訊。ff模式的好處是快速,壞處是刪除副分支後會丟失分支資訊。

分支策略

  1. master分支應當是非常穩定的,只用來發布新版本,不能在上邊幹活。
  2. dev分支適用於開發使用,每個程式設計師將自己的提交合併到dev上。
  3. bug分支:需要儲存當前工作修改bug時使用git stash,將當前工作現場儲存起來(類似於棧)。恢復工作現場時首先使用git status觀察當前當作現場是否“乾淨”,使用git stash list檢視儲存內容,再使用git stash apply+git stash dropgit stash pop進行恢復並刪除儲存的內容。
  4. feature分支:注意強行刪除git branch -D name

多人協作

  1. 檢視遠端庫資訊 git remote -v
  2. 建立本地分支和遠端分支的連結關係git branch --set-upstream-to= origin/<branch-name> <branch-name>
  3. 從遠端抓取分支git pull,可能會有衝突,可以解決。
  4. 向遠端推送分支git push origin <branch-name>

變基

git rebase可以把git log的顯示結果變成一條直線,非常好看,會更改提交的依賴關係。

標籤管理

  1. 每個標籤只能出現一次,其實不如叫做tid。
  2. 建立標籤git tag tagname,注意標籤是對應於commit的,會打給上個commit,一個commit可以有多個標籤。
  3. 檢視所有標籤git tag
  4. 對某次提交打標籤git tag name commit_id
  5. 指定說明文字git tag -a tag_name -m "message"
  6. 利用git show tag_name可以檢視詳細資訊
  7. 刪除標籤 git tag -d tag_name
  8. 標籤只會建立在本地,可以git push origin tag_name來推送到遠端庫,git push origin --tags推送全部標籤。git push origin :refs/tags/<tagname>刪除一個遠端標籤,需要先刪除本地。

自定義設定

  1. 忽略特殊檔案:在版本庫目錄下新增.gitignore檔案,裡面放著需要忽略的檔名,可以使用萬用字元。再將這個檔案add即可。
  2. 配置別名:$ git config --global alias.st status以後寫status就可以寫st了,還有
    git config --global alias.perlg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit"
  3. 搭建git伺服器,留坑。