只有光頭才能變強。文本已收錄至個人GitHub精選文章,歡迎Star:https://github.com/ZhongFuCheng3y/3yjava
以前遇到過不少同窗私信問我:「三歪,我立刻要實習了,我要在實習前學些什麼作準備啊?」git
三歪在實習以前也一樣問過本身當時的部門老大。github
若是再給我一次機會,我會先去花點時間去學學Git。算法
Git我相信你們對它應該不陌生吧?但凡用過GitHub的同窗應該多多少少都會了解一下Gitshell
不知道當時你們學Git的時候是看哪一個教程的,我看的是廖雪峯老師的Git系列的。後端
(別看到廖雪峯就覺得是廣告了啊,哈哈哈哈,這篇純原創分享)數據結構
剛實習的時候,一直都忙着看各類東西。有一天,我學長說:我看你也學了一些基礎了,咱們來看看公司的代碼吧,看看咱們生產環境是怎麼作的。多線程
因而我學長丟了一個Git連接給三歪數據結構和算法
https://github.com/ZhongFuCheng3y/3y.git
那三歪作了什麼?三歪去IDEA下把這個Git給Clone下來:maven
我用Clone完了之後,我學長又補了一句:這個項目不是用master分支的哦,你切換一下分支。
三歪:啥?切換分支?咋整?我忘了。
我學長看了下我,貌似不咋會切換分支,就說:「我來吧」。
因而在命令行終端一頓操做後,對三歪說:「好了」
三歪:「我對Git不是很熟悉,以前一直都是在IDEA上操做的。大家通常用命令行多仍是圖形界面的多呀?」
我學長:「這沒什麼,反正工具這東西,學學就行,不是什麼大問題。也不必說很仔細去學它,就工具嘛」
三歪:「嗯」
時間飛逝,又過了一段時間...
三歪被分配了一個需求,因而就須要新建分支去作這個需求了。全部的標準應用線上走的是master分支,公司經過一個發佈系統來控制發佈版本、以及整套上下線的流程。
因而我要先在發佈系統裏邊新建Git分支:
完了之後,我就在IDEA界面上選擇那個被我新建完的分支
但發現我死活找不到...因而我就問我學長:我在發佈系統裏邊新建了分支,爲何在IDEA上找不到啊?
學長:「怎麼會呢,我看看」。
找了一會,他問我:「你fetch 過了嗎?」
三歪:「啥?」
因而他拿着個人電腦,打開了終端,又以是命令行的方式敲了一頓,問我:「這是否是你新建的分支?「
三歪點了點頭,因而我學長說:」好了,你再看看「。
後來發現,新建完遠程分支,若是在IDEA上要能感知到,能夠在pull
界面上刷新一下,那就能找到了。
也不是說命令行必定會就比界面牛逼,其實IDEA的Git功能也作得挺好的。如今我都是混合使用,一些操做用命令行,一些操做用IDEA快捷鍵。
我commit
和push
的時候就喜歡用快捷鍵。command+k和command +shift+k
我就感受比敲命令要快很多。
這些都是我的習慣的問題,也無對錯之分,怎麼方便怎麼來。
其實也不是全部的系統都會走發佈系統的(有標準應用,非標準應用)。若是要本身寫一個啓動的腳本,通常咱們會作些什麼?無非就是用Git
拉最新的代碼,而後用maven打個包,而後啓動。
若是你看過上一篇《三歪給女友講解什麼是Git》應該能大概瞭解什麼是Git了。
其實我以爲學Git主要理解工做區
-> 暫存區
->倉庫
這幾個概念。
咱們使用Git其實絕大部分的操做都是在本地上完成的,好比說add 和commit
。
只有咱們push
的時候,纔會把本地完成好的內容推到遠程倉庫上
經過上一篇文章咱們知道在每一個人的本地都有完整的歷史版本,因此咱們能夠在本地就能穿梭到不一樣的版本,而後將修改以後的代碼再從新提交到遠程倉庫上。
所謂的工做區實際上就是咱們真正的的本地目錄。
咱們在本地添加文件後,須要add
到暫存區,文件一旦被add
到了暫存區,意味着Git能追蹤
到這個文件。
當咱們修改到必定程度以後,咱們會執行一次提交commit
,在提交的時候咱們會」備註「本身此次的提交修改了什麼內容。
一次commit
在Git就是一個版本,Git是版本控制的軟件,咱們能夠隨意穿梭到任何的版本中,修改代碼。
暫存區是這麼一個概念呢?
暫存區就像購物車,沒到付款的時候你都不肯定購物車裏的東西所有都是要的。每拿一件商品就付一次款,那麻煩可大了。
從宏觀上看,Git其實有本地和遠程的概念,只是本地又分了工做區、暫存區、本地倉庫。再次強調:咱們操做幾乎都是在本地完成,每一個人的本地都會有全部歷史版本信息。
咱們通常會新建分支去支持每一次的修改。
其實分支這個概念也挺好理解的:咱們須要並行開發,同時咱們又不關心對方改的是什麼內容,改的是什麼文件。所以咱們須要在本身的專屬環境下去修改內容,只要把最終修改完後的內容合併到一個主分支就OK了。
假設三歪作完了,通過校驗經過後,把本身的代碼merge
(合併)到origin/master
分支後,而後就發佈上線啦。
隨後,雞蛋也作完了,本身的分支校驗完了之後,他此時也想把本身的代碼合併到origin/master
。不料,他改的代碼跟三歪改的代碼有衝突了(Git不知道選擇誰的的代碼),那雞蛋只能手動merge
了。
綜合來看,咱們使用Git大多數的場景就是各自分支開發,而後各自在本地commit
(提交),最後彙總到master
分支。
因此,咱們學Git大多數就學怎麼實現分支的增刪改、切換以及版本的穿梭。
學習Git的小tips:Unix/Linux 命令中,
-
後通常跟短命令選項(一般是單字母,也有一些命令是例外的),--
後通常跟長命令選項。若是隻有一個單獨的--
,後面不緊跟任何選項,則表示命令選項結束,後續的都做爲命令的參數而不是選項。例如:
git checkout -- filename
filename
做爲git checkout
的參數,而不是選項。
一、若是這個項目的代碼咱們在本地尚未,咱們先去GitLab裏邊找對應的Git地址,而後Clone到本地:
git clone https://github.com/ZhongFuCheng3y/3y.git
二、接到了新的需求,咱們要新建一個分支,而後基於這個分支去開發:
git checkout -b feature/sanwaiAddLog
在開發的時候,咱們確定會有兩個操做:
三、無論怎麼樣,等咱們作到必定程度了,咱們都會提交代碼。若是咱們添加了新的文件,咱們須要先add
,而後再commit
git add . git commit -m "try to commit files to GitHub, i am java3y"
四、假設咱們一切順利,在沒人打擾的狀況下已經寫好了代碼了,而後咱們會把本身的分支push
到遠程倉庫
git push
五、假設咱們寫到一半,其餘小夥伴已經把他的代碼merge
到主分支了,咱們也須要把他最新的 代碼給pull
拉取下來(能夠 git fetch + git merge 替代)。
git pull
若是沒有衝突,那git就會把他的代碼給merge
到我當前的分支上。若是有衝突,Git會提醒我去手動解決一下衝突。
六、假設咱們寫到一半了,如今工做區的代碼都已經commit
了。此時同事說要不幫忙一塊兒排查一個問題,同事通常用的是本身分支,因而就得問他:你用的哪一個分支啊?因而得把他的分支給拉下來,看看他的代碼哪兒有問題
git fecth -- 手動拉取遠程倉庫更新的信息 git checkout 分支名 -- 切換到他的分支
如今切換到他的分支,至關於你的環境跟他的環境是如出一轍的,因而就能夠愉快地一塊兒看Bug了。
七、假設咱們寫到一半了,如今工做區的代碼還沒commit
。如今有同事說要排查問題或者一個新的Bug被發現了,要緊急切換到其餘的分支。如今我又不想commit
(我就寫了一半,編譯還報着錯誤,沒理由讓我commit
吧)。
這時,我會把工做區的代碼先stash
到暫存區給保存起來,而後就能夠愉快地切換其餘的分支了。
git stash
等我解決完另外一個bug或者幫別人看完問題了,我再把剛剛保存在暫存區的代碼給撈出來,繼續幹活
git stash pop
八、我一直在修Bug,如今的分支已經被我搞得人摸鬼樣了,我很是難受,甚至不知道本身在這個過程當中改了多少東西了。
思路已經徹底被打亂了,我想回到一個穩定的commit
從新出發,重來吧(經過下面的命令,把工做區的代碼都改爲對應commit的代碼了)。
git reset --hard 版本號
那我怎麼找到版本號呢?Git也是有日誌的:
git log --pretty=oneline
查看Git工做區、暫存區的變動狀況(能夠知道哪些沒有commit、哪些沒有被Git追蹤):git status
拉取遠程最新的變動到本地:git fetch
切換分支:git checkout 分支名
將代碼還原到某個版本(包括工做目錄):git reset --hard 版本號
查看Git的提交(commit)記錄:git log
將代碼還原到某個版本後,後悔了,想從新回去,但在提交記錄已經找不到了。git reset --hard
把reset 以後的 commit
都給抹殺掉了。找到最近的執行Git命令:git reflog
還原到某個版本了,如今我爲了穩健,不想再原來的分支上修改了,再新建一個分支吧(-b
參數把當前分支切換到了要建立的分支上):git checkout -b 分支名
咱們把上一次仍是」相對穩健「的分支合併到我新建的分支上:git merge 分支
忽然想看看如今有多少個分支:git branch -a
新增幾個文件了,隨手git add
一下吧
改得差很少了,隨手git commit -m
一下吧,最好仍是寫好備註,否則之後等改多了,你都不知道你改了什麼啦。
改完了,提交到遠程吧:git push
想把遠程分支最新的代碼給拉下來,而後合併到本地上。咱們能夠用git fetch
和git merge
來實現,也能夠經過git pull
來實現。通常我用的都是git fetch
+git merge
,這樣會更加可控一些
有的時候,本地分支在master分支,而後忘了切其餘的分支去修改,直接在master改了,而後也push到遠程了。等你發現的時候,你會真的想罵本身。
咋辦?最簡單的辦法其實咱們仍是能夠git reset --hard
到對應的版本,而後將其修改或者復原,再強制提交到master
分支:git push -u origin/master -f
在這篇文章中,我列出的Git經常使用的命令其實並很少吧。
像不少博客講的diff
、tag
、config
之類的命令我都沒有講,我這邊現實開發時這些命令也沒怎麼用過...
若是以爲我說漏的,能夠在評論區補充,一塊兒學習。
其實如今IDEA
也很強大,不少時候均可以配合IDEA
給咱們提供的Git
去作不少事。有的場景敲命令會比較方便,有的時候就直接圖形化界面就比較方便。
就diff
這個功能而言, 確定仍是圖形界面好用一些吧(至少我是這樣認爲的
IDEA配合一些快捷鍵,使用Git也能爽得飛起。Git始終也只是一個工具,若是你有興趣能夠了解它的實現(我以爲大部分人可能不知道它是怎麼實現的);
若是沒興趣看它的實現,瞭解它是怎麼使用的,也足夠應付平常的開發場景了。
總的來講,如今的互聯網公司大多數仍是用Git的,Git自己使用上其實不難,只要理解了Git是幹嗎的,它有個本地倉庫的概念,它能夠來回穿梭各類版本,而後將本地的信息提交到遠程,跟着教程把經常使用的命令敲敲也差很少了。
若是實在是不懂,也別慌(我都給大家打了個樣了);主動認慫,虛心求教,同事們都不會嫌棄你的。
若是實習以前不知道要準備什麼去公司,要是對Git不瞭解,我以爲Git能夠有佔一席之位。
更多Git命令和參考資料:
下面的文章都有對應的 原創精美PDF,在持續更新中,能夠來找我催更~
我是三歪,一個想要變強的男人,感謝你們的點贊收藏和轉發,下期見。給三歪點個贊,對三歪真的很是重要!