Pull Request和Pull是兩碼事。
自己的倉庫或者自己具有管理權限的倉庫,可以直接clone,pull,修改,push;別人的倉庫,必須先fork成自己的倉庫,然后再clone,pull,修改,push,最后再pull request。
6.1 Pull Request的概要
Pull Request是自己修改源代碼后,請求對方倉庫采納該修改時采取的一種行為。
6.2 發(fā)送 Pull Request前的準備
Branch
要養(yǎng)成創(chuàng)建特性分支之后再修改代碼的好習慣
在GitHub上發(fā)送Pull Request時,一般都是發(fā)送特性分支。這樣一來,Pull Request就擁有了更明確的特性(主題)。讓對方了解自己修改代碼的意圖,有助于提高代碼審查的效率。
查看clone出的倉庫的分支
開頭加了“remotes/origin/”的是GitHub端倉庫的分支。
網(wǎng)站中顯示的HTML位于/origin/gh-pages分支。雖然通常情況下最新版代碼都位于master分支,但由于本次我們使用了GitHub Pages,所以最新代碼位于gh-pages分支。
git branch -a
創(chuàng)建自己的特性分支
在clone出的倉庫中,創(chuàng)建自己的特性分支,用于提交自己修改的代碼。
git checkout -b branch-name
添加代碼
在clone出的本地倉庫中,添加自己的代碼。
提交修改
用git diff命令查看修改是否已經(jīng)正確進行。
git diff
確認修改后,提交至本地倉庫。
git add file-name
git commit -m "My commit information"
創(chuàng)建遠程分支
要從GitHub發(fā)送Pull Request,GitHub端的倉庫中必須有一個包含了修改后代碼的分支?,F(xiàn)在就來創(chuàng)建本地work分支的相應遠程分支。
git push origin branch-name
6.3 發(fā)送Pull Request
查看分支間的差別,點擊Compare按鈕查看。查看時,保證目標倉庫及其分支在左邊,自己的倉庫及其分支在右邊。這樣發(fā)送Pull Request時,才是發(fā)送給目標倉庫。
確認想要發(fā)送的Pull Request的內容差別無誤后,請點擊Create Pull Request。隨后顯示的表單用于填寫請求對方采納的評論。
確認沒有問題后,點擊Create Pull Request按鈕。這樣一來,Pull Request的目標倉庫中就會新建Pull Request和Issue,同時該倉庫的管理者會接到通知。
6.4 讓Pull Request更加有效的方法
在開發(fā)過程中發(fā)送Pull Request進行討論
在GitHub上,我們可以盡早創(chuàng)建Pull Request,從審查中獲得反饋。只要在想發(fā)起討論時發(fā)送Pull Request即可,不必等代碼最終完成。
向發(fā)送過Pull Request的分支添加提交時,該提交會自動添加至已發(fā)送的Pull Request中。
另外要注意,不要在Pull Request中添加無關的修改。處理與主題無關的作業(yè)請另外創(chuàng)建分支。
明確標出“正在開發(fā)過程中”
為了防止開發(fā)到一半的Pull Request被誤合并,一般都會在標題前加上“WIP”字樣,表示仍在開發(fā)過程中。等所有功能都實現(xiàn)之后,再消去這個前綴。
WIP = Work In Progress
不進行Fork直接從分支發(fā)送Pull Request
一般來說,在GitHub上修改對方的代碼時,需要先將倉庫Fork到本地,然后再修改代碼,發(fā)送Pull Request。
如果用戶對該倉庫有編輯權限,則可以直接創(chuàng)建分支,從分支發(fā)送Pull Request。團隊開發(fā)時不妨為每一名成員賦予編輯權限,免去Fork倉庫的麻煩。這樣,成員在有需要時就可以創(chuàng)建自己的分支,然后直接向master分支等發(fā)送Pull Request。
6.5 倉庫的維護

對目標倉庫(原倉庫),在GitHub上進行Fork,然后clone。
git clone git@github.com:自己的用戶名/倉庫名.git
給原倉庫設置名稱,例如upstream。
git remote add upstream git@github.com/原倉庫所有者用戶名/倉庫名.git
獲取最新數(shù)據(jù)。從遠程倉庫實際獲?。╢etch)最新源代碼,與自己倉庫的分支進行合并。
git fetch upstream
git merge upstream/master