git 入门教程之协同开发
前面我們已經介紹過遠程倉庫的相關概念,不過那時并沒有深入探討,只是講解了如何創建遠程倉庫以及推送最新工作成果到遠程倉庫,實際上遠程倉庫對于團隊協同開發很重要,不僅僅是團隊協同開發的基礎,也是代碼備份的保障手段,現在我們先簡單回憶下相關概念,以便為接下來的協同開發做好鋪墊!
遠程倉庫和遠程分支
遠程倉庫
遠程倉庫其實并不復雜,實際上只是本地電腦上的本地倉庫在另一臺遠程電腦的備份而已.
相對本地倉庫來說遠程電腦上的版本庫自然就是遠程倉庫,遠程倉庫使得我們的版本庫更加安全,畢竟遠程電腦可不是一般的電腦,出錯的概率比我們平時工作所使用的電腦概率要小得多,這樣一來即使不小心丟失了本地倉庫的全部數據,只要遠程倉庫沒有丟失,那我們就可以通過遠程倉庫重新取回最新數據!
還有一點,遠程倉庫讓代碼社交化,因為大家有了一致途徑來訪問遠程倉庫,團隊也好或者陌生人也罷,只有你愿意,他們就可以獲取遠程倉庫的最新代碼并參與開發,這也是 github 的一大亮點!
遠程分支
回顧好遠程倉庫的概念后,我們再來講一下本地倉庫的遠程分支是什么意思?
當前你正在工作的電腦上存儲的是本地倉庫,如果沒有遠程倉庫的支持,只能一個人鼓搗,別人無法共享你的工作成果,現在加入了團隊開發流程,自然不再一個人獨自開發,需要和團隊其他人協同開發,共享開發成果.
所以本地倉庫必然保存著遠程倉庫的基本信息,只有區分好自己的工作成果和公共成果,才能不亂套,又能做到信息及時共享.
實際上,在項目初期剛剛拷貝遠程倉庫(git clone)時,git 已經默認在本地倉庫創建一個遠程分支(origin/master),本地修改提交首先都是在本地倉庫完成的,比如 git add,git commit 等命令,如果需要發布你的工作成果,那么就需要使用 git push origin <branch> 命令推送到遠程倉庫,這里的 origin 指的就是遠程倉庫名稱(因為最初大家都是先從遠程倉庫克隆下來的,所以遠程倉庫存儲的項目相當于原始項目,故而叫origin).
git clone 命令幫助本地倉庫的 master 分支和遠程倉庫的 master 分支建立了關聯,一般稱遠程倉庫名稱為 origin.
查看遠程倉庫信息 : git remote 或 git remote -v
# 查看遠程倉庫名稱 $ git remote origin# 查看遠程倉庫詳情 : 拉取和推送鏈接 $ git remote -v origin git@github.com:snowdreams1006/git-demo.git (fetch) origin git@github.com:snowdreams1006/git-demo.git (push) $本地分支推送到遠程倉庫 : git push origin <branch>
本地倉庫和遠程倉庫的分支理論上應該一一對應,本地倉庫的主干分支叫做 master ,而遠程倉庫也有相應的分支叫做 master ,這種映射關系是使用 git clone 命令時默認生成的,也是推薦的做法.
一般來說,本地倉庫的分支推送到遠程倉庫指的就是推送到遠程倉庫同名的分支上,例如 git push origin master 意思是: 推將本地倉庫的 master 分支推送到遠程倉庫的 master分支,當然你也可以推送其他分支到相應的遠程分支上.
按照之前約定的分支管理策略來說,master 分支用于生產環境部署,dev 分支用于收集開發成果,feature 分支用于開發具體功能分支,既然如此,那這些本地分支哪些需要同步推送到遠程倉庫就比較清晰了!
- 推送本地 master 分支到遠程倉庫的 master 分支 : git push origin master
- 推送本地 dev 分支到元層倉庫的 dev 分支 : git push origin dev
正常來說,本地倉庫的 master 分支應該領先遠程倉庫 origin 上的 master 分支若干個版本.
一旦我們已經將本地分支上的工作成果推送到遠程倉庫上相應分支時,本地倉庫和遠程倉庫這時候就保持一致了.
$ git status On branch master Your branch is up to date with 'origin/master'.nothing to commit, working tree clean $遠程倉庫下載到本地分支 : git fetch
遠程倉庫的操作可以簡單歸納為兩部分: 上傳和下載.
本地倉庫推送到遠程倉庫是上傳,而遠程倉庫拉取到本地倉庫就是下載.
團隊多人協作開發時,大家都會定期或不定期往 master 或 dev 等分支上推送各自的更改,相應的我們就需要下載別人的最新工作成果.
現在模擬其他伙伴正在往 master 分支上推送更改,最好在另一個電腦另一個賬戶,當然模擬的話也可以是同一個電腦下其他目錄,或者最簡單的方式,直接登錄 github 更改 master 分支上某個文件內容,簡單起見,我們采用最后一種方式.
其他伙伴已往遠程倉庫上的 master 分支提交了新的版本: 創建 git-remote.txt 文件
現在我們想要下載其他人的最新工作成果,接下來讓我們看看本地倉庫的 master 還能和遠程倉庫的 master 分支保持一致嗎?
# 下載遠程倉庫的 `master` 分支 $ git fetch origin master remote: Enumerating objects: 4, done. remote: Counting objects: 100% (4/4), done. remote: Compressing objects: 100% (2/2), done. remote: Total 3 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (3/3), done. From github.com:snowdreams1006/git-demo* branch master -> FETCH_HEADdcce09c..10942ff master -> origin/master $執行 git fetch 命令后,遠程倉庫上的最新提交記錄已經下載到本地倉庫,同時更新了本地倉庫的遠程分支origin/master ,值得注意的是本地倉庫的 master 分支并沒有更新!
那你可能會有疑問了,我想要的結果是下載其他人的最新工作成果,怎么我本地倉庫的 master 分支并沒有更新呢?
# 查看工作區 $ ls LICENSE README.md test.txt# 查看版本庫狀態 $ git status On branch master Your branch is behind 'origin/master' by 1 commit, and can be fast-forwarded.(use "git pull" to update your local branch)nothing to commit, working tree clean $既然 git fetch 并沒有更新本地倉庫的 master 分支,那它到底做了哪些工作呢?
git fetch 會做的事情
實際上, git fetch 完成了僅有的但是很重要的兩步操作:
- 從遠程倉庫下載本地倉庫中缺失的提交記錄
- 更新本地倉庫的遠程分支(比如origin/master)
通過上述兩步操作完成的效果是: 將本地倉庫中的遠程分支更新成了遠程倉庫相應分支最新的狀態.
遠程分支實際上是反映了遠程倉庫在你最后一次與它通信時的狀態,而git fetch 就是你與遠程倉庫通信的方式了!
git fetch 不會做的事情
git fetch 并不會改變你本地倉庫的狀態,所以也就不會更新你的 master分支,自然也不會修改你磁盤上的文件.
理解這一點很重要,因為許多開發人員誤以為執行了 git fetch 以后,他們本地倉庫就與遠程倉庫同步了.
實際上它可能已經將進行這一操作所需的所有數據都下載了下來,但是并沒有修改你本地的文件.
既然本地倉庫的遠程分支已更新,那么想要更新本地倉庫的 master 分支該如何做呢?很簡單,可以 git merge 啊!
遠程倉庫更新到本地分支 : git pull
其實通過 git fetch 命令我們已經下載了遠程倉庫的最新版本,只不過還沒有合并到本地倉庫而已,如何合并分支相信大家已經輕車熟路了,有很多方法:
- git merge origin/master
- git rebase origin/master
- git cherry-pick origin/master
實際上,先抓取更新(git fetch)再合并(git merge)這個流程很常用,因此 git 是有專門的命令來完成這兩步操作的,這就是拉取更新git pull --- 剛好與推送更新 git push 相反!
# 拉取最新版本 $ git pull Updating dcce09c..10942ff Fast-forwardgit-remote.txt | 1 +1 file changed, 1 insertion(+)create mode 100644 git-remote.txt# 查看版本庫狀態 $ git status On branch master Your branch is up to date with 'origin/master'.nothing to commit, working tree clean# 查看工作區內容: 文件已更新 $ ls LICENSE README.md git-remote.txt test.txt $團隊協作
掌握了遠程倉庫和遠程分支的相關概念后,現在開始真正模擬團隊協作開發了,為了簡單起見,仍然以直接操作 github 上的 master 分支為例說明如何協同開發.
(1). 其他人已往遠程倉庫推送2個版本
(2). 你正在本地倉庫提交1個版本
$ echo "learn teamwork" >> test.txt $ git commit -am "learn teamwork" [master f971647] learn teamwork1 file changed, 1 insertion(+) $(3). 你推送到遠程倉庫前先拉取最新版本
# 拉取最新版本,并嘗試合并 $ git pull remote: Enumerating objects: 8, done. remote: Counting objects: 100% (8/8), done. remote: Compressing objects: 100% (5/5), done. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 Unpacking objects: 100% (6/6), done. From github.com:snowdreams1006/git-demo10942ff..612e08a master -> origin/master Merge made by the 'recursive' strategy.git-remote.txt | 2 ++1 file changed, 2 insertions(+)# 查看版本庫狀態 $ git status On branch master Your branch is ahead of 'origin/master' by 2 commits.(use "git push" to publish your local commits)nothing to commit, working tree clean# 查看其他人工作成果 $ cat git-remote.txt git remote git clone git commit -am "fake second teamwork"# 查看自己即將推送的工作成果 $ cat test.txt add test.txt see https://snowdreams1006.github.io/git/usage/remote-repository.html learn git branch see https://snowdreams1006.github.io/git/usage/branch-overview.html git commit c1 git commit c2 and c3 git checkout -b dev fast forward not recommend Happy coding learn git stash learn git rebase learn teamwork $(4). 你將本地倉庫更改內容推送到遠程倉庫
# 推送到遠程倉庫 $ git push origin master Counting objects: 5, done. Delta compression using up to 4 threads. Compressing objects: 100% (5/5), done. Writing objects: 100% (5/5), 564 bytes | 564.00 KiB/s, done. Total 5 (delta 3), reused 0 (delta 0) remote: Resolving deltas: 100% (3/3), completed with 3 local objects. To github.com:snowdreams1006/git-demo.git612e08a..8fe5aba master -> master $現在前往 github 網站確認我們已經推送成功,我們的工作成果和其他人的工作成果同時存在于遠程倉庫中,這樣就完成了一次團隊協同開發的案例.
現在簡單回顧一下整個協同開發流程:
小結
- 查看遠程倉庫信息: git remote -v
- 本地倉庫推送到遠程倉庫: git push origin <branch>
- 遠程倉庫抓取到本地倉庫: git fetch
- 遠程倉庫拉取到本地倉庫: git pull 相當于 git fetch 和 git merge
- 本地創建和遠程倉庫一致的分支: git checkout -b <branch> origin/<branch>,本地和遠程分支名稱最好一直,比如本地 master 和 遠程 origin/master,本地 dev 和遠程 origin/dev
- 本地分支和遠程分支建立關聯: git branch --set-upstream <branch> origin/<branch> ,足夠任性的話,本地 dev 可以關聯遠程 remote-dev 等,不過建議名稱最好一致.
- 團隊協同開發時,不僅平時要定期拉取(git pull),推送到遠程倉庫前更應先拉取(git pull)再推送(git push),如出現沖突,解決沖突后再推送.
轉載于:https://www.cnblogs.com/snowdreams1006/p/10589700.html
總結
以上是生活随笔為你收集整理的git 入门教程之协同开发的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 第十届蓝桥杯(含题目文件下载)
- 下一篇: 测试面试话题5: 如何不漏测