之前也寫過類似的兩篇文章:
- github的pull Request使用
- github上fork原項目,如何將本地倉庫代碼更新到最新版本?
不同之處在於合入方式,之前寫的是按照"merge pull request“合入,在最近開發中,發現這樣始終會多出一個commit,在fork倉庫同步的時候又會多出一個commit,來回多了兩個commit,並且commit log看起來也會交錯在一起,不便於閱讀。。諸如下圖
通過本篇文章操作后,commit log如下圖,清晰整潔。
------進入正題-------
圖解全流程
詳細步驟
1. fork倉庫
2. clone fork倉庫到本地
3. 關聯upstream原倉庫
在fork本地倉庫輸入下面命令進行關聯:
git remote add upstream <原倉庫github地址>
查看倉庫地址:
git remote -v
4. fork本地倉庫commit+push
修改完文件后執行下面命令:
git add .
git commit -m 'message'
// push推送到fork遠程倉庫
git push origin master
5. 發起Pull Request
在fork遠程倉庫,點擊Pull Request->New Pull Request,進入以下截圖頁面
base repository為原倉庫的某個分支,
head repository為fork倉庫發某個分支
head的某個分支代碼合到base的某個分支
6. 原倉庫合入PR
進入原倉庫的Pull requests可看到剛才發起的PR
github pull request介紹:https://help.github.com/cn/github/collaborating-with-issues-and-pull-requests/merging-a-pull-request
三種合入方式介紹:
- Merge pull request:將fork倉庫的每一次提交都合並到原倉庫,並且還產生了一個merge commit log。
- Squash and merge:將多個commit合並為一個commit添加到原倉庫中,會產生一個新的commit id。
- Rebase and merge:將fork倉庫的每一次提交都rebase到原倉庫,但github的rebase行為與git rebase略有偏差。GitHub上的變基和合並始終會更新提交者信息並創建新的提交,也就是產生新的commit id。
選擇“Squash and merge”進行合入
合入后會產生如下圖的一條commit:
這條commit包含了發起PR時fork倉庫的幾個commit
7. fork本地倉庫更新
原倉庫合入后產生了一條新的commit id,為了保持一致,需要在fork本地倉庫進行更新
// 更新並合並原倉庫的master分支
git pull --rebase upstream master
更新前:test4和test5為兩次commit
更新后:test4和test5合並為fork原倉庫通過squash and merge產生的commit
8. 修改文件后,再commit + push
這時,push推送到遠程倉庫,需要進行強制覆蓋fork遠程倉庫。因為fork遠程倉庫仍是test4、test5兩次提交的commit,而本地倉庫已經更新同步為原倉庫的合並commit。不強制覆蓋則會在push時提示需要更新與遠程分支同步。
git push origin master --force
到這里!!!fork、clone、commit、push、pull整個流程已完成。
不斷的學習!不斷的爬坑!不斷的總結!寫出更優質的代碼!