傻瓜式Git提交代碼流程【寫給初學(xué)者】


Git是程序員工作中最最常用的分布式版本控制系統(tǒng),為的就是解決那種多人協(xié)作、多次修改的問題,雖說Git可以應(yīng)用于各行各業(yè),但是實際上還是程序員用的最多了,應(yīng)該說是程序員的必備技能之一了,如果你還不會Git,趕緊學(xué)起來吧,否則可能要out了

可能很多學(xué)生黨只是平時使用過Git,自己練習(xí)過Git命令,但是并未真實在工作中使用過Git,也就是可能沒有遇到過各種需要回滾代碼、解決沖突這種場景
我這篇文章默認(rèn)大家對Git是有一定了解的,也就是關(guān)于上面這些理論啥的大概應(yīng)該是懂得,我也就不多啰嗦了,個人操作的是工作區(qū),add之后會提交到一個暫存區(qū)stage,commit之后會提交到本地倉庫,push是提交到遠(yuǎn)程倉庫
這篇文章大致介紹了下面這些【提交代碼幾種方式】【撤銷add操作】【撤銷commit操作】【撤銷push操作】【拉取新分支】【解決沖突】,主要是以命令行為主,命令行能幫助大家更容易理解,這樣以后操作起可視化工具會更加便捷,比如sourceTree


先說一個需求開發(fā)、代碼提交的順利的流程
命令行式
切換基礎(chǔ)分支:先切換到要基于拉取的分支,我們開發(fā)中一般可能會基于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)程分支代碼會發(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),第一個new-branch是遠(yuǎn)程分支名稱,第二個是本地名稱
再次git pull一下,成功
接下來進行水深火熱的開發(fā),假設(shè)假設(shè)你的開發(fā)過程一切順利,也沒有出現(xiàn)和同事提交代碼之間的沖突,你可能會有疑問,為什么我單獨創(chuàng)建的分支會出現(xiàn)沖突,出現(xiàn)了沖突又該如何解決呢,當(dāng)然沖突問題下面我會說
OK,下班了,先交下代碼
你以為我開發(fā)完成了?怎么可能,一天怎么可能開發(fā)完成,你這個需求這里這樣設(shè)計開發(fā)起來不簡單,那里這樣設(shè)計開發(fā)起來也比較麻煩
總之,一天不可能開發(fā)完成(壞笑
但是我想先交一下代碼,我怕下班之后別人把我電腦給我偷了,偷了我的勞動成果
把代碼放到本地倉庫和把大象放到冰箱需要三步相比,也需要三步可完成
第一步:git add命令來把修改的文件放到暫存區(qū)
git add file 或者 git add .代表所有
第二步:git commit 命令來把文件提交到倉庫
git commit -m '提交信息' 加-m參數(shù)后面跟提示信息,強烈建議
這樣就可以把代碼提交到本地倉庫了,這樣別人把我電腦偷了,我的代碼就不會丟了嗎
還沒有,現(xiàn)在只是暫時提交到本地倉庫了,還沒提交到遠(yuǎn)程,電腦丟了代碼還是會丟
接下來我們來做最后一步:
git pull 拉取遠(yuǎn)程代碼,這一步的作用是為了防止代碼沖突,如果這個分支只是你個人在操作,這一步可以省略,因為不會有沖突
但是如果多個人在操作同一分支,大家交的代碼就可能產(chǎn)生沖突
沖突,顧名思義,就是大家修改的矛盾了,Git服務(wù)器無法判斷到底哪一版本代碼應(yīng)該保留,需要人工介入
沖突問題可能對于一些初學(xué)者來說比較頭疼,文章下面單獨拎出來說
git push origin new-branch 把本地倉庫代碼提交到遠(yuǎn)程
OK,收工!
sourceTree式
檢出新分支

按照下面方式操作,直接提交即可,很簡單,傻瓜式操作


其實還是可視化工具好用,不過這個還是看個人習(xí)慣

當(dāng)然,這是一切一切都很順利的情況,但是實際開發(fā)中,總有一些不盡人意的情況
再一步步分析其中每一步驟出現(xiàn)問題,如何解決
撤銷本地的修改操作
git status查看當(dāng)前文件狀態(tài)

git checkout -- xxx.java 撤銷單個文件的本地修改,當(dāng)然這里如果已經(jīng)add到暫存區(qū)了,這個命令是無效的,需要先通過下面的git reset HEAD xxx.java進行add操作的撤銷,之后才能對撤銷文件進行修改

git執(zhí)行了git checkout -- xxx.java之后再次執(zhí)行g(shù)it status發(fā)現(xiàn)本地沒有已經(jīng)修改的文件了,也就是本地修改已經(jīng)被撤銷了
git checkout branch-name 這個命令可以用來切換本地分支,記得區(qū)分
撤銷add到暫存區(qū)的操作(綠字變紅字)
git status查看當(dāng)前文件狀態(tài)

git add操作之后添加到本地暫存區(qū),變?yōu)榫G字

