2015-12-22 更新
一、Bug分支
1,假設如下場景,你正在dev分支工作,突然接到一個修復代號為101的bug的任務時,dev的東西還沒不能提交,但是bug需要馬上修復。
Git提供了一個stash功能,可以把當前工作現場存儲起來,等以后恢復現場后繼續工作。
2,使用方法:
$ git stash // 類似於保護現場
注:執行上面時可能會出現這個錯,no local changes to save,有可能是沒有切換到dev分支,或者切換后沒有在工作區進行修改,總之,多試試
然后切換回需要的分支進行修復,這里假設是master分支
$ git checkout master
再從master創建臨時分支
$ git checkout -b issue-101
這里進行修改,並提交
$ git add readme.txt
$ git commit -m "fix bug 101"
這里就算是修復完成了,然后切換回master分支,完成合並,最后刪除 issue-101 分支
$ git checkout master
$ git merge --no-ff -m "merged bug fix 101" issue-101 // 合並
$ git branch -d issue-101
到這里就修復完成了,切換回dev分支
$ git checkout dev
$ git status // 可以查看一下工作區是干凈的
查看剛才的工作現場
$ git stash list // 可以看到工作現場還在,git把stash內容存在某個地方了,但是需要恢復,有兩個方法
(1) $ git stash pop // 恢復的同時把stash內容也刪了
(2) $ git stash apply // 恢復后,stash內容並不是刪除,需要 $ git stash drop 來刪除
刪除后可以再次查看一下
$ git stash list
2,可以多次stash,恢復的時候先用$ git stash list 查看,然后恢復到指定的stash,如下:
$ git stash apply stash@{0}
4,小結:修復bug時,通過創建新的bug分支進行修復,然后合並,最后刪除
手里有工作沒有完成時,先把工作縣城 git stash一下,然后去修復bug,修復完了再 git stash pop,回到工作現場。
2015-12-28 更新
Feature分支
1,添加新功能時,肯定不希望因為一些實驗性質的代碼把主分支搞亂了,所以,添加一個新功能,最好新建一個feature分支,在上面開發,完成后,合並,最后刪除該分支。
2,實例:假設你接到一個新任務,代號為vulcan
(1)准備開發: $ git checkout -b feature-vulcan
(2)5分鍾后,開發完畢,查看一下 $ git status
(3)切回dev目錄,$ git checkout dev 若一切順利,feature分支和bug分支是蕾絲的,合並然后刪除
(4)此時,新功能要取消,就要刪除這個分支 $ git branch -d feature-vulcan
這時候Git會提醒你,feature-vulcan還沒有合並,若刪除則會丟失修改。需要強行刪除
$ git branch -D feature-vulcan // 強行刪除
多人協作
從遠程倉庫克隆時,實際上Git自動把本地的master分支和遠程的master分支對應起來了,並且,遠程倉庫的默認名稱是origin
1,查看遠程庫的信息 $ git remote
$ git remote -v // 查看更詳細的信息
上面顯示了可以抓取和推送的origin的地址,若沒有推送權限,就看不到push的地址
推送分支
1,推送分支:就是把該分支上的本地提交推送到遠程庫。推送時,要制定本地分支,這樣Git就會把該本地分支推送到遠程庫對應的遠程分支上
$ git push origin master // 要推送dev分支,就把master換成dev
2,哪些分支需要推送,哪些不要呢,這里有幾個原則:
(1)master分支是主分支,因此要時刻與遠程同步
(2)dev分支是開發分支,團隊成員都需要在上面工作,所以也要與遠程同步
(3)bug分支只用於在本地修復bug,可以用不要推送到遠程,除非老板要看看你到底修復了幾個bug
(4)feature分支是否推送到遠程,取決於你是否和你的小伙伴合作在上面開發
抓取分支
1,多人協作時,大家都會往master和dev分支上推送各自的修改
2,模擬一個小伙伴,可以在另一台電腦(注意要把SSH Key添加到GitHub)或者同一台電腦的另一個目錄下克隆。
實例:
先切換到另外一個目錄:
這里開始克隆
再次提醒一下:要將SSH Key添加到GitHub,相當於告訴你的GitHub賬戶信任這台電腦,不知道准不准確,這里希望大神解答。
友情提示:有時候 會出現這個錯誤
fatal: Not a git repository (or any of the parent directories): .git
提示說沒有.git這樣一個目錄,解決辦法如下:
$ git init 就可以了
2016-01-03 更新 新的一年希望自己能變得更好
1,運行$ git clone 可能會出錯:warning: You appear to have cloned an empty repository // 克隆一個空目錄
或者 fatal: destination path '.' already exists and is not an empty directory // 目標路徑已存在,且不為空
解決方法 : 參考自: http://blog.csdn.net/lein_wang/article/details/8182790
$ ls -a
$ rm .git/ -rf
不過我這樣試了還是沒用,只好把目錄刪除的東西全刪了, 我是這樣做的
$ rm * -rf // 這樣后面再重新 git clone 一下就好了
// git branch的一些用法,可以參考這個博客 http://blog.csdn.net/xiruanliuwei/article/details/6919319
2,有的運行 Git clone之后,查看分支發現是空的,這時候要注意要切換進你clone過來的那個目錄才可以看見分支,不要跟我一樣傻逼似,哎
接上面的抓取分支
(1)當你克隆之后,默認只能看到本地的master分支,就像上面那個圖一樣
(2)現在,你的小伙伴要在dev分支下開發,就必須創建遠程origin的dev分支到本地:
$ git checkout -b dev origin/dev
(3)這樣,小伙伴就可以在dev上繼續修改,然后時不時的把dev分支push到遠程
$ git commit -m "add dev 20160103"
$ git push origin dev
(4)你的小伙伴已經向origin/dev分支推送了他的分支,而碰巧你也對同樣的文件進行了修改並且推送:
$ git push origin dev // 可能會出錯,因為你的小伙伴的最新提交和你試圖推送的提交有沖突,Git會提示我們解決的方法,先用git pull把最新的提交從origin/dev中拿下來,然后在本地合並,解決沖突,最后推送:
$ git pull // 也可能會失敗,因為沒有指定本地dev分支與遠程origin/dev分支的鏈接,根據提示設置dev分支與遠程origin/dev分支的鏈接
$ git branch --set-upstream dev origin/dev
再pull。
若pull成功后有沖突,需要手動解決,解決的方法和分支管理中的解決沖突一樣,解決后再push
3,多人協作的模式通常是這樣:
(1)首先,可以試圖用git push origin branch-name退送自己的修改
(2)若退送失敗,則因為遠程分支比你的本地更新,需要先用git pull 合並
(3)若合並有沖突,則解決本地沖突,並在本地提交
(2)沒有沖突或解決了沖突,再用git push origin branch-name推送就可以了
4,小結:
(1)查看遠程庫信息,使用git remote -v
(2)本地新建的分支若不推送到遠程,別人是看不見的
(3)在本地創建和遠程分支對應的分支,用$ git checkout -b dev origin/dev 顏色部分表示分支名字,最好一致
(4)git pull提示 "no tracking information",則說明本地分支沒有與遠程分支建立鏈接關系,用命令
$ git branch --set-upstream dev origin/dev 建立本地分支與遠程分支的關聯
2016-01-04 更新
標簽管理:發布一個版本時,通常會在版本庫中打上一個標簽,這樣就唯一確定了打標簽時刻的版本,將來無論什么時候,取某個標簽的版本,就是把那個打標簽的時刻的歷史版本取出來
Git的標簽雖然是版本庫的快照,但其實就是只想某個comit的指針(跟分支很像,但是分支可以移動,而標簽不能移動)
創建標簽
1,首先切換到需要打標簽的分支上,
$ git branch
$ git checkout master
2,然后敲擊 git tag name 就可以打一個標簽
$ git tag v1.0
3,查看所有標簽
$ git tag
4,默認標簽是打在最新提交的commit上的。有時候忘記打了,比如今天周五了,周一的標簽還沒有打,怎么辦
方法是找到歷史提交的commit,然后打上就可以了
$ git log --pretty=oneline --abbrev-commit
然后找到對應的分支,打上就可以,比如這里對 "1127 change",打標簽,就這樣做
$ git tag v0.01 2c8de67
5,注意標簽不是按時間排序的,而是按字母,可以用git show tagname 查看標簽信息
6,還可以創建帶有說明的標簽, -a指定標簽名, -m說明文字
$ git tag -a v0.1 -m "version 0.1 release" 98e56b0
$ git show v0.1 // 再查看一下
7,還可以通過-s用私鑰簽名一個標簽
$ git tag -s v0.2 -m "signed version 0.2 release" 7478f13
簽名采用PGP簽名,因此,必須先安裝gpg,否則就會報錯,
若報錯,請參考GnuPG幫助文檔配置key
// 關於這個可以查看這個http://wenku.baidu.com/link?url=zGiQnJuni2FQFfmeRuXa_novFIQrElE8esw7bB-P5t7jJNFw_2_3vhfBIIrmmJIUWbW5H1CYfh14PdhkNkH2Xx2MbWGvaqN9Yofh28n0vtG###
// windows下好像叫這個 Gpg4win ,
8,小結:
(1)$ git tag tagname 用於創建一個標簽,默認為HEAD,也可以指定一個commit ID
(2)-a tagname -m "balabala..." 可以指定標簽信息
(3)-s tagname -m "balabala..." 可以用PGP簽名標簽
(4)$ git tag 可以查看所有標簽
2016-01-05 更新
操作標簽
1,標簽打錯了,也可以刪除。創建的標簽都只存儲在本地,不會自動推送到遠程,所以,打錯的標簽可以在本地安全的刪除
$ git tag -d v0.1
2,要推送某個標簽到遠程,
$ git push origin v1.0
3,一次性推送全部尚未推送到遠程的本地標簽
$ git push origin --tags
4,推送到遠程后的標簽刪除起來比較麻煩,先從本地刪除
$ git tag -d v0.9
然后從遠程刪除
$ git push origin :refs/tags/v0.9
可以登錄GitHub查看有沒有刪除標簽
20160106
第一篇就說明了是參看廖雪峰老師的東西做的筆記,突然間好多人看了,好激動。還是把廖雪峰老師的主頁放上來,http://www.liaoxuefeng.com/
廖老師的東西比較權威靠譜一點