大家好,最近白澤第一次開始參與小組合作開發,以前都是自己用git儲存自己的代碼,自己維護,用git的場景也比較單一,沒有遇到過拉取代碼合并出現沖突的問題。但是小組開發拉取遠端倉庫的代碼時,遇到他人所送出代碼與自己的本地代碼出現沖突在所難免,是以白澤特意去學習了一下git的沖突處理,接下來用一個小demo複現一下我學習的過程
目錄
- 使用IDEA模拟git指令使用的常見場景
- 前期準備
- 建立一個遠端倉庫
- 在一個檔案夾内建立兩個子檔案夾作為兩個本地倉庫的存放位置
- 本地倉庫與遠端倉庫建立聯系
- 模拟兩個使用者協同開發的場景(使用IDEA自帶界面操作,不使用指令行)
- 推送代碼到遠端倉庫(當隻有一個人在維護遠端倉庫時)
- 克隆遠端倉庫項目
- 拉取遠端倉庫的代碼(遠端倉庫與本地倉庫無沖突)
- 拉取遠端倉庫的代碼(遠端倉庫與本地倉庫有沖突)
- 前期準備
使用IDEA模拟git指令使用的常見場景
大家好,最近白澤第一次開始參與小組合作開發,以前都是自己用git儲存自己的代碼,自己維護,用git的場景也比較單一,沒有遇到過拉取代碼合并出現沖突的問題。但是小組開發拉取遠端倉庫的代碼時,遇到他人所送出代碼與自己的本地代碼出現沖突在所難免,是以白澤特意去學習了一下git的沖突處理,接下來用一個小demo複現一下我學習的過程
前期準備
建立一個遠端倉庫
在一個檔案夾内建立兩個子檔案夾作為兩個本地倉庫的存放位置
- 之是以建立兩個檔案夾,這樣做的目的是為了模拟兩個使用者對同一個項目進行合作開發,假設demo1為使用者A的本地倉庫,demo2為使用者B的本地倉庫,後面會用兩個本地倉庫模拟多人開發中會遇到一些常見場景,并給出解決方案
- 在demo1檔案夾中建立test1與test2兩個檔案作為demo1倉庫的初始内容,此時demo2檔案夾為空
本地倉庫與遠端倉庫建立聯系
- 下面這張圖是建立git遠端倉庫成功之後顯示的提示文檔,訓示你該如何将本地倉庫與遠端倉庫建立聯系,我給出了每條指令的解釋
echo "# 内容" >> README.md //生成一個幫助文檔,可以不通過指令行建立,也可以不建立
git init //将目前檔案夾初始化為一個git本地倉庫
git add README.md //将README.md添加到暫存區
git commit -m "第一次送出" //将暫存區中的檔案送出到本地的git倉庫
git branch -M main //将目前分支重命名為main
git remote add origin [email protected]:BaiZe1998/git-idea-demo.git//添加遠端倉庫(建立聯系)
git push -u origin main //将本地倉庫目前分支的内容推送到遠端倉庫的main分支,使用-u參數後以後推送如果不加origin main,就會預設推動到origin的main分支
- 此時依舊在git-idea-demo1的檔案夾内,在下方的終端輸入處輸入上述所有的指令,結束之後結果應該與下圖相同
-
細心的你發現遠端倉庫的内容确實更新了,但是有一個問題就是你發現遠端庫并沒有test1.txt與test2.txt兩個文本檔案,原因在于上面我們使用了一個指令 git add README.md,這個指令隻是将README.md這一個檔案添加到緩存區,後面的 git commit -m "第一次送出" 負責将緩存區中内容全部送出到本地倉庫,然後由git push -u origin main指令将本地倉庫内容全部推送到遠端倉庫,為了使得我們遠端倉庫也能同步test1.txt與test2.txt必須一開始就将這兩個檔案加入本地的緩存區
接下來通過輸入三行代碼将test1.txt與test2.txt同步到遠端倉庫
git add . //表示将目前檔案夾内所有檔案加入緩存區
git commit -m"描述資訊" //送出時可以添加一些描述資訊"
git push //第一次使用了git push -u origin main之後下一次送出隻需要git push簡寫即可
- 最後遠端倉庫也同步了本地倉庫的資料,我們的準備工作也做好了,接下來正式開始模拟兩個使用者協同開發時會遇到的場景
模拟兩個使用者協同開發的場景(使用IDEA自帶界面操作,不使用指令行)
假設:員工A是某公司的老員工,員工B是公司的新人
推送代碼到遠端倉庫(當隻有一個人在維護遠端倉庫時)
事實上上述操作git的步驟都是使用了git的指令行操作的方式,并沒有發揮出IDEA的強大,接下來将盡量使用IDEA的界面上的可視化按鍵去完成對git的操作
- 當員工B還未加入到員工A的開發小組,整個項目隻有員工A在維護的時候,員工A在自己的建立了test3.txt,接下來将該檔案添加到緩存區,并送出到本地倉庫,然後再從本地倉庫推送到遠端倉庫(修改->添加->送出->推送,這是很常見的一個git操作流程,注意接下來将不使用指令行操作)
- 修改項目内容(添加了test3.txt)
- 添加到緩存區
- 送出到本地倉庫,并且選擇commit and push
- 遠端倉庫完成了資料的同步
克隆遠端倉庫項目
- 今天員工B被配置設定到員工A所在的小組參與開發,是以他首先要将小組目前正在開發的分支的項目代碼從遠端倉庫克隆到本地,首先用IDEA打開git-idea-demo2檔案夾,在終端Terminal處輸入git clone 遠端倉庫的位址将整個項目拷貝到git-idea-demo2檔案夾内
- 注意,雖然員工B在git-idea-demo2檔案中用了克隆,但是git-idea-demo2中的git-idea-demo檔案才是員工B本地倉庫的存放檔案(進入之後看到.git檔案在哪個檔案夾内,哪個檔案夾就是本地倉庫檔案夾)
拉取遠端倉庫的代碼(遠端倉庫與本地倉庫無沖突)
- 就在員工B開始正式參與A小組的開發,目前他還未對上一次克隆下來的版本的代碼做任何修改,在準備開始編碼前,他又嘗試去遠端倉庫拉取最新的代碼(因為員工A有可能又送出了新的修改的版本)
- 為了滿足情景,我們讓員工A修改一下test3.txt,然後推送到遠端倉庫
- 員工B拉取遠端倉庫的最新版本的代碼,選擇第一個,将要修改的代碼合并到目前分支
- 此時員工B本地倉庫的main分支已經已經合并了員工A送出到遠端倉庫main分支上的修改(注意此時員工B,從遠端倉庫拉取代碼,将代碼合并到本地倉庫,都是IDEA自動完成,這隻有在沒有沖突發生的情況下才能做到)
拉取遠端倉庫的代碼(遠端倉庫與本地倉庫有沖突)
- 員工B修改了test3的代碼,并且執行添加->送出->推送
- 接下來員工A也修改了test3.txt檔案,這次将原來的第一行内容改變(此時員工A還沒有去拉取遠端倉庫的代碼),然後在送出修改之前員工A又去拉取遠端倉庫的代碼(送出自己的更改前拉取遠端倉庫代碼是一個好的習慣)
- 發生了沖突,因為員工A本地所做的修改是在員工B推送到遠端倉庫的前一版本的基礎上做的修改,而員工B的推送使得遠端倉庫的最新版本與員工A本地版本不同(很明顯員工B修改了test3檔案,而員工A本地也在修改test3檔案,如果貿然将遠端倉庫的代碼合并到員工A的本地,遠端倉庫的代碼很有可能覆寫掉員工A目前所做的修改,是以此時需要手動處理沖突,選擇最終需要保留的部分)
- 手動處理沖突,最終選擇保留A自己的修改,以及額外又添加上了第三行修改
- 員工A将修改推送到遠端倉庫(本次整體的流程為:拉取->處理沖突(如果有)->添加->送出->推送)