撤銷綠字:撤銷add操作到暫存區(qū)
git reset HEAD xxx.java 這是對某個文件進行add的撤銷,如果后面什么文件都不跟,其實就是對剛剛add的所有文件進行撤銷了git reset HEAD
我們執(zhí)行了之后,發(fā)現(xiàn)原本變綠(已經(jīng)add的文件)的文件,又變回紅色的文件了,這時候就撤銷了剛剛的add操作了
撤銷Commit到本地庫的操作
執(zhí)行了add和commit操作之后,這個時候已經(jīng)提交到本地倉庫了

git reset --hard HEAD命令直接將本地文件回退到上一個提交版本,無論是add和commit的操作有沒有進行過
其實add的撤回和Commit的撤回都可以直接用git reset命令直接完成,只是這個命令攜帶不同的參數(shù)代表著不同的含義,git reset [--mixed --soft --hard] commitID有三種參數(shù),熟悉這三個參數(shù)的含義
--mixed代表撤銷git add和git commit的操作,保留編輯器的代碼;
--soft代表撤銷git commit,不撤銷git add操作,同時保留編輯器的代碼;
--hard參數(shù)很暴力,直接撤銷commit和add的操作,撤銷所有改動的代碼,當(dāng)你決定用--hard參數(shù)的時候,就代表著你應(yīng)該已經(jīng)決定了放棄修改過的所有代碼咯
撤銷push到遠(yuǎn)程的操作
當(dāng)我們執(zhí)行了push操作之后,意味著代碼已經(jīng)推送到遠(yuǎn)程了,其實這種情況需要回滾的比較少,一般已經(jīng)提交的代碼不需要再次回滾了,如果哪里修改錯了,直接再次修改回來,再次提交即可
當(dāng)然git也是考慮到這方面的,git加入了版本號這一概念,來解決這種問題,也就是每次推送都會生成一個對應(yīng)的版本號,我們可以利用版本號進行相應(yīng)的回滾
通過git log查看歷史提交記錄

將目標(biāo)版本號保留,也就是你要退回的版本號保留。如果git log無法正常顯示中文,執(zhí)行set LESSCHARSET=utf-8命令
將本地的代碼撤銷到目標(biāo)版本號,git reset --hard 547c78001fd2e0eedf83382ef4ee2974e9f445d1,此時本地代碼已經(jīng)切換回該版本號相應(yīng)代碼
強制提交,覆蓋遠(yuǎn)程代碼,git push --force執(zhí)行完了這一步,相應(yīng)版本號的代碼便已經(jīng)提交了,相應(yīng)的代碼也已經(jīng)回滾了
慎重提交!reset命令會將你提交的版本號之后的提交版本全部消失掉,謹(jǐn)慎操作。
其實,還有另外一種形式的回滾,叫做git revert,這種回滾是和git reset是不同的回滾方式,git revert其實和git reset操作步驟也是類似的
reset和revert的區(qū)別
給大家舉個例子吧,這樣更容易理解
比如現(xiàn)在依次有版本1、2、3,reset會把修改的版本ID之后的版本都會消失掉,我執(zhí)行g(shù)it reset 1,那之后的版本2和3也就全部消失了,revert則是當(dāng)成一次新的提交版本,執(zhí)行了git revert 1之后,會保留2和3的代碼重新生成一個新的版本4,然后把版本4提交,所以這兩個的原理是不同的
reset是回到某次提交,此次提交以及之前的Commit都會被保留,但是此次之后的修改都會被退回到暫存區(qū)
revert則是生成一次新的Commit提交來撤銷某次提交,此次提交之前的Commit都會被保留,可以理解成把相應(yīng)版本的代碼刪除掉,再次提交
reset的作用是修改HEAD的位置,即將HEAD指向的位置改變?yōu)橹按嬖诘哪硞€版本,如下圖所示,假設(shè)我們要回退到版本一

