我認爲開源社區中有不少優秀的資源,而且能夠幫助進階中的程序員提升編程能力和水平。因此,我發起了《HelloGitHub》月刊,同時開始編寫《讓 Python 帶你進入開源的世界》系列,但願更多的小夥伴加入到開源的社區當中。我我的能力有限,分享的知識都是經過我認真的收集、整理、總結、編寫,若是認爲本文還不錯,那就歡迎持續關注,並加入到其中 😁。下面就是正文了:html
本篇分爲三個階段:領進門(新手)、搜腸刮肚的建議(進階)、後續的我的修行,因此能夠根據自身狀況經過下面的目錄進行選階段閱讀。python
建議: 若是是新手的話,請依次完成每一部分的實踐經過後,再學習下一部分。git
Git 是一個「分佈式版本管理工具」,簡單的理解版本管理工具:你們在寫東西的時候都用過「回撤」這個功能,可是回撤只能回撤幾步,假如想要找回我三天以前的修改,光用「回撤」是找不回來的。而「版本管理工具」能記錄每次的修改,只要提交到版本倉庫,你就能夠找到以前任什麼時候刻的狀態(文本狀態)。程序員
Git 是一個「分佈式版本管理工具」,這裏須要理解分佈式。也就是每一個用戶會有一個本地倉庫,同時還有一個遠程倉庫。而 GitHub 就是用戶遠程倉庫的託管網站。不一樣用戶能夠複製同一個倉庫的代碼到本地,而後開發某一部分功能,完成後提交請求到遠程倉庫。若是合併成功,後面用戶再獲取、更新該遠程倉庫的代碼,就會包含你開發的功能,從而達到多個用戶同時開發不一樣模塊互不影響的效果。github
例如:Gitlab、Bitbucket、自搭建的 Git 服務器等,都是一樣的道理。編程
因爲篇幅問題,我把 GitHub 入門 部分提早寫出來了,能夠在後面的實踐部分閱讀。vim
參考我寫的 GitHub 入門教程,還有我推薦的 Git 極簡入門教程ruby
練習:服務器
我會及時給出回覆。若是完成了上述步驟並經過,你就能夠閱讀下面的章節了。編輯器
本部分翻譯修改自:project-guidelines
首先,不論是項目的管理者或貢獻者,都須要瞭解的一些基本規則:
從 develop
分支建立新的分支
緣由:
這樣能夠確保 master 分支老是沒有問題的,從而能夠直接運行或者發佈。同時由於 develop 分支是開發的主分支,能夠確保全部子分支都是繼承於同一分支開發。
建立 feature
分支開發新的功能
緣由:
由於這樣全部的工做都是在專用分支(feature)而不是主分支上,使得彼此的工做是徹底隔離的。它容許你隨意提交請求而不會影響其餘人的開發。你能夠實時迭代你開發的功能,即便這些代碼是未完成,也不會污染和影響公共分支。
經過 Pull Request 方式提交代碼到 develop
或 master
,不要直接 Push
緣由:
由於 PR 的方式能夠通知全部團隊成員你已完成該模塊的功能,還能夠輕鬆地對代碼進 Review,並能夠在該 PR 下討論功能和交流。
同步本地的 develop
分支到最新,而後經過 rebase
命令合併到你的 feature
分支,最後提交 PR
緣由:
由於,在
feature
分支上,經過 rebase 命令合併develop
分支是不會產生額外的 commit(假設沒有衝突),從而能夠獲得一個乾淨整潔的提交歷史。
提交經過後刪除本地和遠程的 feature
分支(項目內成員)
緣由:
由於,分支過多會形成沒必要要的混亂和重複提交,要記住 feature 分支只存在於開發進行時。
在提交 Pull Request 以前,確保你的分支代碼運行沒問題而且經過測試(包括代碼風格檢測)
緣由:
你將要提交代碼到穩定的分支,若是你的功能分支測試失敗,那麼一樣的會致使目標分支運行、測試失敗。與此同時,PR 以前你還須要檢測代碼是否有代碼風格檢測,這樣作的目的是爲了讓整個項目的代碼更加易讀、統一。
記得設置 .gitignore
文件
緣由:
有了 .gitignore 文件,就能夠把運行過程當中或者 ide 產生的並非項目自己的文件過濾掉。
把 develop
和 master
分支設置爲保護
緣由:
它保護你的生產和開發分支免受意外和不可挽回的錯誤。更多現詳情能夠閱讀,GitHub 關於 protected 的說明
工做流分爲:
GitHub 上爲開源項目提交代碼就用:非項目內成員工做流
工做中大多使用:項目內成員工做流
兩種工做流,相差的並很少,推薦先學習 工做流1。
由於不是項目中的成員,沒法直接修改項目中的代碼。因此須要先拷貝(Fork)項目到本身的遠程倉庫中(GitHub帳號下),而後基於本身克隆過來的項目開發新的功能,最後提交 PR。
project_url:想要貢獻代碼的項目地址(源地址)
fork_project_url:克隆到本身遠程倉庫的項目地址
sh 項目首頁 "Fork"
sh git clone fork_project_url
sh git remote add <origin-name> project_url
develop
分支sh git checkout develop
sh git checkout -b <branchname>
保存你的修改(開發、修復bug)
sh git add git commit -a
緣由:
git commit -a
命令中的-a
參數是開啓編輯器編輯 commit 信息,會在後面有詳細的說明。
sh git checkout develop git pull --rebase <origin-name> develop
把最新的 develop 分支經過 rebase 命令合併到 feature 分支和對應的遠程分支
sh git checkout <branchname> git rebase -i --autosquash develop
緣由:
你能夠經過
--autosquash
命令把多個 commit 壓縮成一個 commit,這樣是的歷史更加整潔,一個功能就一個commit。經過 rebase 在本地就把衝突解決好,以免提交 PR 時才發現衝突,致使提交失敗。
sh git add <file1> <file2> ... git rebase --continue
Rebase 命令會修改歷史,因此你 push 時可能會須要加上 -f
強制修改歷史。若是有其餘人也在你的分支上開發,就使用 --force-with-lease
減小破壞
sh git push -f
緣由:
由於只是修改 feature 分支的歷史,並且每一個 feature 是獨立(理論上只有一我的開發),因此在 push 時加上 -f 參數並不會影響其餘人的工做。
如上述步驟都已完成,刪除你本地和遠程的 feature 分支
git branch -d <branchname> git push origin --delete <remote-branchname>
這種工做流,更適合用在工做中。
sh git clone project_url
develop
分支sh git checkout develop
sh git checkout -b <branchname>
保存你的修改(開發、修復bug)
sh git add git commit -a
緣由:
git commit -a
命令中的-a
參數是開啓編輯器(vim基本操做)編輯 commit 信息,會在後面有詳細的說明。
sh git checkout develop git pull --rebase
把最新的 develop 分支經過 rebase 命令合併到 feature 分支和對應的遠程分支
sh git checkout <branchname> git rebase -i --autosquash develop
緣由:
你能夠經過
--autosquash
命令把多個 commit 壓縮成一個 commit,這樣是的歷史更加整潔,一個功能就一個commit。經過 rebase 在本地就把衝突解決好,以免提交 PR 時才發現衝突,致使提交失敗。
sh git add <file1> <file2> ... git rebase --continue
Rebase 命令會修改歷史,因此你 push 時可能會須要加上 -f
強制修改歷史。若是有其餘人也在你的分支上開發,就使用 --force-with-lease
減小破壞
sh git push -f
緣由:
由於只是修改 feature 分支的歷史,並且每一個 feature 是獨立(理論上只有一我的開發),因此在 push 時加上 -f 參數並不會影響其餘人的工做。
如上述步驟都已完成,刪除你的本地 feature 分支
sh git branch -d <branchname> git push origin --delete <remote-branchname>
制定良好的建立 commit 規範,並堅持使用,使得與他人合做更容易。下面是一些經驗和建議:
把 commit 信息分爲 標題和內容兩個部分,二者之間要有個空行
緣由:
Git 可將你的提交消息的第一行作爲摘要
標題控制在 50 個字符之內,內容最多不超過 72 個字符
緣由:
commit 信息儘量簡潔和精準
內容中解釋爲何要有此次提交、如何解決問題、可能影響的地方
緣由:
若是有需求、issues地址、能夠附上。更多詳情
本節就一個實踐內容,可是並非很簡單,請仔細閱讀並遵照:
向個人 test_project 項目的 develop 分支提交一個PR,要求以下:
README.md
文件中新啓一行,增長內容爲上一個 commit 的 id 號提示: 可能會由於接受提交順序而產生衝突,如遇到衝突,要解決完衝突後從新提交。如遇問題,可參考 「4. 更多 Git 使用技巧」。
俗話說:師傅領進門修行靠我的。
用好一個工具或技能最好的方式就是不斷的使用,使用中必然會出現問題。當你解決了足夠多的問題,你也就成爲老司機了。
遇到問題:
最後,請拿走這本祕籍:git-tips,😄
本教程確定還有不足的地方或者你以爲好的地方,歡迎自由留言積極討論,但願這個系列可以幫助到更多的小夥伴!