如果一個(gè)開源項(xiàng)目派生出另外的項(xiàng)目夯辖,通常意味著項(xiàng)目的分裂和開發(fā)團(tuán)隊(duì)的削弱茁帽,而GitHub中的項(xiàng)目派生則不會(huì),而且正好相反因惭,GitHub中的項(xiàng)目派生是項(xiàng)目壯大的體現(xiàn)岳锁。所有的派生項(xiàng)目都會(huì)有鏈接指向原始項(xiàng)目,派生項(xiàng)目沒有獨(dú)立的缺陷追蹤系統(tǒng)(ISSUE)蹦魔,而是必須利用創(chuàng)建者本人的項(xiàng)目中的缺陷追蹤系統(tǒng)激率。至于在派生項(xiàng)目中創(chuàng)建的提交,可以非常方便地利用GitHub的Pull Request工具向原始項(xiàng)目的維護(hù)者發(fā)送Pull Request勿决。
版本庫派生
下面就以用戶gotgithub身份乒躺,訪問版本庫 https://github.com/gotgit/gotgit/ ,添加新的勘誤低缩。
點(diǎn)擊項(xiàng)目名稱右側(cè)的Fork按鈕嘉冒,便在gotgithub用戶自己的托管空間下創(chuàng)建項(xiàng)目派生. 訪問派生后的版本庫,會(huì)發(fā)現(xiàn)和派生前的幾乎相同咆繁,除了沒有缺陷跟蹤(ISSUE)
現(xiàn)在gotgithub用戶就在本地派生的版本庫中提交讳推。
- 克隆 gotgithub/gotgit 版本庫。
$ git clone git@github.com:gotgithub/gotgit.git
$ cd gotgit
- 編輯文件玩般。
$ vi README.md
$ git diff
- 提交修改
$ git add -u
$ git commit -m "Fixed #3: should be 項(xiàng)目, not 項(xiàng)."
- 推送提交到GitHub银觅。
$ git push
訪問GitHub上的派生項(xiàng)目頁面,會(huì)看到在master分支創(chuàng)建的提交坏为。
Pull Request
那么如何能夠讓gotgit原始項(xiàng)目的創(chuàng)建者知道這個(gè)派生項(xiàng)目及新的提交呢究驴?GitHub提供的工具就是“Pull Request”
點(diǎn)擊New pull request按鈕進(jìn)入Pull Request創(chuàng)建界面慨仿。在彈出的Pull Request創(chuàng)建界面中查看所包含的提交. 點(diǎn)擊“Create pull request”,填寫Pull Request的標(biāo)題和內(nèi)容纳胧,完成Pull Request的創(chuàng)建。
當(dāng)Pull Request發(fā)出后帘撰,項(xiàng)目gotgit的開發(fā)者會(huì)收到通知郵件. 點(diǎn)擊郵件中的URL鏈接跑慕,以項(xiàng)目gotgit的開發(fā)者(如ossxp-com)身份登錄, 可以向Pull Request追加評(píng)論,或者關(guān)閉此Pull Request摧找。GitHub如果檢測(cè)到Pull Request中包含的提交可以直接合并核行,會(huì)顯示自動(dòng)合并的提示信息,點(diǎn)擊“Confirm Merge”按鈕即完成Pull Request中所含提交的自動(dòng)合并蹬耘。自動(dòng)合并完成后芝雪,Pull Request頁面下方會(huì)以評(píng)論的形式出現(xiàn)相關(guān)提示,并自動(dòng)關(guān)閉Pull Request
手工合并
下面就演示一下當(dāng)收到他人的Pull Request后综苔,該如何手動(dòng)合并惩系。實(shí)際上在很多情況下,Pull Request所含提交有可能造成合并沖突如筛,那樣的話GitHub不再堡牡、也不能提供自動(dòng)合并功能,就必須采用手工合并的方式杨刨。
- 將Pull Request發(fā)出者的派生版本庫添加為一個(gè)新的源晤柄。
例如收到來自gotgithub用戶的Pull Request,不妨以gotgithub為名添加新的源妖胀。
$ git remote add gotgithub https://github.com/gotgithub/gotgit.git
- 此時(shí)版本庫中有兩個(gè)源芥颈,一個(gè)克隆時(shí)自動(dòng)建立的origin,另外一個(gè)就是新增加的gotgithub赚抡。
$ git remote -v
gotgithub https://github.com/gotgithub/gotgit.git (fetch)
gotgithub https://github.com/gotgithub/gotgit.git (push)
origin git@github.com:gotgit/gotgit.git (fetch)
origin git@github.com:gotgit/gotgit.git (push)
- 獲取遠(yuǎn)程版本庫gotgithub的分支和提交爬坑。
$ git fetch gotgithub
From https://github.com/gotgithub/gotgit
* [new branch] gh-pages -> gotgithub/gh-pages
* [new branch] master -> gotgithub/master
- 現(xiàn)在除了本地分支master外,還有若干遠(yuǎn)程分支怕品,如下:
$ git branch -a
* master
remotes/gotgithub/gh-pages
remotes/gotgithub/master
remotes/origin/HEAD -> origin/master
remotes/origin/gh-pages
remotes/origin/master
- 將遠(yuǎn)程分支remotes/gotgithub/master(可簡寫為gotgithub/master)合并到當(dāng)前分支中妇垢。
$ git merge gotgithub/master
Updating 00c6c4b..7ecdfe7
Fast-forward
errata.mkd | 1 +
1 files changed, 1 insertions(+), 0 deletions(-)
- 查看提交說明,看到此次合并沒有產(chǎn)生不必要的合并提交肉康。
$ git log --graph -2
* commit 7ecdfe7451412cfb2e65bb47c12cf2162e21c841
| Author: Wang Sheng wangsheng@ossxp.com
| Date: Tue Aug 16 10:17:53 2011 +0800
|
| Fixed #3: should be 項(xiàng)目, not 項(xiàng).
|
* commit 00c6c4bfab9824bd967440902ce87440f9e87852
| Author: Jiang Xin worldhello.net@gmail.com
| Date: Wed Aug 3 11:50:31 2011 +0800
|
| Change font color for stronger text from red to brown.
- 將合并推送到GitHub版本庫中闯估。
$ git push