二、Git多人开发:不同人修改了不同文件如何处理
@Author:Runsen
上面我們創建了一個組織的倉庫。分別有小A和小B。我在電腦上給小A和小B不同的工作位置。
小A在我的Window系統,小B在我的Ubuntu虛擬機中,這是因為我在Windows系統設置了SSH Key ,一個操作系統就只能存在一個用戶,所以我選擇Ubuntu當作一個小用戶
下面是ubuntu系統,小B創建SSH key,將Git本地倉庫與服務器端倉庫的關系起來。
maoli@ubuntu:~$ ssh-keygen -t rsa -C "liurunsen@sina.cn" Generating public/private rsa key pair. Enter file in which to save the key (/home/maoli/.ssh/id_rsa): Created directory '/home/maoli/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /home/maoli/.ssh/id_rsa. Your public key has been saved in /home/maoli/.ssh/id_rsa.pub. The key fingerprint is: SHA256:dqEXZWc0RIpUJTgYEer8CeeKb9KsJMPPFl7y6wgK5bc liurunsen@sina.cn The key's randomart image is: +---[RSA 2048]----+ | +=.o==O | | ...o+ = . | | . +.. | | o . o | | . + S o | | + o .* + | |. *.oB + | |.. O++=. | |. .E*=. | +----[SHA256]-----+ maoli@ubuntu:~$ cat /home/maoli/.ssh/id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDsgLLqgMLyhuAdra9UhRd8DcPpRw3Miimcx3z2vHByrR9kLnopDogJ7zBC4P88bNs/G5Kt+KvADtoqMuHzFe80GTfNZjUIAFsO1duJv4i+9yTJa7E0VVRtKXCv8YVh7UG3aAqeaTE0J0/kc/O5bGrBEK0umw6Z/+2xgVvozvar0lXGvGK2u8rFFTgok1Bq8t0nbhnZ+xMOvYgWnIzdE9rOnHb0a9bnS/i8s8yAil5/ODiTkdTXazQJJl1WqeqKsXq/xPoqsZQ/2QyOMIwvyMXvQTsz11uxm2nhw3bUtvpu2ZVEdDjgePby6iNphLzYiCpjnVJG0GVxW0V0gd0o8LBz liurunsen@sina.cn復制生成后的 ssh key,通過小B的倉庫主頁 「管理」->「部署公鑰管理」->「添加部署公鑰」 ,添加生成的 public key 添加到倉庫中。
下面就是在ubuntu克隆倉庫就可以了。
maoli@ubuntu:~$ mkdir B maoli@ubuntu:~$ cd B maoli@ubuntu:~/B$ git clone https://gitee.com/MaoliRUNsen/muli_person_test Cloning into 'muli_person_test'... Username for 'https://gitee.com': Maolicom Password for 'https://Maolicom@gitee.com': remote: Enumerating objects: 6, done. remote: Counting objects: 100% (6/6), done. remote: Compressing objects: 100% (6/6), done. remote: Total 6 (delta 0), reused 0 (delta 0), pack-reused 0 展開對象中: 100% (6/6), 完成. Checking connectivity... done.自此,Windows和ubuntu都有對應的倉庫,我們可以想象成有兩個開發者在干活。下面就正式開始本chat的重點。
多人合作工作原理 :分支
下面將進行原理介紹: 如何進行多人合作
所有準備工作完成之后,接下來要做的就是,如何合作。我們可以每個人都在master當中進行操作,但是這時候會有什么問題呢?會不會整個master變得很亂?也有可能出現各種問題?
在沒有分支這個概念之前,我們對于一個項目的開發只有一個進度,但是一旦發現項目的之前版本的某個節點出現 bug,難道放棄到目前為止的所有開發,回退到 bug 節點進行修復嗎?
為了防止這種混亂現象的發生,我們在實際開發中的工作原則是這樣的:
master是我們的主分支(也可以理解為主線),我們為了讓這條分支足夠穩定,只在這個分支上進行新版本的發布或者項目的更新。
對于一個項目的所有操作,都創建一個develop分支,在這個分支上進行各個開發者代碼的合并。
由于一個項目有可能是多個人協作實現的,因此會每個人創建一個自己的分支,然后每個人將自己的代碼,從個人分支提交到develop分支做合并。
Runsen先總結創建與合并分支命令如下:
查看分支:git branch 創建分支:git branch name 切換分支:git checkout name 創建+切換分支:git checkout –b name 合并某分支到當前分支:git merge name 刪除分支:git branch –d name多人在同一分支
現在我們來實驗一下,首先我們應該都創建dev分支,但是我們遠程倉庫上只有master分支,這里小A先在Windows創建一個dev分支。
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (master) $ git branch * masterYIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (master) $ git checkout -b dev Switched to a new branch 'dev'YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git branch * devmaster接下來小A把dev分支推送到遠程倉庫上去
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git push origin devTotal 0 (delta 0), reused 0 (delta 0) remote: Powered by GITEE.COM [GNK-5.0] remote: Create a pull request for 'dev' on Gitee by visiting: remote: https://gitee.com/MaoliRUNsen/muli_person_test/pull/new/MaoliRUNsen:dev...MaoliRUNsen:master To https://gitee.com/MaoliRUNsen/muli_person_test* [new branch] dev -> dev我們可以到遠程倉庫中看到該分支
接下來我們切換身份到小B。小B從遠程倉庫上clone下來后會發現只有一個master分支。
maoli@ubuntu:~/B/muli_person_test$ git branch * master maoli@ubuntu:~/B/muli_person_test$ git checkout -b dev origin/dev fatal: 不能同時更新路徑并切換到分支'dev'。 您是想要檢出 'origin/dev' 但其未能解析為提交么?大家可以看到和原本相比多了一個origin/dev參數,該參數就是關聯遠程倉庫的dev分支。此時我們發現出錯了,原因是小B先clone下來了,此時沒有dev分支,而小A是在windows主機這里創建的dev分支并push。所以小B需要先pull一下。
maoli@ubuntu:~/B/muli_person_test$ git pull Username for 'https://gitee.com': Maolicom Password for 'https://Maolicom@gitee.com': 來自 https://gitee.com/MaoliRUNsen/muli_person_test* [新分支] dev -> origin/dev Already up-to-date. maoli@ubuntu:~/B/muli_person_test$ git branch * master maoli@ubuntu:~/B/muli_person_test$ git checkout -b dev origin/dev 分支 dev 設置為跟蹤來自 origin 的遠程分支 dev。 切換到一個新分支 'dev' maoli@ubuntu:~/B/muli_person_test$ git branch * devmaster不同人修改了不同文件如何處理?
ok,現在我們可以看到小B也有dev分支了。接下來我們發布一下任務:小A:開發user.html
小B:開發 register.html,也就是不同人修改了不同文件如何處理。這里說明下,開發的話最好不要在dev分支上做,而是選擇在自己的分支上開發。
因此小A再先創建一個分支,我們就叫A分支算了。
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git checkout -b A Switched to a new branch 'A'YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A) $ git branch * Adevmaster然后小A做個user.html,這里我簡單點,隨便寫下代碼。
然后添加,提交
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A) $ git add user.htmlYIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A) $ git commit -m "小A提交user.html" [A 3a709b2] 小A提交user.html1 file changed, 0 insertions(+), 0 deletions(-)create mode 100644 user.html現在小A開發好了,我們切換到dev分支,然后合并,最后小A把dev分支推送到遠程倉庫里
YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (A) $ git checkout dev Switched to branch 'dev'YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git branchA * devmasterYIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git merge A Updating 3a709b2..cc88ea7 Fast-forwarduser.html | 6 ++++++1 file changed, 6 insertions(+)YIUYE@DESKTOP-5EEO47M MINGW64 ~/Desktop/A/muli_person_test (dev) $ git push origin dev Counting objects: 3, done. Delta compression using up to 12 threads. Compressing objects: 100% (3/3), done. Writing objects: 100% (3/3), 340 bytes | 0 bytes/s, done. Total 3 (delta 1), reused 0 (delta 0) remote: Powered by GITEE.COM [GNK-5.0] To https://gitee.com/MaoliRUNsen/muli_person_test3a709b2..cc88ea7 dev -> dev接下來我們看一下小B。首先一樣先創建小B的分支。接下來小B開發register.html。后面都是一樣,添加,提交,合并到dev
maoli@ubuntu:~/B/muli_person_test$ git checkout -b B 切換到一個新分支 'B' maoli@ubuntu:~/B/muli_person_test$ git branch * Bdevmaster maoli@ubuntu:~/B/muli_person_test$ vim register.html ###### <html><head></head><body><h1>這是小B開發的registB.html</h1></body> </html>maoli@ubuntu:~/B/muli_person_test$ git commit -m "小B提交了register.html" [B 799b1cf] register.html1 file changed, 7 insertions(+)create mode 100644 register.html maoli@ubuntu:~/B/muli_person_test$ git checkout dev 切換到分支 'dev' 您的分支與上游分支 'origin/dev' 一致。 maoli@ubuntu:~/B/muli_person_test$ git branchB * devmaster maoli@ubuntu:~/B/muli_person_test$ git merge B 更新 028ae41..799b1cf Fast-forwardregister.html | 7 +++++++1 file changed, 7 insertions(+)create mode 100644 register.html在小B這里的dev分支上并沒有小A開發的user.html。我們不管怎么說,先推送。
maoli@ubuntu:~/B/muli_person_test$ git push origin dev: To https://gitee.com/MaoliRUNsen/muli_person_test! [rejected] dev -> dev (fetch first) error: 無法推送一些引用到 'https://gitee.com/MaoliRUNsen/muli_person_test' 提示:更新被拒絕,因為遠程倉庫包含您本地尚不存在的提交。這通常是因為另外 提示:一個倉庫已向該引用進行了推送。再次推送前,您可能需要先整合遠程變更 提示:(如 'git pull ...')。 提示:詳見 'git push --help' 中的 'Note about fast-forwards' 小節。可以看到推送錯誤了。原因已經顯而易見了,解決方案就是拉取一次
maoli@ubuntu:~/B/muli_person_test$ git pull remote: Enumerating objects: 7, done. remote: Counting objects: 100% (7/7), done. remote: Compressing objects: 100% (5/5), done. remote: Total 6 (delta 2), reused 0 (delta 0), pack-reused 0 展開對象中: 100% (6/6), 完成. 來自 https://gitee.com/MaoliRUNsen/muli_person_test028ae41..cc88ea7 dev -> origin/dev Merge made by the 'recursive' strategy.user.html | 6 ++++++1 file changed, 6 insertions(+)create mode 100644 user.html maoli@ubuntu:~/B/muli_person_test$ ls README.en.md README.md register.html user.html這里注意的是你git pull的時候會有提示叫你輸入原因,輸入原因完成后:wq。退出編輯器即可
maoli@ubuntu:~/B/muli_person_test$ git push 對象計數中: 5, 完成. Delta compression using up to 4 threads. 壓縮對象中: 100% (5/5), 完成. 寫入對象中: 100% (5/5), 585 bytes | 0 bytes/s, 完成. Total 5 (delta 2), reused 0 (delta 0) remote: Powered by GITEE.COM [GNK-5.0] To https://gitee.com/MaoliRUNsen/muli_person_testcc88ea7..c0c933c dev -> dev總結
以上是生活随笔為你收集整理的二、Git多人开发:不同人修改了不同文件如何处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 六、Git多人开发: 把同一文件改成了不
- 下一篇: 巴学院原来有多少辆车《窗边的小豆豆》巴学