一個很流行的版本控制系統Git學習筆記



什麼是Git  jquery

Git是一種很是流行的分佈式版本控制系統,它和其餘版本控制系統的主要差異在於Git只關心文件數據的總體是否發生變化,而大多數版本其餘系統只關心文件內容的具體差別,這類系統(CVS,Subversion,Perforce,Bazaar 等等)git

每次記錄有哪些文件做了更新,以及都更新了哪些行的什麼內容github


Git另外一個比較好的地方在於絕大多數操做均可以在本地執行,而每一個本地均可以從服務器獲取一份完整的倉庫代碼數據庫

並且在沒網時仍然能夠修改和使用大部分命令,在方便時再跟服務器進行同步,這樣能夠更好的實現多人聯合編程編程


另外我的感受Git系統的強大在於它建立了一個個相似於快照的東西緩存

記憶咱們每一次的提交而且能夠在將來的任什麼時候候回到這裏,對於大型項目的管理很是有效服務器


最原始的版本控制是純手工的版本控制:修改文件,保存文件副本。有時候偷懶省事,保存副本時命名比較隨意分佈式

時間長了就不知道哪一個是新的,哪一個是老的了,即便知道新舊,可能也不知道每一個版本是什麼內容ide

相對上一版做了什麼修改了,當幾個版本過去後,極可能就是下面這個老土的樣子了:fetch



wKiom1k2VUzBBnSvAAEOeQvxAm0289.png-wh_50


Git特色

分佈式相比於集中式的最大區別在於開發者能夠提交到本地

每一個開發者經過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫


直接記錄快照,而非差別比較 : Git 更像是把變化的文件做快照後,記錄在一個微型的文件系統中

近乎全部操做都是本地執行 :在 Git 中的絕大多數操做都只須要訪問本地文件和資源,不用連網

時刻保持數據完整性 :在保存到 Git 以前,全部數據都要進行內容的校驗和(checksum)計算

                                        並將此結果做爲數據的惟一標識和索引

多數操做僅添加數據 :經常使用的 Git 操做大多僅僅是把數據添加到數據庫


開發流程示意圖:

wKioL1k2VkbizTFSAAF8QOl9Z2I957.png-wh_50


一、基本概念

Stage:暫存區,緩存區

Repository:倉庫(本地倉庫).git目錄

Remote:遠程倉庫

Track: 將一個新文件加入到git

Unstage:取消放入暫存區

 

Git存儲原理

Git 保存的不是文件差別或者變化量,而只是一系列文件快照。

快照管理:(微型文件系統,文件指紋驗證是否變化,不便的直接連接)

 wKiom1lMZ8XQJtQSAACQ4g1UFbM326.png-wh_50

三種區域

 wKioL1lMZ-6xzFtMAACaQDKI0aQ216.png-wh_50

全部數據存放在本地.git目錄,能夠直接拷貝。

 

二、基本操做


2.一、倉庫建立

Git init


2.二、倉庫複製

Git clone  url

只會複製master下來

Git clone  url dir

指定文件夾

git clone https://github.com/libgit2/libgit2 mylibgit


2.三、文件管理

2.3.一、添加文件到暫存區

Git add *

Git add file

Git add dir       

 

2.3.二、刪除文件到暫存區

Git rm


2.3.三、修改文件名(移動)到暫存區

Git mv [file-orgin]  [file-rename]

 

2.3.四、提交暫存區到倉庫

Git commit –m 「註釋」

 wKiom1lMaCmBvCUaAABA9YlR1BE796.png-wh_50

2.3.五、撤銷修改文件

修改的文件能夠在git status觀察到

若是撤銷修改

能夠採用git checkout -- file的方式撤銷

撤銷全部

git checkout  -- *


2.3.6        撤銷暫存區數據

wKiom1lMaHeSNRcGAAATHP***ig080.png-wh_50


2.四、分支管理

查看分支:git branch

建立分支:git branch <name>

 

切換分支:git checkout <name>

建立+切換分支:git checkout -b <name>

 

合併某分支到當前分支:git merge <name>

 

默認使用fast-forward模式

wKiom1lMaKPDeqrzAAAgzo_saHY471.png-wh_50

能夠禁用,合併時會生成一個新的commit

git merge --no-ff -m "merge " dev

        

刪除分支:git branch -d <name>

 wKiom1lMaMSTiywqAAAkAdf7M4E014.png-wh_50

遠程分支下載:git checkout -b <本地分支名> origin/<遠程分支名>

              

 合併衝突:

 當merge出現衝突的時候,git會提醒

wKioL1lMaPOBedQ6AAAo0ZlP0jA164.png-wh_50

須要手動修改後進行提交

Git add

Git commit


2.五、版本管理

每一個提交都是一個版本,git提供了一些方便的命令供咱們使用。


2.5.一、查看日誌

Git log

當前分支的commit歷史


有用的配置

log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit

wKioL1lMaRXztYMgAABkWn50vYM299.png-wh_50

Git reflog

顯示引用變化歷史,至關於head變化

wKioL1lMaTfj0DkLAACHSUCpIps502.png-wh_50


2.5.二、版本回退:

一個git reset --hard HEAD^

倆git reset --hard HEAD^^

多個git reset --hard HEAD~數字

 

回退到指定版本

git reset --hard commit_id

commitid能夠從reflog或者log中查看

--hard表示丟棄暫存區的東西

 

--soft – 暫存區和工做目錄都不會被改變,改變都放在暫存區

--mixed – 默認選項。緩存區和你指定的提交同步,但工做目錄不受影響,改變不會放在暫存區。

