參考博客:git
1. 初始化一個Git倉庫,使用git init命令。bootstrap
2. 添加文件到Git倉庫,分兩步:ssh
第一步,使用命令git add <file>,注意,可反覆屢次使用,添加多個文件;ide
第二步,使用命令git commit,完成。this
3. 使用git status命令, 掌握工做區的狀態。spa
4. 若是git status告訴你有文件被修改過,用git diff能夠查看修改內容。指針
5. git log命令查看歷史記錄。orm
git log --pretty=oneline排序
6. 版本回退
git reset --hard HEAD^ // HEAD指向的版本就是當前版本。
git reset --hard commit_id
commit_id是版本號,用git log查看。即Git容許咱們在版本的歷史之間穿梭前,
用git log能夠查看提交歷史,以便肯定要回退到哪一個版本。要重返將來,用git log
查看命令歷史,以便肯定要回到將來的哪一個版本。
7. 工做區和暫存區
工做區:使用git init命令初始化的目錄。
版本庫:工做區有一個隱藏目錄.git,這個不算工做區,而是Git的版本庫。
git add命令把要提交的全部修改放到暫存區(Stage)
git commit可一次性把暫存區的全部修改提交到分支(master)
管理修改:每次修改,若是不add到暫存區,那就不會加入到commit中。
撤銷修改:
1.當改亂工做區某個文件的內容後想直接丟棄工做區的修改時,用命令git checkout -- file
2.當不但改亂工做區某個文件的內容,還添加到了暫存區時,想丟棄修改,分兩步,
第一步用命令git reset HEAD file,就回到了場景1,第二步按場景1操做。
3.已經提交了不合適的修改到版本庫時,想要撤銷本次提交,參考版本回退一節,
不過前提是沒有推送到遠程庫。
刪除文件:rm test.txt // 刪除工做區的文件
<1> git rm test.txt // 從版本庫中刪除該文件
git commit -m "remove test.txt" // 提交到版本庫
<2> git checkout -- test.txt // 用版本庫的版本替換工做區的版本
8. 遠程倉庫GitHub
(1)建立SSH Key。ssh-keygen -t rsa -C "youremail@example.com",在用戶主目錄下,會
生成.ssh目錄,這個目錄下生成id_rsa和id_rsa.pub這兩個文件。
(2)在GitHub上Add SSH Key。
(3)在GitHub上 Create a new repository。
(4)把本地倉庫的內容推送到GitHub倉庫,在本地的learngit倉庫下運行命令:
git remote add origin git@github.com:scarliyang/learngit.git
錯誤:提示出錯信息:fatal: remote origin already exists.
解決辦法以下:
一、先輸入$ git remote rm origin
二、再輸入$ git remote add origin git@github.com:oscarliyang/gitdemo.git
(5)把本地庫的全部內容推送到遠程庫上
git push -u origin master // 第一次推送master分支的全部內容時加上了-u參數
git push origin master // 以後提交只須要這樣
(6)從遠程庫克隆
<1>先建立遠程庫:建立一個新的倉庫,勾選Initialize this repository with a README,
這樣GitHub會自動爲咱們建立一個README.md文件
<2>再從遠程庫克隆:git clone git@github.com:oscarliyang/gitdemo.git
注:Git支持多種協議,默認的git://使用ssh,但也可使用https等其餘協議。
9. 分支管理
在Git裏,主分支即master分支。HEAD嚴格來講不是指向提交,而是指向master,master纔是
指向提交的,因此,HEAD指向的就是當前分支。
(1)建立與合併分支
<1>首先,咱們建立dev分支,而後切換到dev分支:
git checkout -b dev // git checkout命令加上-b參數表示建立並切換,
至關於如下兩條命令: git branch dev 和 git checkout dev
<2>而後,用git branch命令查看當前分支:
git branch// git branch命令會列出全部分支,當前分支前面會標一個*號。
<3>提交:git add readme.txt
git commit -m "branch test"
<4>切換回master分支:git checkout master
<5>把dev分支的工做成果合併到master分支上:
git merge dev//用於合併指定分支到當前分支
<6>刪除dev分支:git branch -d dev
(2)解決衝突
即分支和master都修改了同一個文件,致使衝突。則在提交到master分支時,先須要修改
衝突內容,再add/commit。看到分支的合併狀況:
git log --graph --pretty=oneline --abbrev-commit
最後刪除分支。
(3)分支管理策略
--no-ff參數,表示禁用Fast forward:git merge --no-ff -m "merge with no-ff" dev
在實際開發中,咱們應該按照幾個基本原則進行分支管理:首先,master分支應該是很是
穩定的,也就是僅用來發布新版本,平時不能在上面幹活;那在哪幹活呢?幹活都在dev分
支上,也就是說,dev分支是不穩定的,到某個時候,好比1.0版本發佈時,再把dev分支合
併到master上,在master分支發佈1.0版本;你和你的小夥伴們每一個人都在dev分支上幹活,
每一個人都有本身的分支,時不時地往dev分支上合併就能夠了。
注:合併分支時,加上--no-ff參數就能夠用普通模式合併,合併後的歷史有分支,能看出來曾經
作過合併,而fast forward合併就看不出來曾經作過合併。
(4)Bug分支
修復bug時,咱們會經過建立新的bug分支進行修復,而後合併,最後刪除;
當手頭工做沒有完成時,先把工做現場git stash儲藏一下,而後去修復bug,修復後,
再git stash pop,回到工做現場。
(5)Feature分支
開發一個新feature,最好新建一個分支;若是要丟棄一個沒有被合併過的分支,能夠經過
git branch -D <分支名>強行刪除。
(6)多人協做
當從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,
而且,遠程倉庫的默認名稱是origin。
查看遠程庫的信息,用git remote
查看遠程庫詳細信息,用git remote -v
多人協做的工做模式一般是這樣:
首先,能夠試圖用git push origin branch-name推送本身的修改;
若是推送失敗,則由於遠程分支比你的本地更新,須要先用git pull試圖合併;
若是合併有衝突,則解決衝突,並在本地提交;
沒有衝突或者解決掉衝突後,再用git push origin branch-name推送就能成功!
注:若是git pull提示「no tracking information」,則說明本地分支和遠程分支的連接關係沒有
建立,用命令 git branch --set-upstream branch-name origin/branch-name
抓取分支:在本地建立和遠程分支對應的分支(本地和遠程分支的名稱最好一致),使用
git checkout -b branch-name origin/branch-name
10.標籤管理
發佈一個版本時,咱們一般先在版本庫中打一個標籤,這樣,就惟一肯定了打標籤時刻的版本。
未來不管何時,取某個標籤的版本,就是把那個打標籤的時刻的歷史版本取出來。因此,
標籤也是版本庫的一個快照。Git的標籤雖然是版本庫的快照,但其實它就是指向某個commit的
指針(跟分支很像對不對?可是分支能夠移動,標籤不能移動),因此,建立和刪除標籤都是
瞬間完成的。
(1)建立標籤
首先,切換到須要打標籤的分支上。
而後,敲命令git tag <name>就能夠打一個新標籤。
命令git tag查看全部標籤。
默認標籤是打在最新提交的commit上的,git tag v0.9 commitid 對指定commitid打標籤
標籤不是按時間順序列出,而是按字母排序的。能夠用git show <tagname>查看標籤信息
建立帶有說明的標籤,用-a指定標籤名,-m指定說明文字:
git tag -a v0.1 -m "version 0.1 released" 3628164
還能夠經過-s用私鑰簽名一個標籤:
git tag -s v0.2 -m "signed version 0.2 released" fec145a
(2)操做標籤
刪除標籤:git tag -d v0.1 //建立的標籤都只存儲在本地,不會自動推送到遠程
推送某個標籤到遠程:git push origin <tagname>
一次性推送所有還沒有推送到遠程的本地標籤:git push origin --tags
刪除推送到遠程的標籤:
git tag -d v0.9 //先從本地刪除
git push origin :refs/tags/v0.9 //而後從遠程刪除
11.使用GitHub
參與一個開源項目:點「Fork」就在本身的帳號下克隆了一個bootstrap倉庫,而後,從本身的帳號
下 clone:git clone git@github.com:michaelliao/bootstrap.git。必定要從本身的帳號下clone倉庫,
這樣你才能推送修改。若是從開源庫的做者的倉庫地址git@github.com:twbs/bootstrap.git克隆,
由於沒有權限,你將不能推送修改。能夠在GitHub上發起一個pull request,向開源項目的官方庫
提交你的修改。即:
在GitHub上,能夠任意Fork開源倉庫;
本身擁有Fork後的倉庫的讀寫權限;
能夠推送pull request給官方倉庫來貢獻代碼。