【學習筆記】版本控制工具 GIT
阿新 • • 發佈:2018-12-12
前言
- GIT是一個分散式的版本控制工具。
- 參考資料 git官方教程-中文版 及 廖雪峰老師的git教程
- 下文面向windows系統,所有操作使用git自帶的git bash。
- 編輯文字文件時不要使用記事本,可以用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
工作區和暫存區
工作區,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 |
| |
-----工作區--------------------------------------------------------------
刪除修改
- 僅修改了工作區,使用
git checkout -- filename
把該檔案恢復到最近的git commit
或git add
- 已經暫存,使用
git reset HEAD filename
刪除暫存區,然後修改工作區 - 已經提交,參考版本回退。
遠端倉庫
- Git是分散式版本控制系統,同一個git版本庫可以分佈到不同的機器上。首先需要一個原始版本庫,此後別的機器就可以克隆這個版本庫,且不同機器上的版本庫是完全一樣的,沒有主次之分。
- 實際情況是找一臺電腦充當伺服器,其它人把倉庫從伺服器上克隆到自己電腦上,再將各自的提交推送到伺服器庫裡,也能從伺服器庫中拉取別人的提交。
- 可以自行建立伺服器,也可以直接使用github,以下均使用github。
初始設定:新增SSH
- 註冊github賬號。
- 每臺電腦建立自己的SSH Key,在git bash裡執行
$ ssh-keygen -t rsa -C "[email protected]"
。注意修改郵箱。 - 在使用者主目錄裡找到
.ssh
資料夾,顯示副檔名。id_rsa
檔案就是私鑰不能洩露,id_rsa.pub
是公鑰,可以告訴任何人。 - 登陸github,開啟賬戶設定,新增SSH Key,title任意填,Key裡複製id_rsa.pub裡的內容。
- 確認新增,你的github賬戶即可與你的電腦通訊。
本地向GITHUB上推送
- 在github上新建與本地倉庫同名的空版本庫(Repository),注意不要有readme。
- 建立遠端庫連結:本地倉庫目錄下執行
$ git remote add origin [email protected]:LittleFall/learngit.git
,其中LittleFall修改為你的github賬戶名,learngit修改為你的倉庫名。origin可以修改為其它的名字,表示遠端庫。如果因名字寫錯等原因需要刪除遠端庫連結,使用git remote rm origin
. - 注意,第一次新增時會有SSH的確認,輸入yes再按兩次回車即可,以後不會出現。
- 使用
git push
把本地分支推送的遠端庫中。git push -u origin master
,僅第一次使用需要加-u.
從遠端庫克隆
- 開發時最好首先設定遠端庫,再在各個本地庫中克隆。
- 在github上新建一個庫gitskills,可以加上readme以驗證效果。
- 在本地的一個目錄中使用
$ git clone [email protected]:LittleFall/gitskills.git
即可克隆,注意修改使用者名稱。 - 會發現目錄下出現了gitskills目錄,裡面有一個readme.md檔案和.git資料夾。
- 有使用其它協議的克隆方法,但似乎這樣最好。
分支管理
git將每次提交(commit)串成時間線,稱為分支,目前只有一個分支:主分支master。可以通過建立其它分支來修改程式,最後合併到主分支裡。
注意:分支實際上是指向提交的。
基本操作
- 列出所有分支
git branch
。 - 建立分支
git branch name
,切換分支git checkout name
,建立並切換分支git checkout -b name
. - 合併指定分支到當前分支
git merge name
。注意不修改mater時會使用Fast-forward
合併模式,直接把mater指標移動到待合併的分支指標上。 - 刪除分支
git branch -d name
解決衝突
- git合併分支可能會產生衝突。git會將衝突標記在工作區的檔案中,類似於
<<<<<<< HEAD
Creating a new branch is quick & simple.
=======
Creating a new branch is quick AND simple.
>>>>>>> feature1
- 開啟這個檔案,將列出的部分直接修改成需要的值
Creating a new branch is quick and simple.
- 儲存,add,commit,此時衝突已被解決。
- 使用
git log --graph --pretty=oneline --abbrev-commit
可以形象地看到分支合併過程。 - 記得在合併且衝突解決後刪除副分支。
- 使用
git merge --no-ff -m "message" branchname
來合併分支且不使用Fast-forward
模式,會使用recursive
模式,新建一個commit,所以需要-m來記錄資訊。ff模式的好處是快速,壞處是刪除副分支後會丟失分支資訊。
分支策略
- master分支應當是非常穩定的,只用來發布新版本,不能在上邊幹活。
- dev分支適用於開發使用,每個程式設計師將自己的提交合併到dev上。
- bug分支:需要儲存當前工作修改bug時使用
git stash
,將當前工作現場儲存起來(類似於棧)。恢復工作現場時首先使用git status
觀察當前當作現場是否“乾淨”,使用git stash list
檢視儲存內容,再使用git stash apply
+git stash drop
或git stash pop
進行恢復並刪除儲存的內容。 - feature分支:注意強行刪除
git branch -D name
。
多人協作
- 檢視遠端庫資訊
git remote -v
- 建立本地分支和遠端分支的連結關係
git branch --set-upstream-to= origin/<branch-name> <branch-name>
- 從遠端抓取分支
git pull
,可能會有衝突,可以解決。 - 向遠端推送分支
git push origin <branch-name>
變基
git rebase
可以把git log
的顯示結果變成一條直線,非常好看,會更改提交的依賴關係。
標籤管理
- 每個標籤只能出現一次,其實不如叫做tid。
- 建立標籤
git tag tagname
,注意標籤是對應於commit的,會打給上個commit,一個commit可以有多個標籤。 - 檢視所有標籤
git tag
- 對某次提交打標籤
git tag name commit_id
- 指定說明文字
git tag -a tag_name -m "message"
- 利用git show tag_name可以檢視詳細資訊
- 刪除標籤
git tag -d tag_name
。 - 標籤只會建立在本地,可以
git push origin tag_name
來推送到遠端庫,git push origin --tags
推送全部標籤。git push origin :refs/tags/<tagname>
刪除一個遠端標籤,需要先刪除本地。
自定義設定
- 忽略特殊檔案:在版本庫目錄下新增
.gitignore
檔案,裡面放著需要忽略的檔名,可以使用萬用字元。再將這個檔案add即可。 - 配置別名:
$ 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"
- 搭建git伺服器,留坑。