Git–分佈式版本控制系統
注:只能針對文本內容,不能解析word、視頻、音頻等二進制內容。
一、安裝git
https://git-scm.com/downloads windows 版本,默認選項安裝。
安裝完成後,在git bash關聯賬戶。
$ git config --global user.name "xxxxxx"
$ git config --global user.email "[email protected]"
本機器全局設置用戶名和email。
配置文件在當前系統用戶家目錄下C:\Users\xxxxxx.gitconfig。
特定項目使用其他用戶名和email,去掉–global選項重新配置即可,新的配置保存在該項目的.git/config文件裏。
二、創建版本庫
1. 創建並初始化版本庫
創建版本庫(repository),在這個目錄下的文件可以由Git監管,做版本控制。
$ mkdir git_repository
$ cd git_repository/
$ pwd
/f/git_repository
$ git init
Initialized empty Git repository in F:/git_repository/.git/
/f/git_repository (master)
其中.git目錄用來跟蹤管理版本庫。
2. 添加文件到版本庫
文本文件需要放入到工作區目錄或子目錄下!
1. git add <file>
添加到暫存區
2. git commit
提交到版本庫【保存快照】
$ git add hellogit.txt
$ git commit -m "hellogit"
-m: 提交說明
三、版本操作
1. 版本庫狀態
查看版本庫狀態
$ git status
查看與之前提交後的改動:git diff <file>
$ git diff hellogit.txt
2. 撤回到上一個版本
查看版本歷史記錄git log
,從最近提交到最早提交。
$ git log
僅顯示版本號和描述
$ git log --pretty=oneline
9f4a74f1de984d9e32a2a72b3fd4b42ad1e486bf (HEAD -> master) second
fe100c24747f02f812a5156b60e3d5d36bac0512 hellogit
注:HEAD -> master
中的HEAD
表示當前版本指向哪個分支,上一個版本是HEAD^
,上上個是HEAD^^
,之前第10個版本是HEAD~10
。
版本退到之前版本
$ git reset --hard HEAD^
版本從之前版本回到之後版本的方法
(1)根據git log
查找的版本號。
$ git reset --hard 9f4a74f1de984d9e32a2a72b3fd4b42ad1e486bf
(2)使用git reflog
查找出所有的版本歷史軌跡。
$ git reflog
$ git reset --hard 版本號
3. 工作區、暫存區、版本庫
工作區:操作的目錄git_repository。
暫存區:.git
目錄下的index
文件(stage/index)。
版本庫:工作區下的.git
目錄。
git add <file>
操作是將文件修改添加到暫存區index
文件;git commit
將暫存區所有內容提交到當前分支中。
git init
創建Git版本庫時,會自動創建一個master
分支,HEAD
是指向該分支的指針。
注:
1. git diff
:工作區和暫存區的比較;
2. git diff --cached
:暫存區和當前分支的比較。
3. 比較版本庫(HEAD
指向版本庫當前版本),file即爲當前工作區文件。
$ git diff HEAD -- hellogit.txt
圖引自廖雪峯Git教程https://www.liaoxuefeng.com
Git跟蹤的是文件的修改,已經添加到暫存區的改動,纔會被提交到版本庫。
4. 撤銷修改
文件已經提交,若沒有推送到遠程庫,可以通過版本reset
回退。
文件提交之前,通過git checkout -- 文件
進行工作區撤銷,使得文件能夠回到最近一次git commit
或者git add
後的狀態。
$ git checkout -- hellogit.txt
- 如果文件修改還未添加到暫存區,執行命令可以清除工作區修改到上一次提交狀態。
- 如果文件修改已經添加到暫存區,又進行了修改,執行命令可以清除工作區修改到上一次添加到暫存區狀態。
針對於情況2,撤銷到上一次提交狀態操作。
(1)撤銷已經添加到暫存區的修改【工作區的修改目前處於未add狀態】
$ git reset HEAD hellogit.txt
(2)撤銷修改【情況1】。
5. 文件刪除
情況1. 版本庫正常刪除
$ git rm hellogit.txt
$ git commit -m "remove file"
情況2. 誤刪除,版本庫找回最新提交版本
$ git checkout -- hellogit.txt
四、遠程庫
1. 本地庫連接、推送遠程庫
首先註冊GitHub遠程倉庫;
接着創建SSH Key,連接本地庫和GitHub庫。
$ ssh-keygen.exe -t rsa -C "[email protected]"
在用戶家目錄下生成.ssh
目錄,內包含ssh key
密鑰對(id_rsa
和id_rsa.pub
)。
在GitHub設置中,添加本機公鑰。
GitHub新建倉庫learngit1(本地庫和遠程庫名稱可以不一致),關聯本地庫和遠程庫(本地庫目錄下操作)。
/f/git_repository (master)
$ git remote add
origin git@github.com:xxxxxx/learngit1.git
推送本地庫內容到遠程庫。
第一次推送
$ git push -u origin master
其他修改可以用
$ git push origin master
origin
是遠程庫名。將本地的master
分支推送到origin
庫,同時指定origin
爲默認庫,後面就可以不加任何參數使用git push
。-u
用來指定默認庫。
+ 不加任何參數使用git push
命令,是推送本地庫當前分支修改。
2. 克隆遠程庫到本地
使用git clone
命令克隆遠程庫到本地。
$ git clone git@github.com:xxxxxx/learngit.git
克隆到本地的庫,具備.git
版本庫,是新的本地庫。
五、分支
1. 理解分支
Git中,主分支是master
分支。
HEAD最終指向當前分支。
如果只有一條分支,即爲主分支master
分支。HEAD
指向master
分支的最新提交。
如果創建並切換到分支v1.0
,則HEAD
指向v1.0
分支的最新提交。
在分支v1.0上作出修改並提交。
2. 分支操作
創建分支v1.0
,並切換到分支
$ git checkout -b v1.0
相當於
$ git branch v1.0 創建分支
$ git checkout v1.0 切換分支
查看當前分支
$ git branch
進行v1.0
分支操作,切回master
分支,併合並v1.0
分支內容到主分支
$ git checkout master
$ git merge v1.0 合併指定分支內容到當前分支
此時,可以刪除v1.0
分支
$ git branch -d v1.0
注:如果分支還未合併過,需要強行刪除分支
$ git branch -D v1.0
3. 分支衝突
衝突的產生:
創建分支v1.0,並切換到v1.0,此時master分支和v1.0分支最新提交相同。然後對文件作出修改A,並提交到分支v1.0;切回master分支,作出修改B。此時合併v1.0分支的內容到master分支,就會出現衝突。
衝突的解決:
查看文件,手動解決衝突後添加、提交。
Git命令:查看分支合併情況
$ git log --graph --pretty=oneline --abbrev-commit
【有衝突就要解決衝突】
4. 分支合併
Git通常採用的是fast forward策略,直接將master指針指向分支v1.0的最新提交,無合併歷史痕跡。
$ git checkout master
$ git merge v1.0
普通模式合併,禁止該策略,合併後的歷史軌跡上有分支合併。
$ git checkout master
$ git merge --no-ff -m " merge with no-ff" v1.0
$ git log --graph --pretty=oneline --abbrev-commit
* dc8d4b2 (HEAD -> master) merge
|\
| * 67f5c79 (v1.0) stash1
|/
* c6dbfca (origin/master) 4
5. 分支儲藏
git stash
用來在不對當前分支進行提交的情況下,暫時存儲當前分支的工作目錄狀態。便於切到其他分支做BUG處理等操作。(注:BUG通常設置BUG分支)
/f/git_repository (v1.0)
$ git stash
Saved working directory and index state WIP on v1.0: 67f5c79 stash1
查看暫存內容(最近的暫存在棧stash@{0}
)
$ git stash list
stash@{0}: WIP on v1.0: 67f5c79 stash1
stash@{1}: WIP on v1.0: c6dbfca 4
應用暫存內容
方式1:
$ git stash apply stash@{0} 恢復工作狀態,暫存內容仍在棧中
$ git stash drop 刪除暫存內容
Dropped refs/stash@{0}
方式2:重新應用儲藏,並將其從堆棧中移走
$ git stash pop
注:儲藏也是可以構建分支的(參考資料1:儲藏部分)。
6. 遠程分支
查看遠程庫信息
$ git remote
origin
$ git remote -v
獲取詳細信息
推送本地分支到遠程庫
$ git push origin master 推送master分支
$ git push origin v1.0 推送v1.0分支
是否推送要看是否與其他成員有交互。
注:直接git clone
的遠程庫,只能看到master
分支。要在分支v1.0
上設置,需要創建origin
的v1.0
分支到本地。
/f/gitworkspace
$ git clone git@github.com:xxxxxx/learngit1.git
$ git branch
* master
$ git checkout -b v1.0 origin/v1.0 切到新分支
$ git branch
master
* v1.0
注:有多個成員同時對v1.0分支相同文件做推送時,會有衝突,推送失敗。
例:
用戶1:/f/gitworkspace/learngit1 (v1.0) 不同的目錄對應不同用戶
對文件作出修改
$ git add hellogit.txt 添加
$ git commit -m "new clone c" 提交
$ git push origin v1.0 推送到遠程庫
用戶2:/f/git_repository (v1.0)
$ git push origin v1.0
error: failed to push some refs to '[email protected]:
【解決方法】
1. 先用git pull
抓取遠程origin/v1.0
的新提交。
2. 如果git pull
失敗,則需要指定本地v1.0
分支和遠程origin/v1.0
分支的鏈接。
$ git branch --set-upstream-to=origin/v1.0 v1.0
接着,
$ git pull
Auto-merging hellogit.txt
CONFLICT (content): Merge conflict in hellogit.txt
手動解決衝突,git add, git commit 推送
$ git push origin v1.0
推送成功
如果此時用戶1再次push依然會報錯,pull會覆蓋文件內容,無衝突。
六、標籤的使用
Git標籤是版本庫的快照,指向提交。標籤對應着commit號。
在當前分支輸入以下指令,便可將標籤打到最新提交的commit上。
$ git tag tag1
$ git tag 查看所有標籤
給歷史提交打標籤,首先要找到歷史提交的commit id
。
$ git log --pretty=oneline --abbrev-commit
8e29bdc (HEAD -> v1.0, tag: t1, origin/v1.0) 3
e505539 2
$ git tag t0.9 e505539
也可以給標籤加說明
$ git tag -a v0.9 -m "tag 0.9" e505539
查看標籤信息
$ git show t0.9
注:PGP祕鑰簽名請Google。
$ git tag -s <tagname> -m <description> <branchname> or commit_id
刪除本地標籤
$ git tag -d t0.9
注:標籤存儲在本地,不自動推送到遠程庫。
推送標籤到遠程
推送某個標籤
$ git push origin t1
推送所有標籤
$ git push origin --tags
遠程庫刪除標籤
$ git push origin :refs/tags/t1
七、Git遠程庫
1. GitHub和Gitee
注:對於開源項目,可以fork到自己賬戶下,然後克隆到bending修改。否則沒有權限,需要發送給作者pull request
。
本地庫與碼雲遠程庫設置過程和GitHub類似。
注:本地是根據遠程庫名來識別各個遠程庫的,然而GitHub和碼雲的默認名均爲origin
。
2. 本地庫同時管理多個遠程庫
(1)刪除已有的GitHub遠程庫
$ git remote rm origin
(2)關聯GitHub遠程庫(庫名github)
$ git remote add github git@github.com:xxxxxx/learngit1.git
(3)關聯碼雲遠程庫(庫名gitee)
$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git
(4)查看遠程庫信息
$ git remote -v
gitee git@gitee.com:xxxxxx/learngit1.git (fetch)
gitee git@gitee.com:xxxxxx/learngit1.git (push)
github git@github.com:xxxxxx/learngit1.git (fetch)
github git@github.com:xxxxxx/learngit1.git (push)
(5)推送本地庫內容到遠程庫
推送到GitHub
$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git
推送到碼雲
$ git remote add gitee git@gitee.com:xxxxxx/learngit1.git
3. 推送時忽略文件
在Git工作區下創建.gitignore
文件。
官網樣例:https://github.com/github/gitignore
八、參考資料
- Git官網中文教程https://git-scm.com/book/zh/v1/
- 廖雪峯Git教程https://www.liaoxuefeng.com