使用IDEA模擬git命令使用的常見場景

白澤來了發表於2021-04-30

使用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 git@github.com: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將修改推送到遠端倉庫(本次整體的流程為:拉取->處理衝突(如果有)->新增->提交->推送)

相關文章