什麼是Git jquery
Git是一種很是流行的分佈式版本控制系統,它和其餘版本控制系統的主要差異在於Git只關心文件數據的總體是否發生變化,而大多數版本其餘系統只關心文件內容的具體差別,這類系統(CVS,Subversion,Perforce,Bazaar 等等)git
每次記錄有哪些文件做了更新,以及都更新了哪些行的什麼內容github
Git另外一個比較好的地方在於絕大多數操做均可以在本地執行,而每一個本地均可以從服務器獲取一份完整的倉庫代碼數據庫
並且在沒網時仍然能夠修改和使用大部分命令,在方便時再跟服務器進行同步,這樣能夠更好的實現多人聯合編程編程
另外我的感受Git系統的強大在於它建立了一個個相似於快照的東西緩存
記憶咱們每一次的提交而且能夠在將來的任什麼時候候回到這裏,對於大型項目的管理很是有效服務器
最原始的版本控制是純手工的版本控制:修改文件,保存文件副本。有時候偷懶省事,保存副本時命名比較隨意分佈式
時間長了就不知道哪一個是新的,哪一個是老的了,即便知道新舊,可能也不知道每一個版本是什麼內容ide
相對上一版做了什麼修改了,當幾個版本過去後,極可能就是下面這個老土的樣子了:fetch
Git特色
分佈式相比於集中式的最大區別在於開發者能夠提交到本地
每一個開發者經過克隆(git clone),在本地機器上拷貝一個完整的Git倉庫
直接記錄快照,而非差別比較 : Git 更像是把變化的文件做快照後,記錄在一個微型的文件系統中
近乎全部操做都是本地執行 :在 Git 中的絕大多數操做都只須要訪問本地文件和資源,不用連網
時刻保持數據完整性 :在保存到 Git 以前,全部數據都要進行內容的校驗和(checksum)計算
並將此結果做爲數據的惟一標識和索引
多數操做僅添加數據 :經常使用的 Git 操做大多僅僅是把數據添加到數據庫
開發流程示意圖:
一、基本概念
Stage:暫存區,緩存區
Repository:倉庫(本地倉庫).git目錄
Remote:遠程倉庫
Track: 將一個新文件加入到git
Unstage:取消放入暫存區
Git存儲原理
Git 保存的不是文件差別或者變化量,而只是一系列文件快照。
快照管理:(微型文件系統,文件指紋驗證是否變化,不便的直接連接)
三種區域
全部數據存放在本地.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 「註釋」
2.3.五、撤銷修改文件
修改的文件能夠在git status觀察到
若是撤銷修改
能夠採用git checkout -- file的方式撤銷
撤銷全部
git checkout -- *
2.3.6 撤銷暫存區數據
2.四、分支管理
查看分支:git branch
建立分支:git branch <name>
切換分支:git checkout <name>
建立+切換分支:git checkout -b <name>
合併某分支到當前分支:git merge <name>
默認使用fast-forward模式
能夠禁用,合併時會生成一個新的commit
git merge --no-ff -m "merge " dev
刪除分支:git branch -d <name>
遠程分支下載:git checkout -b <本地分支名> origin/<遠程分支名>
合併衝突:
當merge出現衝突的時候,git會提醒
須要手動修改後進行提交
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
Git reflog
顯示引用變化歷史,至關於head變化
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 <版本庫的網址> <本地目錄名>
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要忽略哪些文件,不添加到倉庫中。
若是發現不能添加文件,能夠採用
git check-ignore -v file檢查被哪一個規則忽略了