1、Git簡介
1 什麼是Git
分佈式版本控制系統,C語言開發
2 集中式與分佈式:
所有的版本控制系統,只能跟蹤文本文件的活動,版本控制系統可以告訴你它每次的改動;而無法跟蹤二進制文件1
1 集中式版本控制系統
-
特點:版本庫集中存放在中央服務器
-
工作方式:先從中央服務器中取出最新版本,在自己電腦上修改,再傳回至中央服務器
-
缺點:必須在聯網狀態下才能工作
-
SVN是目前應用最廣泛的集中式版本庫控制系統
2 分佈式版本控制系統
-
特點:沒有中央服務器,每個人的電腦上都是一個完整的版本庫
-
協作:把修改的部分推送給對方,分佈式版本控制系統通常也有一臺電腦充當“中央服務器”,方便交換大家的修改
-
優勢:
-
安全性高
-
不需要互聯網的支持
-
-
分佈式版本控制系統:Git、BitKeeper、Bazaar、Mercurial等。
3 安裝Git
1 運行平臺
Linux、Unix、Windows、Mac
2 安裝
2.1 Linux
ebian或Ubuntu Linux,通過sudo apt-get install gita
安裝
2.2 Windows
安裝完成後,設置姓名與郵箱:
$ git config --global user.name "name"
$ gitconfig --global user.email "email"
參數--global
: 表示這臺計算機上所有的Git倉庫都會使用這個配置
4 創建版本庫2
1、創建一個空目錄
2、初始化一個Git倉庫
git init
.git
的目錄是Git來跟蹤管理版本庫的
3、把文件添加到版本庫裏:(將文件修改加入暫存區)
-
將文件添加到倉庫,文件一定要放在learngit目錄下,可以反覆使用,添加多個文件
git add <file>
-
將文件提交到倉庫:(將暫存區的所有內容提交到當前分支)
git commit -m <message>
2、Git基本操作
1 回退回歸版
-
Git可以在版本之間移動,使用命令
git reset --hard commit_id
。 -
回退前,用
git log
可以查看提交歷史,以便確定要退到哪個版本,英文狀態下按下q鍵 -
回歸前,用
git reflog
查看命令歷史,以便確定要回到哪個版本
2 工作區和暫存區
-
工作區:能在電腦裏看見的目錄,如:
learngit
。 -
暫存區:在版本庫裏起過渡作用的,
git add
是把文件傳到暫存區裏。
文件夾裏的目錄.git
爲Git的版本庫,其中存了很多東西,最重要的就是稱爲stage(或者叫index)的暫存區。
Git還爲我們自動創建了第一個分支master
,以及指向master
的一個指針叫HEAD
。
每次修改都要把文件提交給暫存區,才能commit
3 撤銷修改
當文件保存後才能進行操作
- 改亂文件內容,但還未添加至暫存區時,用
git checkout -- file
。 - 改亂文件內容,且添加至暫存區時,用
git reset HEAD file
回到步驟1,然後按步驟1執行。 - 已經將文件提交到了版本庫中,在未遠程推送之前,可以先進行版本回退。
4 刪除文件
- 刪除文件
rm file
後,工作區和版本區會不一致,有兩種選擇
- 從版本庫中刪除:
git rm
並且git commit
- 恢復到最新版本:
git checkout -- file
(是用版本庫裏的版本替換工作區的版本)
3、遠程倉庫
1 添加遠程庫
在GitHub上創建一個庫
-
關聯一個遠程庫,用命令
git remote add origin [email protected]:oouapatia/learngit.git
如果關聯錯誤,用
git remote rm origin
清除。 -
關聯後,第一次用
git push -u origin master推送
master分支所有內容。 -
用
git push origin master
推送最新的修改。
2 從遠程庫克隆
用git clone [email protected]:oouapatia/gitskills.git
克隆
Git支持多種協議,https,但通過ssh支持的原生git更快
4、分支管理
1 創建與合併分支
master
分支,HEAD
指向master
,master
指向提交,so,HEAD
指向的就是當前分支
- 創建分支:增加一個
dev
指針,改變HEAD
指向(改變後,對工作區的修改和提交就是對dev
分支,而master
分支不變)
git checkout -b dev
( git checkout
加上-b
表示創建並切換)
相當於以下兩條分支:
git branch dev`創建分支
git checkout dev
切換分支
git branch
列出所有分支,並且在當前分支前會有一個*
-
合併分支:把
master
指向的dev
的當前提交git merge name
命令用於合併指定分支到當前分支 -
刪除分支
git branch -d dev
2 解決衝突
一個分支與另一個分支內容不同時,進行合併會出現衝突。
Git的用<<<<<<<
,=======
,>>>>>>>
標記出不同分支的內容
-
Git無法合併分支時,需要手動解決衝突,然後在提交
用
git log --graph
查看分支合併歷史提交後已經是合併後的結果,不需要再進行合併,直接刪除分支即可
3 普通合併分支
合併分支時,通常情況下,Git會用Fast forward
模式,但刪除分支後,會丟掉分支信息。
強制禁用Fast forward
模式,Git會在merge時生成一個新的commit,這樣可以在分支歷史上看出分支信息
git merge --no-ff -m "" branch_name
(--no-ff
參數表示禁用Fastforward
,-m
參數把commit描述進去)
git log --graph --pretty=oneline --abbrev-commit
查看分支歷史
合併分支時
- 加上
--no-ff
參數就可以用普通模式合併,會記錄合併歷史 - 而
fast forward
合並沒有合併歷史記錄.
4 Bug分支
首先確定在哪個分支上修復bug,在此分支上創建新的bug分支來修復,修復完成,然後合併,最後刪除臨時分支
-
創建臨時分支之前需要查看工作區是否乾淨,乾淨則創建分支來修復bug
-
當工作未完成時,需先將工作現場
git stash
一下,然後修復bug,再git stash pop
,回到工作現場git stash
功能:把當前工作儲存起來,在恢復現場後繼續工作git stash list
查看stash記錄git stash pop
,恢復的同時將stash
內容刪除git stash apply
恢復,但並未刪除stash內容,需要用git stash drop
5 Feature分支
每添加一個新功能,最好新建一個feature分支
-
新建feature分支(
git checkout -b feature
) -
在上面開發,完成後,合併(
git checkout dev
) -
最後,刪除該feature分支。
如果要丟棄一個沒有被合併過的分支,可以通過git branch -D <name>
強行刪除。
6 推送抓取分支
要查看遠程庫的信息,用git remote
,或者用git remote -v
顯示更詳細的信息
-
推送分支
git push origin branch-name
-
master
分支是主分支,需要時刻與遠程同步 -
dev
分支是開發分支,也需要與遠程同步 -
bug分支只用於在本地修復bug,不用推到遠程
-
feature分支是否推到,取決於是否在上面合作合作開發
-
-
抓取分支
-
1、用
git pull
把最新的提交從遠程倉庫抓下來 -
2、在本地合併,解決衝突,再推送
-
3、
git pull
失敗,原因是沒有指定本地dev
分支與遠程origin/dev
分支的鏈接,根據提示,設置dev
和origin/dev
的鏈接git branch --set-upstream-to=origin/dev dev
-
4、合併有衝突,需要手動解決,解決的方法和分支管理中的解決衝突一樣
-
-
多人協作的工作模式:
- 用
git push origin <branch-name>
推送自己的修改; - 如果推送失敗,則因爲遠程分支比你的本地更新,需要先用
git pull
合併; - 如果合併有衝突,則解決衝突,並在本地提交;
- 沒有衝突或者解決掉衝突後,再用
git push origin <branch-name>
推送。
- 用
- 在本地創建和遠程分支對應的分支,使用
git checkout -b branch-name origin/branch-name
,本地和遠程分支的名稱最好一致; - 建立本地分支和遠程分支的關聯,使用
git branch --set-upstream branch-name origin/branch-name
;
7 Rebase3
git rebase
改變本地的提交位置
5、標籤
1 創建標籤
git tag name 創建標籤,標籤默認打在最新的commit上(HEAD)
git tag name commit id 指定要創建的標籤的位置
git tag -a name -m "" 創建帶有說明的標籤
git tag 查看所有標籤
git show tagname 查看標籤信息
2 刪除標籤
git tag -d name 刪除本地標籤
git push origin name 推送標籤到遠程
git push origin --tags 推送所有未推送的標籤到遠程
git push origin :refs/tags/name 刪除遠程標籤
6、GitHub與碼雲
1 GithHub4
- 在GitHub上,可以任意克隆開源倉庫
- 自己有克隆後的倉庫的讀寫權限
- 可以推送pull request給官方倉庫來貢獻代碼
2 碼雲5
關聯碼雲遠程庫與GitHub一致
可以同時使用GitHub與碼雲,使用多個遠程庫時,需要用不同的名稱來標識不同的遠程庫
7、自定義Git
1 忽略特殊文件
在Git工作區的根目錄下創建一個特殊的.gitignore
文件,把需要忽略的文件名加入,將.gitignore
提交到Git
配置文件:https://github.com/github/gitignore
忽略文件的原則:
- 忽略操作系統自動生成的文件,比如縮略圖等;
- 忽略編譯生成的中間文件、可執行文件等,比如Java編譯產生的
.class
文件;- 忽略你自己的帶有敏感信息的配置文件,比如存放口令的配置文件。
2 配置別名
配置
git config --global alias.co checkout //checkout
git config --global alias.ci commit //commit
git config --global alias.br branch //branch
git config --global alias.unstage 'reset HEAD' //把暫存區的修改撤銷掉
git config --global alias.last 'log -1' //顯示最後一次提交信息
–global`參數是全局參數,也就是這些命令在這臺電腦的所有Git倉庫下都有用。
每個倉庫的Git配置文件放在.git/config
文件中
當前用戶的Git配置文件放在用戶主目錄下的.gitconfig
文件夾中:
刪除
別名就在[alias]
後面,要刪除別名,直接把對應的行刪掉即可
3 搭建Git服務器
運行Linux的機器
- 安裝
git
:
sudo apt-get install git
- 創建一個
git
用戶,用來運行git
服務:
sudo adduser git
- 創建證書登錄:
收集所有需要登錄的用戶的公鑰,就是他們自己的id_rsa.pub
文件,把所有公鑰導入到/home/git/.ssh/authorized_keys
文件裏,一行一個。
- 初始化Git倉庫:
先選定一個目錄作爲Git倉庫,假定是/srv/sample.git
,在/srv
目錄下輸入命令:
sudo git init --bare sample.git
Git就會創建一個裸倉庫,裸倉庫沒有工作區,因爲服務器上的Git倉庫純粹是爲了共享,所以不讓用戶直接登錄到服務器上去改工作區,並且服務器上的Git倉庫通常都以.git
結尾。然後,把owner改爲git
:
sudo chown -R git:git sample.git
- 禁用shell登錄:
出於安全考慮,第二步創建的git用戶不允許登錄shell,這可以通過編輯/etc/passwd
文件完成。找到類似下面的一行:
git:x:1001:1001:,,,:/home/git:/bin/bash
改爲:
git:x:1001:1001:,,,:/home/git:/usr/bin/git-shell
這樣,git
用戶可以正常通過ssh使用git,但無法登錄shell,因爲我們爲git
用戶指定的git-shell
每次一登錄就自動退出。
6.克隆遠程倉庫:
現在,可以通過git clone
命令克隆遠程倉庫了,在各自的電腦上運行:
git clone git@server:/srv/sample.git
Git跟蹤並管理的是修改