大家好,最近白澤第一次開始參與小組合作開發(fā),以前都是自己用git保存自己的代碼,自己維護(hù),用git的場(chǎng)景也比較單一,沒(méi)有遇到過(guò)拉取代碼合并出現(xiàn)沖突的問(wèn)題。但是小組開發(fā)拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼時(shí),遇到他人所提交代碼與自己的本地代碼出現(xiàn)沖突在所難免,所以白澤特意去學(xué)習(xí)了一下git的沖突處理,接下來(lái)用一個(gè)小demo復(fù)現(xiàn)一下我學(xué)習(xí)的過(guò)程
前期準(zhǔn)備
新建一個(gè)遠(yuǎn)程倉(cāng)庫(kù)
在一個(gè)文件夾內(nèi)建立兩個(gè)子文件夾作為兩個(gè)本地倉(cāng)庫(kù)的存放位置
之所以建立兩個(gè)文件夾,這樣做的目的是為了模擬兩個(gè)用戶對(duì)同一個(gè)項(xiàng)目進(jìn)行合作開發(fā),假設(shè)demo1為用戶A的本地倉(cāng)庫(kù),demo2為用戶B的本地倉(cāng)庫(kù),后面會(huì)用兩個(gè)本地倉(cāng)庫(kù)模擬多人開發(fā)中會(huì)遇到一些常見(jiàn)場(chǎng)景,并給出解決方案
在demo1文件夾中新建test1與test2兩個(gè)文件作為demo1倉(cāng)庫(kù)的初始內(nèi)容,此時(shí)demo2文件夾為空
本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)建立聯(lián)系
下面這張圖是新建git遠(yuǎn)程倉(cāng)庫(kù)成功之后顯示的提示文檔,指示你該如何將本地倉(cāng)庫(kù)與遠(yuǎn)程倉(cāng)庫(kù)建立聯(lián)系,我給出了每條命令的解釋
echo "# 內(nèi)容" >> README.md //生成一個(gè)幫助文檔,可以不通過(guò)命令行創(chuàng)建,也可以不創(chuàng)建
git init //將當(dāng)前文件夾初始化為一個(gè)git本地倉(cāng)庫(kù)
git add README.md //將README.md添加到暫存區(qū)
git commit -m "第一次提交" //將暫存區(qū)中的文件提交到本地的git倉(cāng)庫(kù)
git branch -M main //將當(dāng)前分支重命名為main
git remote add origin git@github.com:BaiZe1998/git-idea-demo.git//添加遠(yuǎn)程倉(cāng)庫(kù)(建立聯(lián)系)
git push -u origin main //將本地倉(cāng)庫(kù)當(dāng)前分支的內(nèi)容推送到遠(yuǎn)程倉(cāng)庫(kù)的main分支,使用-u參數(shù)后以后推送如果不加origin main,就會(huì)默認(rèn)推動(dòng)到origin的main分支
此時(shí)依舊在git-idea-demo1的文件夾內(nèi),在下方的終端輸入處輸入上述所有的命令,結(jié)束之后結(jié)果應(yīng)該與下圖相同
細(xì)心的你發(fā)現(xiàn)遠(yuǎn)程倉(cāng)庫(kù)的內(nèi)容確實(shí)更新了,但是有一個(gè)問(wèn)題就是你發(fā)現(xiàn)遠(yuǎn)程庫(kù)并沒(méi)有test1.txt與test2.txt兩個(gè)文本文件,原因在于上面我們使用了一個(gè)命令 git add README.md,這個(gè)命令只是將README.md這一個(gè)文件添加到緩存區(qū),后面的 git commit -m "第一次提交" 負(fù)責(zé)將緩存區(qū)中內(nèi)容全部提交到本地倉(cāng)庫(kù),然后由git push -u origin main命令將本地倉(cāng)庫(kù)內(nèi)容全部推送到遠(yuǎn)程倉(cāng)庫(kù),為了使得我們遠(yuǎn)程倉(cāng)庫(kù)也能同步test1.txt與test2.txt必須一開始就將這兩個(gè)文件加入本地的緩存區(qū)
接下來(lái)通過(guò)輸入三行代碼將test1.txt與test2.txt同步到遠(yuǎn)程倉(cāng)庫(kù)
git add . //表示將當(dāng)前文件夾內(nèi)所有文件加入緩存區(qū)
git commit -m"描述信息" //提交時(shí)可以添加一些描述信息"
git push //第一次使用了git push -u origin main之后下一次提交只需要git push簡(jiǎn)寫即可
最后遠(yuǎn)程倉(cāng)庫(kù)也同步了本地倉(cāng)庫(kù)的數(shù)據(jù),我們的準(zhǔn)備工作也做好了,接下來(lái)正式開始模擬兩個(gè)用戶協(xié)同開發(fā)時(shí)會(huì)遇到的場(chǎng)景
模擬兩個(gè)用戶協(xié)同開發(fā)的場(chǎng)景(使用IDEA自帶界面操作,不使用命令行)
假設(shè):?jiǎn)T工A是某公司的老員工,員工B是公司的新人
推送代碼到遠(yuǎn)程倉(cāng)庫(kù)(當(dāng)只有一個(gè)人在維護(hù)遠(yuǎn)程倉(cāng)庫(kù)時(shí))
事實(shí)上上述操作git的步驟都是使用了git的命令行操作的方式,并沒(méi)有發(fā)揮出IDEA的強(qiáng)大,接下來(lái)將盡量使用IDEA的界面上的可視化按鍵去完成對(duì)git的操作
- 當(dāng)員工B還未加入到員工A的開發(fā)小組,整個(gè)項(xiàng)目只有員工A在維護(hù)的時(shí)候,員工A在自己的新建了test3.txt,接下來(lái)將該文件添加到緩存區(qū),并提交到本地倉(cāng)庫(kù),然后再?gòu)谋镜貍}(cāng)庫(kù)推送到遠(yuǎn)程倉(cāng)庫(kù)(修改->添加->提交->推送,這是很常見(jiàn)的一個(gè)git操作流程,注意接下來(lái)將不使用命令行操作)
- 修改項(xiàng)目?jī)?nèi)容(添加了test3.txt)
添加到緩存區(qū)
提交到本地倉(cāng)庫(kù),并且選擇commit and push
遠(yuǎn)程倉(cāng)庫(kù)完成了數(shù)據(jù)的同步
克隆遠(yuǎn)程倉(cāng)庫(kù)項(xiàng)目
今天員工B被分配到員工A所在的小組參與開發(fā),所以他首先要將小組當(dāng)前正在開發(fā)的分支的項(xiàng)目代碼從遠(yuǎn)程倉(cāng)庫(kù)克隆到本地,首先用IDEA打開git-idea-demo2文件夾,在終端Terminal處輸入git clone 遠(yuǎn)程倉(cāng)庫(kù)的地址將整個(gè)項(xiàng)目拷貝到git-idea-demo2文件夾內(nèi)
注意,雖然員工B在git-idea-demo2文件中用了克隆,但是git-idea-demo2中的git-idea-demo文件才是員工B本地倉(cāng)庫(kù)的存放文件(進(jìn)入之后看到.git文件在哪個(gè)文件夾內(nèi),哪個(gè)文件夾就是本地倉(cāng)庫(kù)文件夾)
拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼(遠(yuǎn)程倉(cāng)庫(kù)與本地倉(cāng)庫(kù)無(wú)沖突)
- 就在員工B開始正式參與A小組的開發(fā),當(dāng)前他還未對(duì)上一次克隆下來(lái)的版本的代碼做任何修改,在準(zhǔn)備開始編碼前,他又嘗試去遠(yuǎn)程倉(cāng)庫(kù)拉取最新的代碼(因?yàn)閱T工A有可能又提交了新的修改的版本)
- 為了滿足情景,我們讓員工A修改一下test3.txt,然后推送到遠(yuǎn)程倉(cāng)庫(kù)
員工B拉取遠(yuǎn)程倉(cāng)庫(kù)的最新版本的代碼,選擇第一個(gè),將要修改的代碼合并到當(dāng)前分支
此時(shí)員工B本地倉(cāng)庫(kù)的main分支已經(jīng)已經(jīng)合并了員工A提交到遠(yuǎn)程倉(cāng)庫(kù)main分支上的修改(注意此時(shí)員工B,從遠(yuǎn)程倉(cāng)庫(kù)拉取代碼,將代碼合并到本地倉(cāng)庫(kù),都是IDEA自動(dòng)完成,這只有在沒(méi)有沖突發(fā)生的情況下才能做到)
拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼(遠(yuǎn)程倉(cāng)庫(kù)與本地倉(cāng)庫(kù)有沖突)
員工B修改了test3的代碼,并且執(zhí)行添加->提交->推送
接下來(lái)員工A也修改了test3.txt文件,這次將原來(lái)的第一行內(nèi)容改變(此時(shí)員工A還沒(méi)有去拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼),然后在提交修改之前員工A又去拉取遠(yuǎn)程倉(cāng)庫(kù)的代碼(提交自己的更改前拉取遠(yuǎn)程倉(cāng)庫(kù)代碼是一個(gè)好的習(xí)慣)
發(fā)生了沖突,因?yàn)閱T工A本地所做的修改是在員工B推送到遠(yuǎn)程倉(cāng)庫(kù)的前一版本的基礎(chǔ)上做的修改,而員工B的推送使得遠(yuǎn)程倉(cāng)庫(kù)的最新版本與員工A本地版本不同(很明顯員工B修改了test3文件,而員工A本地也在修改test3文件,如果貿(mào)然將遠(yuǎn)程倉(cāng)庫(kù)的代碼合并到員工A的本地,遠(yuǎn)程倉(cāng)庫(kù)的代碼很有可能覆蓋掉員工A當(dāng)前所做的修改,所以此時(shí)需要手動(dòng)處理沖突,選擇最終需要保留的部分)
手動(dòng)處理沖突,最終選擇保留A自己的修改,以及額外又添加上了第三行修改
員工A將修改推送到遠(yuǎn)程倉(cāng)庫(kù)(本次整體的流程為:拉取->處理沖突(如果有)->添加->提交->推送)
到此這篇關(guān)于詳解使用IDEA模擬git命令使用的常見(jiàn)場(chǎng)景的文章就介紹到這了,更多相關(guān)IDEA模擬git命令使用內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
您可能感興趣的文章:- 解決idea中Terminal終端無(wú)法執(zhí)行GIT命令+Terminal 中文亂碼問(wèn)題