GIT篇
1. 分佈式與集中式管理
(1) 集中式管理控制:版本庫是集中存放在中央服務器,做代碼處理的時候都是在自己的個人電腦上,處理完代碼之後再提交給中央服務器。
集中式版本控制管理主要的毛病是必須聯網,在局域網上傳和下載還可以接受,如果在互聯網上就存在網速很慢的問題。
(2) 分佈式管理控制:分佈式版本系統控制通常有一臺充當中央服務器的電腦,作用是方便交換不同電腦之間的修改,當然沒有這個中央服務器,不同的電腦仍然可以工作。
(3) 創建版本庫與初始化git的配置
初始化git配置:
git config --global user.email [email protected]
git config --global user.name "Your Name"
在提交的時候,需要設置全局配置,包括郵件和用戶名
(a) 創建一個空目錄
$ mkdir learngit
(b) 目錄變成Git可以管理的倉庫
$ git init
第一步:用命令git add,把文件添加到倉庫
$ git add readme.txt
第二步:用命令git commit,把文件提交到倉庫
$ git commit -m ‘wrote a readme file’
其中,-m後面輸入的是本次提交的說明
2. 時光穿梭
2.1 版本回退
(1) 文檔readme.txt修改其中的內容,通過git status可以時刻掌握倉庫當前的狀態。如下圖所示:
(2) 查看文檔最近到最遠的提交日誌,使用命令:git log,如果嫌顯示內容比較多,可以採用命令git log –pretty=oneline
(3) 在Git中,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,當然往上100個版本寫成HEAD~100,回退上一個版本的命令
git reset --hard HEAD^
也可以根據commit id來回退版本,相關命令爲git reset --hard commit_id
(4) 如果回退版本之後,想重新穿梭到最新的版本,可以通過命令git reflog查詢歷史命令,再通過git reset --hard commit_id完成操作
2.2 工作區與暫存區
(1) 版本庫
其中stage爲暫存區,git創建的一個分支master,以及指向master的指針HEAD
(2) 添加工作區到暫存區(stage)
(3) 通過git add把工作區添加到暫存區,然後通過git commit把暫存區提交到分支
2.3 管理修改
(1) 第一次修改àgit addà第二次修改àgit commit,這樣的操作過程只能提交第一次修改過程到分支,不能提交第二次的修改
(2) 第一次修改àgit addà第二次修改àgit addàgit commit
通過命令git diff HEAD – readme.txt查看工作區與版本庫的區別
2.4 撤銷修改
(1) 通過命令git checkout -- file可以丟棄工作區的修改
通過該命令對file文件在工作區的修改全部撤銷,存在兩種情況:
a. 修改後還沒有被放到暫存區,撤銷修改就回到版本庫時的狀態
b. 修改添加到暫存區後,又對文件作了修改,撤銷修改就回到添加到暫存區後的狀態
其中,git checkout -- file命令中的--很重要,如果沒有--,就變成了切換到另一個分支。
(2) 用命令git reset HEAD <file>可以把暫存區的修改撤銷掉(unstage),重新放回工作區。git reset命令既可以回退版本,也可以把暫存區的修改回退工作區
回退版本的命令:git reset --hard HEAD^ 或 git reset --hard commit_id
(3) 如果修改添加到暫存區,則先通過git reset HEAD <file>撤銷到工作區,然後通過git checkout -- <file>撤銷修改
2.5 刪除文件
如果把工作區的文件提交到暫存區後,手動刪除文件,存在兩種操作:誤刪或需刪除文件
若是誤刪,則用命令git checkout -- <file>恢復
若需要刪除文件,則git rm <file>刪除,然後提交git commit
3. 遠程倉庫
Git倉庫和GitHub倉庫之間的傳輸是通過SSH加密,關聯遠程倉庫需要以下步驟的設置:
(1) 創建SSH Key,會在.ssh目錄下存在id_rsa和id_rsa.pub兩個文件:
ssh-keygen -t rsa -C ‘[email protected]’
其中id_rsa是私鑰,id_rsa.pub是公鑰
(2) 登錄GitHub,打開Settings中的SSH and GPG keys,添加id_rsa.pub的內容到SSH keys中
3.1 添加遠程庫
(1) 關聯本地倉庫到遠程倉庫
git remote add origin [email protected]:github_username/learngit.git
其中遠程庫的名字是origin
(2) 本地倉庫所有內容推送到遠程上
git push -u origin master (第一次推送)
每次本地提交後,使用git push origin master推送最新修改
3.2 遠程倉庫克隆
遠程倉庫的克隆
git clone [email protected]:github_username/repository_name.git
4. 分支管理
4.1 創建與合併分支
(1) 創建dev分支,並切換到dev分支:
git checkout -b dev
其中-b參數表示創建並切換,相當於以下兩條命令:
git branch dev
git checkout dev
(2) 通過命令git branch列出所有分支,當前分支會標一個*號
(3) 分支的合併操作
通過命令git merge dev,合併master到dev中。git merge命令用於合併指定分支到當前分支
(4) 合併後可以刪除dev分支,命令git branch -d dev
4.2 衝突解決
(1) master和創建的分支都有提交,如圖所示
(2) Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容
(3) 對合並的結果提交
git add <file>
git commit -m ‘conflict fixed’
(4) git log --graph --pretty=oneline --abbrev-commit查看分支的合併情況
4.3 分支管理策略
如果禁用Fast forward,需要添加參--no-ff
命令爲git merge --no-ff -m ‘message’ dev
合併之後通過命令git log --graph --pretty=oneline --abbrev-commit查詢
團隊合作中的分支合併情況
Git分支十分強大,在團隊開發中應該充分應用。
合併分支時,加上--no-ff參數就可以用普通模式合併,合併後的歷史有分支,能看出來曾經做過合併,而fast forward合併就看不出來曾經做過合併。
4.4 BUG分支
Git還提供了一個stash功能,可以把當前工作現場“儲藏”起來,等以後恢復現場後繼續工作,通過命令git stash儲藏起來,然後在其他分支上工作,最後通過git checkout name切換到儲藏的分支。
(1) 通過命令git stash list查看儲藏的工作區存放在哪裏
(2) Git把stash內容存在某個地方,需要恢復有兩個辦法:
一是用git stash apply恢復,但是恢復後,stash內容並不刪除,你需要用git stash drop來刪除;
另一種方式是用git stash pop,恢復的同時把stash內容並刪除
4.5 Feature分支
開發一個新feature,最好新建一個分支;
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>強行刪除
4.6 多人協作
(1) 查看遠程遠程庫的信息,命令爲git remote
(2) 用git remote -v顯示更詳細的信息,上面顯示了可以抓取和推送的origin的地址。如果沒有推送權限,就看不到push的地址
(3) 推送分支,通過命令git push origin master
4.7 Rebase
Rebase操作的特點:把交叉的提交歷史整理成一條直線,看上去更加的直觀。缺點是本地分叉提交已經被修改。
Rebase操作可以把本地未push的分叉提交歷史整理成直線。
Rebase的目的是使得查看歷史提交的變化時更容易,因爲分叉的提交需要三方對比。
5. 標籤管理
發佈版本時,通常爲版本庫打標籤(tag),也就確定打標籤版本,標籤設計版本庫的快照。標籤與分支都是指針形式存在,但分支可以移動,標籤不能移動。
5.1 標籤創建
(1) 查看所有版本的標籤
git tag
(2) 創建標籤,首先通過命令git checkout u_branch切換到指定的分支,然後通過git tag 版本號。即
git checkout u_branch
git tag v1.0
(3) 對指定commit id添加標籤
git tag v1.0 commit_id
(4) 查看標籤的信息
git show <tagname>
(5) 創建帶有說明的標籤,-a指定標籤名,-m指定說明文字
git tag -a v1.0 -m ‘<description>’ commit_id
5.2 標籤操作
(1) 刪除標籤
git tag -d <tagname>
(2) 標籤只存儲在本地,不會自動推送到遠程。如果想把標籤推送到遠程,則
git push origin <tagname>
或者一次性推送全部本地標籤
git push origin --tags
(3) 刪除遠程標籤,先刪除本地,在遠程
git tag -d <tagname>
git push origin :refs/tags/<tagname>
6. Git自定義
6.1 Git特殊文件的忽略
添加.gitignore文件,在文件中指定需要忽略的文件名或類型。
如果想提交忽略的文件,可以強制提交
git add -f <ignore_file>
6.2 Git服務器搭建
(1) 在Linux服務器上安裝Git服務。
(2) 創建證書登錄:收集所有用戶的公鑰,把所有公鑰導入到/home/git/.ssh/authorized_keys文件裏,用戶的公鑰文件爲id_rsa.pub。
(3) 選擇目錄作爲Git倉庫,初始化一個裸倉庫
git init --bare sample.git
(4) 然後就可以通過以下命令:
git clone git@server:/<git_content>/sample.git