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