--hard – 緩存區和工做目錄都同步到你指定的提交

 

Git revert

reset是指將當前head的內容重置,不會留任何痕跡。

revert是撤銷某一次提交,可是此次撤銷也會做爲一次提交進行保存

 

假設當前有3個commit,git log以下:

commit3:  add test3.c 

commit2:  add test2.c 

commit1:  add test1.c 


執行 git revert HEAD~1以後,會提示提交信息,提交後git  log以下:

commit4:  Reverts 「test2.c」 

commit3:  test3.c 

commit2:  test2.c 

commit1:  test1.c 


執行完後,test2.c被刪除了,運行git status,無任何變化。

執行 git reset HEAD~1以後,再次看git log,以下:

commit2:  test2.c 

commit1:  test1.c 


執行完後,commit3被刪除了

可是test3.c還在本地緩存區,運行git  status,能夠看見提示test3.c能夠用git add包含該文件。


若執行git reset --soft HEAD~1,log爲:

commit2:  test2.c 

commit1:  test1.c 

執行完後,test3.c也被刪除了,查看git  status,提示能夠commit以提交test3.c,test3.c在暫存區。

 

若執行git reset --hard HEAD~1,log爲:

commit2:  test2.c 

commit1:  test1.c 

執行完後,test3.c也被刪除了,查看git  status,無任何變化。

 

2.六、標籤管理

                           

2.6.一、打標籤

至關於給某個提交取一個好記住的名字,例如v1.0.0

git tag v1.0.0 [commitid]

 

2.6.二、顯示全部標籤

git tag

 

2.6.三、顯示標籤信息

Git show tagname

 

2.6.四、標籤管理

命令git push origin <tagname>能夠推送一個本地標籤;

命令git push origin --tags能夠推送所有未推送過的本地標籤;

 

命令git tag -d <tagname>能夠刪除一個本地標籤;

命令git push origin :refs/tags/<tagname>能夠刪除一個遠程標籤。


2.七、遠程管理

通常都要和兩部分人提供


2.7.一、git clone

從遠程主機克隆一個版本庫

git clone <版本庫的網址> <本地目錄名>

 wKiom1lMaWuAVPbkAAAsuJjdoK8307.png-wh_50


2.7.二、git remote

爲了便於管理,Git要求每一個遠程主機都必須指定一個主機名。git remote命令就用於管理主機名。


列出全部主機:git remote

帶網址列出主機:git remote –v

clone版本庫的時候,所使用的遠程主機自動被Git命名爲origin

若是想用其餘的主機名,須要用git clone命令的-o選項指定。

git clone -o jQuery https://github.com/jquery/jquery.git

 

git remote show命令加上主機名,能夠查看該主機的詳細信息。

 git remote show <主機名>

git remote add命令用於添加遠程主機。

 git remote add <主機名> <網址>

git remote rm命令用於刪除遠程主機。

 git remote rm <主機名>

git remote rename命令用於遠程主機的更名。

 git remote rename <原主機名> <新主機名>

 

2.7.三、git fetch

將某個遠程主機的更新,所有取回本地。

若是隻想取回特定分支的更新,能夠指定分支名。

git fetch <遠程主機名> <分支名>


所取回的更新,在本地主機上要用"遠程主機名/分支名"的形式讀取

好比origin主機的master,就要用origin/master讀取。

git branch  –r,能夠用來查看遠程分支,

-a選項查看全部分支。

 能夠採用git checkout <遠程主機名>/ <分支名>切換到該分支

可是通常用git checkout -b newBrach <遠程主機名>/ <分支名>

意思是在<遠程主機名>/ <分支名>的基礎上,建立一個新分支。

也可使用merge,合併遠程分支。


2.7.四、git pull

取回遠程主機某個分支的更新,再與本地的指定分支合併。

git pull <遠程主機名> <遠程分支名>:<本地分支名>

等同於先作git fetch,再作git merge


2.7.五、git push

命令用於將本地分支的更新,推送到遠程主機。

git push <遠程主機名>  <本地分支名>:<遠程分支名>

省略遠程分支名,表示將本地分支推送與之存在"追蹤關係"的遠程分支(一般二者同名)

若是該遠程分支不存在,則會被新建。省略本地分支名,則表示刪除指定的遠程分支

若是當前分支與遠程分支之間存在追蹤關係,則本地分支和遠程分支均可以省略。

若是本地版本低,那麼會報錯,能夠--force強制push,--tags表示也推送tags.

git push --force origin

 

2.7.六、將本地庫推到遠程端

git push origin master

 

2.八、自定義Git


2.8.一、自定義命令

能夠利用git config命令來給命令取別名。

例如

git config --global alias.co csheckout

git config --global alias.ci commit

git config --global alias.br branch

git config --global alias.unstage 'reset HEAD'


其中,global表示針對當前用戶全部倉庫都起做用

若是不加,表示只對當前倉庫有用,每一個倉庫的Git配置文件都放在.git/config文件中:

當前用戶的config存放在用戶主目錄下的一個隱藏文件.gitconfig中:

 

2.8.二、忽略文件

 

爲了防止沒用的文件被提醒untracked,能夠在git倉庫主目錄下添加.gitignore文件

(自己要放到版本庫裏面),該文件能夠配置git要忽略哪些文件,不添加到倉庫中。

wKiom1lMaaiwQSFZAABHIGTyTHE858.png-wh_50

 

若是發現不能添加文件,能夠採用

git check-ignore -v file檢查被哪一個規則忽略了

相關文章
相關標籤/搜索