CVS及SVN都是集中式的版本控制系統,而Git是分佈式版本控制系統git
先說集中式版本控制系統,版本庫是集中存放在中央服務器的,而幹活的時候,用的都是本身的電腦,因此要先從中央服務器取得最新的版本,而後開始幹活,幹完活了,再把本身的活推送給中央服務器。中央服務器就比如是一個圖書館,你要改一本書,必須先從圖書館借出來,而後回到家本身改,改完了,再放回圖書館。 集中式版本控制系統最大的毛病就是必須聯網才能工做,若是在局域網內還好,帶寬夠大,速度夠快,可若是在互聯網上,遇到網速慢的話,可能提交一個10M的文件就須要5分鐘,這還不得把人給憋死啊。github
分佈式版本控制系統根本沒有「中央服務器」,每一個人的電腦上都是一個完整的版本庫,這樣,你工做的時候,就不須要聯網了,由於版本庫就在你本身的電腦上。xcode
CVS做爲最先的開源並且免費的集中式版本控制系統,直到如今還有很多人在用。因爲CVS自身設計的問題,會形成提交文件不完整,版本庫莫名其妙損壞的狀況。一樣是開源並且免費的SVN修正了CVS的一些穩定性問題,是目前用得最多的集中式版本庫控制系統。服務器
Git是一款免費、開源的分佈式版本控制系統,app
pwd
命令用於顯示當前目錄分佈式
git init
命令把這個目錄變成Git能夠管理的倉庫fetch
git reflog
用來記錄你的每一次命令ui
git log
命令顯示從最近到最遠的提交日誌 git log --pretty=oneline 簡化日誌信息 git log --graph 命令能夠看到分支合併圖 一大串相似 3628164...882e1e0 的是commit id(版本號),和SVN不同,Git的commit id不是1,2,3……遞增的數字,而是一個SHA1計算出來的一個很是大的數字,用十六進制表示spa
git reset --hard HEAD^
回退到上一個版本,用HEAD表示當前版本,上一個版本就是HEAD^,上上一個版本就是HEAD^^,固然往上100個版本寫100個^比較容易數不過來,因此寫成HEAD~100git reset --hard 3628164
回退到指定版本,版本號不必寫全,前幾位就能夠了,Git會自動去找git status
命令可讓咱們時刻掌握倉庫當前的狀態,告訴你有文件被修改過git diff
能夠查看修改內容git add 文件名.擴展名
把文件修改添加到暫存區git commit -m '本次提交的說明'
把暫存區的全部內容提交到當前分支git checkout -- readme.txt
把readme.txt文件在工做區的修改所有撤銷 一種是readme.txt自修改後尚未被放到暫存區,如今,撤銷修改就回到和版本庫如出一轍的狀態; 一種是readme.txt已經添加到暫存區後,又做了修改,如今,撤銷修改就回到添加到暫存區後的狀態。git push -u origin master
因爲遠程庫是空的,第一次推送master分支時,加上了-u參數,Git不但會把本地的master分支內容推送的遠程新的master分支,還會把本地的master分支和遠程的master分支關聯起來,在之後的推送或者拉取時就能夠簡化命令。git push origin master
把本地分支的最新修改推送遠程git remote add origin git@server-name:path/repo-name.git
關聯一個遠程庫git clone git@github.com:michaelliao/gitskills.git
克隆倉庫到本地Git爲咱們自動建立的第一個分支master,以及指向master的一個指針叫HEAD。設計
git branch dev
在當前分支基礎上建立 dev 分支
git checkout dev
切換到 dev 分支
git checkout -b dev
在當前分支基礎上建立並切換到dev分支 至關於 git branch dev
和 git checkout dev
2個命令
git branch
會列出全部分支,當前分支前面會標一個*號。
git merge dev
用於合併 指定分支dev 到當前分支
git merge --no-ff -m "merge with no-ff" dev
注意--no-ff參數,表示禁用Fast forward 合併分支時,若是可能,Git會用Fast forward模式,但這種模式下,刪除分支後,會丟掉分支信息。 若是要強制禁用Fast forward模式,Git就會在merge時生成一個新的commit,這樣,從分支歷史上就能夠看出分支信息。 合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經作過合併,而fast forward合併就看不出來曾經作過合併。
git branch -d dev
刪除dev分支
git branch -D dev
git stash
能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做
git stash list
查看工做現場
Git把stash內容存在某個地方了,可是須要恢復一下
git push origin branch-name
從本地推送到遠程分支,若是推送失敗,先用 git pull
抓取遠程的新提交
git remote -v
查看遠程庫信息,顯示了能夠抓取和推送的origin的地址
git checkout -b branch-name origin/branch-name
在本地建立和遠程分支對應的分支,本地和遠程分支的名稱最好一致
git branch --set-upstream branch-name origin/branch-name
創建本地分支和遠程分支的關聯
git fetch [branch-name]
取回全部分支(branch)的更新。若是隻想取回特定分支的更新,能夠指定分支名,將某個遠程主機的更新,所有取回本地
Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的指針(跟分支很像對不對?可是分支能夠移動,標籤不能移動),tag就是一個讓人容易記住的有意義的名字,它跟某個commit綁在一塊兒。
git tag <name>
就能夠打一個新標籤,默認標籤是打在最新提交的commit上的git tag v0.9 6224937
給 歷史提交的commit id 打標籤git tag -a v0.1 -m "version 0.1 released" 3628164
給 歷史提交的commit id 建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字git tag
查看全部標籤,標籤不是按時間順序列出,而是按字母排序的git show <tagname>
查看標籤信息git push origin <tagname>
推送某個標籤到遠程git push origin --tags
一次性推送所有還沒有推送到遠程的本地標籤git tag -d <tagname>
能夠刪除一個本地標籤git push origin :refs/tags/<tagname>
能夠刪除一個遠程標籤。 若是標籤已經推送到遠程,要刪除遠程標籤,先從本地刪除: git tag -d v0.9
而後,從遠程刪除: git push origin :refs/tags/v0.9
git config --global color.ui true
git merge dev
用於合併 指定分支dev 到當前分支 文件衝突,必須手動解決衝突後再提交。 git status
也能夠告訴咱們衝突的文件 Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容
每一個bug均可以經過一個新的臨時分支來修復,修復後,合併分支,而後將臨時分支刪除。
reset命令有3種方式: 1:git reset –mixed:此爲默認方式,不帶任何參數的git reset,即時這種方式,它回退到某個版本,只保留源碼,回退commit和index信息 2:git reset –soft:回退到某個版本,只回退了commit的信息,不會恢復到index file一級。若是還要提交,直接commit便可 3:git reset –hard:完全回退到某個版本,本地的源碼也會變爲上一個版本的內容
# 回退全部內容到上一個版本 git reset HEAD^ # 回退a.py這個文件的版本到上一個版本 git reset HEAD^ a.py # 向前回退到第3個版本 git reset –soft HEAD~3 # 將本地的狀態回退到和遠程的同樣 git reset –hard origin/master # 回退到某個版本 git reset 057d # 回退到上一次提交的狀態,按照某一次的commit徹底反向的進行一次commit git revert HEAD
git checkout主要有三個做用:
git reset主要是取消上一次的操做,具體用法有不少,說兩個:
git checkout -- file;
撤銷對工做區修改;這個命令是以最新的存儲時間節點(add和commit)爲參照,覆蓋工做區對應文件file;這個命令改變的是工做區
git reset HEAD -- file
清空add命令向暫存區提交的關於file文件的修改(Ustage);這個命令僅改變暫存區,並不改變工做區,這意味着在無任何其餘操做的狀況下,工做區中的實際文件同該命令運行以前無任何變化
cd 項目根目錄
touch .gitignore
在文件夾就生成了一個.gitignore文件git rm --cached XXX.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate