Git 版本控制管理 總結

Git

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~100
  • git 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 devgit 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 stash apply恢復,可是恢復後,stash內容並不刪除,你須要用git stash drop來刪除
    • 另外一種方式是用git stash pop,恢復的同時把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顯示顏色,會讓命令輸出看起來更醒目

git config --global color.ui true

合併分支文件衝突

git merge dev 用於合併 指定分支dev 到當前分支 文件衝突,必須手動解決衝突後再提交。 git status 也能夠告訴咱們衝突的文件 Git用<<<<<<<,=======,>>>>>>>標記出不一樣分支的內容

BUG分支

每一個bug均可以經過一個新的臨時分支來修復,修復後,合併分支,而後將臨時分支刪除。

  1. 能夠把當前工做現場「儲藏」起來,等之後恢復現場後繼續工做
  2. 在master分支上修復,就從master建立臨時分支 git checkout master git checkout -b bug002
  3. 修復bug並提交到 bug002
  4. 切換到master分支,完成合並,刪除 bug002 分支 git checkout master git merge --no-ff -m "merged bug " bug002 git branch -d bug002
  5. 回到dev分支 恢復 stash

git reset

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 -- file 與 git reset

  • git checkout主要有三個做用:

    • 切換分支。例如你從遠程倉庫clone下來全部的源代碼,你git branch一下會看到你一般是在master,若是你想切換到某一個分支上呢?git checkout <branchname>
    • 放棄對某個文件的修改。例如你想放棄對某個文件Hello.cpp的修改,git checkout -- <Hello.cpp>
    • 新建一個分支,git checkout <-b> <branchname>,不加-b的話只新建不切換到新的分支上,加-b新建並切換到該分支上
  • git reset主要是取消上一次的操做,具體用法有不少,說兩個:

    • git reset –mixed:此爲默認方式,不帶任何參數的git reset,即時這種方式,它回退到某個版本,只保留源碼,回退commit和index信息
    • git reset –soft:回退到某個版本,只回退了commit的信息,不會恢復到index file一級。若是還要提交,直接commit便可
    • git reset –hard:完全回退到某個版本,本地的源碼也會變爲上一個版本的內容
  • git checkout -- file;

    撤銷對工做區修改;這個命令是以最新的存儲時間節點(add和commit)爲參照,覆蓋工做區對應文件file;這個命令改變的是工做區

  • git reset HEAD -- file

    清空add命令向暫存區提交的關於file文件的修改(Ustage);這個命令僅改變暫存區,並不改變工做區,這意味着在無任何其餘操做的狀況下,工做區中的實際文件同該命令運行以前無任何變化

gitignore 忽略特殊文件

github/gitignore

  1. cd 項目根目錄
  2. touch .gitignore 在文件夾就生成了一個.gitignore文件
  3. 編輯
  4. 提交到Git

git rm --cached XXX.xcodeproj/project.xcworkspace/xcuserdata/mac.xcuserdatad/UserInterfaceState.xcuserstate

相關文章
相關標籤/搜索