傻瓜式Git提交代码流程【写给初学者】
前言
Git是程序員工作中最最常用的分布式版本控制系統(tǒng),為的就是解決那種多人協(xié)作、多次修改的問題,雖說Git可以應(yīng)用于各行各業(yè),但是實(shí)際上還是程序員用的最多了,應(yīng)該說是程序員的必備技能之一了,如果你還不會(huì)Git,趕緊學(xué)起來吧,否則可能要out了
可能很多學(xué)生黨只是平時(shí)使用過Git,自己練習(xí)過Git命令,但是并未真實(shí)在工作中使用過Git,也就是可能沒有遇到過各種需要回滾代碼、解決沖突這種場(chǎng)景
我這篇文章默認(rèn)大家對(duì)Git是有一定了解的,也就是關(guān)于上面這些理論啥的大概應(yīng)該是懂得,我也就不多啰嗦了,個(gè)人操作的是工作區(qū),add之后會(huì)提交到一個(gè)暫存區(qū)stage,commit之后會(huì)提交到本地倉庫,push是提交到遠(yuǎn)程倉庫
這篇文章大致介紹了下面這些【提交代碼幾種方式】【撤銷add操作】【撤銷commit操作】【撤銷push操作】【拉取新分支】【解決沖突】,主要是以命令行為主,命令行能幫助大家更容易理解,這樣以后操作起可視化工具會(huì)更加便捷,比如sourceTree
最順利提交
先說一個(gè)需求開發(fā)、代碼提交的順利的流程
命令行式
切換基礎(chǔ)分支:先切換到要基于拉取的分支,我們開發(fā)中一般可能會(huì)基于master拉取的比較多,那就先切換到master(git checkout master)
創(chuàng)建本地分支:git checkout -b new-branch
提交到遠(yuǎn)程:git push origin new-branch
設(shè)置關(guān)聯(lián):git pull一下拉取遠(yuǎn)程分支代碼會(huì)發(fā)現(xiàn)并未關(guān)聯(lián),OK lets do it
git branch --set-upstream-to=origin/new-branch new-branch 來建立關(guān)聯(lián),第一個(gè)new-branch是遠(yuǎn)程分支名稱,第二個(gè)是本地名稱
再次git pull一下,成功
接下來進(jìn)行水深火熱的開發(fā),假設(shè)假設(shè)你的開發(fā)過程一切順利,也沒有出現(xiàn)和同事提交代碼之間的沖突,你可能會(huì)有疑問,為什么我單獨(dú)創(chuàng)建的分支會(huì)出現(xiàn)沖突,出現(xiàn)了沖突又該如何解決呢,當(dāng)然沖突問題下面我會(huì)說
OK,下班了,先交下代碼
你以為我開發(fā)完成了?怎么可能,一天怎么可能開發(fā)完成,你這個(gè)需求這里這樣設(shè)計(jì)開發(fā)起來不簡(jiǎn)單,那里這樣設(shè)計(jì)開發(fā)起來也比較麻煩
總之,一天不可能開發(fā)完成(壞笑
但是我想先交一下代碼,我怕下班之后別人把我電腦給我偷了,偷了我的勞動(dòng)成果
把代碼放到本地倉庫和把大象放到冰箱需要三步相比,也需要三步可完成
第一步:git add命令來把修改的文件放到暫存區(qū)
git add file 或者 git add .代表所有
第二步:git commit 命令來把文件提交到倉庫
git commit -m ‘提交信息’ 加-m參數(shù)后面跟提示信息,強(qiáng)烈建議
這樣就可以把代碼提交到本地倉庫了,這樣別人把我電腦偷了,我的代碼就不會(huì)丟了嗎
還沒有,現(xiàn)在只是暫時(shí)提交到本地倉庫了,還沒提交到遠(yuǎn)程,電腦丟了代碼還是會(huì)丟
接下來我們來做最后一步:
git pull 拉取遠(yuǎn)程代碼,這一步的作用是為了防止代碼沖突,如果這個(gè)分支只是你個(gè)人在操作,這一步可以省略,因?yàn)椴粫?huì)有沖突
但是如果多個(gè)人在操作同一分支,大家交的代碼就可能產(chǎn)生沖突
沖突,顧名思義,就是大家修改的矛盾了,Git服務(wù)器無法判斷到底哪一版本代碼應(yīng)該保留,需要人工介入
沖突問題可能對(duì)于一些初學(xué)者來說比較頭疼,文章下面單獨(dú)拎出來說
git push origin new-branch 把本地倉庫代碼提交到遠(yuǎn)程
OK,收工!
sourceTree式
檢出新分支
按照下面方式操作,直接提交即可,很簡(jiǎn)單,傻瓜式操作
其實(shí)還是可視化工具好用,不過這個(gè)還是看個(gè)人習(xí)慣
問題多多的提交
當(dāng)然,這是一切一切都很順利的情況,但是實(shí)際開發(fā)中,總有一些不盡人意的情況
再一步步分析其中每一步驟出現(xiàn)問題,如何解決
撤銷本地的修改操作
git status查看當(dāng)前文件狀態(tài)
git checkout – xxx.java 撤銷單個(gè)文件的本地修改,當(dāng)然這里如果已經(jīng)add到暫存區(qū)了,這個(gè)命令是無效的,需要先通過下面的git reset HEAD xxx.java進(jìn)行add操作的撤銷,之后才能對(duì)撤銷文件進(jìn)行修改
git執(zhí)行了git checkout – xxx.java之后再次執(zhí)行g(shù)it status發(fā)現(xiàn)本地沒有已經(jīng)修改的文件了,也就是本地修改已經(jīng)被撤銷了
git checkout branch-name 這個(gè)命令可以用來切換本地分支,記得區(qū)分
撤銷add到暫存區(qū)的操作(綠字變紅字)
git status查看當(dāng)前文件狀態(tài)
git add操作之后添加到本地暫存區(qū),變?yōu)榫G字
撤銷綠字:撤銷add操作到暫存區(qū)
git reset HEAD xxx.java 這是對(duì)某個(gè)文件進(jìn)行add的撤銷,如果后面什么文件都不跟,其實(shí)就是對(duì)剛剛add的所有文件進(jìn)行撤銷了git reset HEAD
我們執(zhí)行了之后,發(fā)現(xiàn)原本變綠(已經(jīng)add的文件)的文件,又變回紅色的文件了,這時(shí)候就撤銷了剛剛的add操作了
撤銷Commit到本地庫的操作
執(zhí)行了add和commit操作之后,這個(gè)時(shí)候已經(jīng)提交到本地倉庫了
git reset --hard HEAD命令直接將本地文件回退到上一個(gè)提交版本,無論是add和commit的操作有沒有進(jìn)行過
其實(shí)add的撤回和Commit的撤回都可以直接用git reset命令直接完成,只是這個(gè)命令攜帶不同的參數(shù)代表著不同的含義,git reset [–mixed --soft --hard] commitID有三種參數(shù),熟悉這三個(gè)參數(shù)的含義
–mixed代表撤銷git add和git commit的操作,保留編輯器的代碼;
–soft代表撤銷git commit,不撤銷git add操作,同時(shí)保留編輯器的代碼;
–hard參數(shù)很暴力,直接撤銷commit和add的操作,撤銷所有改動(dòng)的代碼,當(dāng)你決定用–hard參數(shù)的時(shí)候,就代表著你應(yīng)該已經(jīng)決定了放棄修改過的所有代碼咯
撤銷push到遠(yuǎn)程的操作
當(dāng)我們執(zhí)行了push操作之后,意味著代碼已經(jīng)推送到遠(yuǎn)程了,其實(shí)這種情況需要回滾的比較少,一般已經(jīng)提交的代碼不需要再次回滾了,如果哪里修改錯(cuò)了,直接再次修改回來,再次提交即可
當(dāng)然git也是考慮到這方面的,git加入了版本號(hào)這一概念,來解決這種問題,也就是每次推送都會(huì)生成一個(gè)對(duì)應(yīng)的版本號(hào),我們可以利用版本號(hào)進(jìn)行相應(yīng)的回滾
通過git log查看歷史提交記錄
將目標(biāo)版本號(hào)保留,也就是你要退回的版本號(hào)保留。如果git log無法正常顯示中文,執(zhí)行set LESSCHARSET=utf-8命令
將本地的代碼撤銷到目標(biāo)版本號(hào),git reset --hard 547c78001fd2e0eedf83382ef4ee2974e9f445d1,此時(shí)本地代碼已經(jīng)切換回該版本號(hào)相應(yīng)代碼
強(qiáng)制提交,覆蓋遠(yuǎn)程代碼,git push --force執(zhí)行完了這一步,相應(yīng)版本號(hào)的代碼便已經(jīng)提交了,相應(yīng)的代碼也已經(jīng)回滾了
慎重提交!reset命令會(huì)將你提交的版本號(hào)之后的提交版本全部消失掉,謹(jǐn)慎操作。
其實(shí),還有另外一種形式的回滾,叫做git revert,這種回滾是和git reset是不同的回滾方式,git revert其實(shí)和git reset操作步驟也是類似的
reset和revert的區(qū)別
給大家舉個(gè)例子吧,這樣更容易理解
比如現(xiàn)在依次有版本1、2、3,reset會(huì)把修改的版本ID之后的版本都會(huì)消失掉,我執(zhí)行g(shù)it reset 1,那之后的版本2和3也就全部消失了,revert則是當(dāng)成一次新的提交版本,執(zhí)行了git revert 1之后,會(huì)保留2和3的代碼重新生成一個(gè)新的版本4,然后把版本4提交,所以這兩個(gè)的原理是不同的
reset是回到某次提交,此次提交以及之前的Commit都會(huì)被保留,但是此次之后的修改都會(huì)被退回到暫存區(qū)
revert則是生成一次新的Commit提交來撤銷某次提交,此次提交之前的Commit都會(huì)被保留,可以理解成把相應(yīng)版本的代碼刪除掉,再次提交
reset的作用是修改HEAD的位置,即將HEAD指向的位置改變?yōu)橹按嬖诘哪硞€(gè)版本,如下圖所示,假設(shè)我們要回退到版本一
適用場(chǎng)景:如果想恢復(fù)到之前某個(gè)提交的版本,且那個(gè)版本之后提交的版本我們都不要了,就可以用這種方法
revert原理:git revert是用于反做某一個(gè)版本,以達(dá)到撤銷該版本的修改的目的。我們commit了三個(gè)版本1、2、3,突然發(fā)現(xiàn)版本2不行,想要撤銷版本2,但又不想影響版本3的提交,就可以用git revert命令來撤銷版本2,生成新的版本4,這個(gè)版本4保留了版本3的內(nèi)容,但撤銷了版本2的內(nèi)容
使用場(chǎng)景:如果我們想要撤銷之前的某一個(gè)版本,但是又想要保留該目標(biāo)版本后面的版本,記錄下這個(gè)版本變動(dòng)流程,就可以用這種方法
搞清楚這兩個(gè)的關(guān)系之后,其實(shí)也就是可以根據(jù)相應(yīng)的業(yè)務(wù)場(chǎng)景來采用相應(yīng)的命令,一定要謹(jǐn)慎使用這兩個(gè)命令,尤其是reset的回退版本,因?yàn)間it會(huì)把相應(yīng)版本之后的版本刪除掉
總之,回退版本需謹(jǐn)慎
拉取新分支
命令行式
切換基礎(chǔ)分支:先切換到要基于拉取的分支,我們開發(fā)中一般可能會(huì)基于master拉取的比較多,那就先切換到master(git checkout master)
創(chuàng)建本地分支:git checkout -b new-branch
提交到遠(yuǎn)程:git push origin new-branch
設(shè)置關(guān)聯(lián):git pull一下拉取遠(yuǎn)程分支代碼會(huì)發(fā)現(xiàn)并未關(guān)聯(lián),OK lets do it
git branch --set-upstream-to=origin/new-branch new-branch 來建立關(guān)聯(lián),第一個(gè)new-branch是遠(yuǎn)程分支名稱,第二個(gè)是本地名稱
再次git pull一下,成功
sourceTress式
解決沖突
解決沖突這種事情在工作中難免會(huì)遇到,工作意味著合作,合作意味著你們?cè)谕粋€(gè)分支修改代碼,哪怕是在不同分支的代碼,最終你們修改的代碼上線也會(huì)合到相應(yīng)的上線分支,合到上線分支的時(shí)候也可能會(huì)出現(xiàn)沖突
比如你需要在idea中合并兩個(gè)分支dev和master,你需要把dev合并到master,切換到dev分支,執(zhí)行g(shù)it pull將本地代碼更新為最新
git checkout master切換到master分支,執(zhí)行g(shù)it pull更新為最新的代碼,執(zhí)行g(shù)it merge --no-ff dev(切換到目標(biāo)分支下執(zhí)行merge操作)
如果有沖突,直接通過idea來解決就好了,這里會(huì)出現(xiàn)一個(gè)解決沖突的按鈕,點(diǎn)擊進(jìn)行就可以看到哪些文件有沖突
然后點(diǎn)擊每個(gè)沖突文件,選擇你想要保留的文件即可,最后點(diǎn)擊右下角的apply來應(yīng)用
記住,此時(shí)你的idea是處于mergeing狀態(tài),當(dāng)你解決完了相應(yīng)的所有的沖突,你就可以去按照正常修改代碼來提交了,也就是上面說的那些add commit push一頓操作
其實(shí)啊,解決沖突的工具或者說是方式,有很多種,每個(gè)人有自己的代碼對(duì)比工具來解決,當(dāng)用命令行或者用sourceTree來merge的時(shí)候有沖突,我解決沖突用的最多的就是idea的git工具了,你可以選擇自己的代碼對(duì)比工具來進(jìn)行代碼的解決沖突和merge操作
結(jié)束語
感謝大家能夠做我最初的讀者和傳播者,請(qǐng)大家相信,只要你給我一
份愛,我終究會(huì)還你們一頁情的。
歡迎大家關(guān)注我的公眾號(hào)【左耳君】,探索技術(shù),分享生活
哦對(duì)了,后續(xù)所有的文章都會(huì)更新到這里
https://github.com/DayuMM2021/Java
總結(jié)
以上是生活随笔為你收集整理的傻瓜式Git提交代码流程【写给初学者】的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 算法第四版开发环境的配置
- 下一篇: 做决定要趁早