適用場景:如果想恢復(fù)到之前某個提交的版本,且那個版本之后提交的版本我們都不要了,就可以用這種方法
revert原理:git revert是用于反做某一個版本,以達到撤銷該版本的修改的目的。我們commit了三個版本1、2、3,突然發(fā)現(xiàn)版本2不行,想要撤銷版本2,但又不想影響版本3的提交,就可以用git revert命令來撤銷版本2,生成新的版本4,這個版本4保留了版本3的內(nèi)容,但撤銷了版本2的內(nèi)容

使用場景:如果我們想要撤銷之前的某一個版本,但是又想要保留該目標(biāo)版本后面的版本,記錄下這個版本變動流程,就可以用這種方法
搞清楚這兩個的關(guān)系之后,其實也就是可以根據(jù)相應(yīng)的業(yè)務(wù)場景來采用相應(yīng)的命令,一定要謹(jǐn)慎使用這兩個命令,尤其是reset的回退版本,因為git會把相應(yīng)版本之后的版本刪除掉
總之,回退版本需謹(jǐn)慎
拉取新分支
命令行式
切換基礎(chǔ)分支:先切換到要基于拉取的分支,我們開發(fā)中一般可能會基于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)程分支代碼會發(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),第一個new-branch是遠(yuǎn)程分支名稱,第二個是本地名稱
再次git pull一下,成功
sourceTress式

解決沖突
解決沖突這種事情在工作中難免會遇到,工作意味著合作,合作意味著你們在同一個分支修改代碼,哪怕是在不同分支的代碼,最終你們修改的代碼上線也會合到相應(yīng)的上線分支,合到上線分支的時候也可能會出現(xiàn)沖突
比如你需要在idea中合并兩個分支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來解決就好了,這里會出現(xiàn)一個解決沖突的按鈕,點擊進行就可以看到哪些文件有沖突

然后點擊每個沖突文件,選擇你想要保留的文件即可,最后點擊右下角的apply來應(yīng)用
記住,此時你的idea是處于mergeing狀態(tài),當(dāng)你解決完了相應(yīng)的所有的沖突,你就可以去按照正常修改代碼來提交了,也就是上面說的那些add commit push一頓操作
其實啊,解決沖突的工具或者說是方式,有很多種,每個人有自己的代碼對比工具來解決,當(dāng)用命令行或者用sourceTree來merge的時候有沖突,我解決沖突用的最多的就是idea的git工具了,你可以選擇自己的代碼對比工具來進行代碼的解決沖突和merge操作


好了,以上就是全部內(nèi)容了,我是永遠(yuǎn)愛你們的小魚仙,你們的學(xué)習(xí)成長小伙伴 ,如果你感覺這篇文章對你有幫助了,點個關(guān)注吧,么么噠
我希望有一天能夠靠寫文章養(yǎng)活自己,現(xiàn)在還在磨練,這個時間可能會有很多年,感謝你們做我最初的讀者和傳播者。請大家相信,只要給我一份愛,我終究會還你們一頁情的。
再次感謝大家能夠讀到這里,我后面會持續(xù)的更新技術(shù)文章以及一些記錄生活的靈魂文章,如果覺得不錯的,覺得【大魚同學(xué)】有點東西的話,求點贊、關(guān)注、分享三連
哦,對了!后續(xù)的更新文章我都會及時放到這里,歡迎大家點擊觀看,都是干貨文章啊,建議收藏,以后隨時翻閱查看
https://github.com/DayuMM2021/Java

● 消息隊列入門
