俗說金三銀四,大部分人都選擇在這個時候找工作
有拿完年終獎準備跳槽的,也有年前就辭職,已經休了一個長期年假的,還有剛走出校門的青澀少年們
換了新工作,肯定要接觸新專案,現在絕大多數專案都是使用Git進行版本控制
這篇文章,主要目的是在多人開發中讓你能熟練使用Git
從實戰出發,不大談原理,只談實際應用,省去大量的查詢文件的時間
入職新公司,接觸新專案,基本是不需要你自己搭建Git專案來託管code的,所以這裡就不談搭建了,只談在開發實戰時,如何使用Git
文末有總結,便於查閱
第一件事,肯定就是先安裝Git了 官網下載Git比較麻煩,需要有梯子來幫助你,才能摸到它,這裡直接給你一個Github上的映象地址供你下載安裝
若不會安裝,請移步搜尋引擎,搜尋Git安裝教程,本文不過多描述安裝過程
第一次使用Git
安裝好後,直接開啟Git Bash,也就是Git 的控制檯程式,就可以開始使用了
第一次使用Git,需要先配置自己的郵箱與名稱
配置郵箱地址
git config --global user.email "NaoNao.@nao.com"
複製程式碼
配置使用者名稱
git config --global user.name "NaoNao"
複製程式碼
配置完,Git不會給出任何提示,Unix的邏輯就是,沒有提示就是最美的提示。
注意git config
命令的--global
引數,用了這個引數,表示你這臺機器上所有的Git倉庫都會使用這個配置,當然也可以對某個倉庫指定不同的使用者名稱和Email地址。
要想檢視是否配置成功,依然是使用上述命令,把引號以及引號內的內容去掉即可。
拉取專案
配置好我們的個人資訊後,自然也就需要拉取專案了
在磁碟中新建好存放專案的資料夾,進入資料夾點選滑鼠右鍵,選擇Git Bash即可
溫馨提示:使用Git託管的專案,有兩種地址,Https與SSH。 使用Https地址拉取,驗證一次密碼後,以後每次拉取/推送的時候不再需要驗證密碼。 使用SSH地址拉取的專案,每次拉取/推送的時候都需要密碼驗證。 各位讀者自己抉擇。
我的專案地址是 github.com/AdolphKevin…
git clone https://github.com/AdolphKevin/NaoNao.git
複製程式碼
將你的專案地址替換掉我的專案地址即可
分支管理
說分支管理之前,在此做個背景說明:一般在專案開發中會有2個主分支(master與develop) master分支上的內容是釋出在生產環境執行的內容 develop分支是所有開發人員開發完成釋出到測試環境的內容 其它各種feature分支都是各位開發人員在開發時拉取使用的分支
此文,也沿用此方式,各位讀者按照自己實際情況判斷
拉取下來後,我們要進行開發,肯定不能在master分支上開發,一般在專案上都會有各種分支
專案clone下來,首先就是檢視分支了
git branch -r
複製程式碼
加上-r是代表檢視遠端倉庫的分支,要是檢視本地分支,只需要把-r去掉即可,-r是remote的簡寫
檢視遠端分支,所有的分支名前均會帶有origin/ 的字首,這個字首代表著遠端分支,拉取遠端分支,填寫遠端分支名時不需要帶上origin/
接到開發任務,我們需要從遠端倉庫上將我們需要開發的分支拉取到本地
git fetch origin x(遠端分支名):y(本地分支名)
複製程式碼
使用上述程式碼,可以將遠端分支拉取到本地,並建立本地分支
接著就是要將剛剛建立的本地分支與遠端分支做關聯了,做了關聯之後,拉取更新與推送都不需要再指定分支名稱
git branch --set-upstream-to=origin/x(遠端分支名) y(本地分支名)
複製程式碼
其中,x是你本地分支對應的遠端分支;y是你當前的本地分支。
切換分支
做完關聯後,我們們就需要切換分支,在特定的分支上去進行開發任務 先檢視本地分支,找到我們需要開發的分支
git branch
複製程式碼
再切換到我們需要開發的分支上
git checkout y(分支名)
複製程式碼
提交內容
我們在自己的分支上按照需求完成了開發任務,接著就是將我們開發的內容提交到遠端倉庫了
雖然我們們所在的分支,除了自己之外,按理說是沒人會在自己這個分支上再進行開發,所以推送前拉取更新也不很必要
但是為了避免不必要的麻煩,提交之前還是先拉取一下最新的資料
git pull
複製程式碼
獲取了最新資料後,如果有別的同事動了我們們的分支,那肯定得先解決一下檔案的衝突,若沒有人動,那也就不用處理了
接著將我們新增/修改的檔案提交到本地暫存區
git add xxx(檔名)
複製程式碼
xxx代表著檔名。當然,開發時我們們基本上很少只修改/新增一個單獨的檔案,當修改或新增了很多檔案時,讓我們一個一個檔案的add,能把人給累死
所以Git也給出了批量add的方法,簡單粗暴
git add -A
複製程式碼
-A是All的縮寫,git add all 可以提交未跟蹤、修改和刪除檔案。 .git add . 可以提交未跟蹤和修改檔案,但是不處理刪除檔案。
提交到暫存區後完成後就是將改動內容全部提交
git commit -m "提交到暫存區"
複製程式碼
引號內的文字,是此次提交內容的一個說明描述,以後看日誌時也便於知道此次進行了什麼內容的修改
提交完後就是將本次修改的內容推送至遠端倉庫
git push
複製程式碼
好了,到這裡push的時候,坑來了~~~
如果是自己一個人的專案,此時如何push都沒問題,但問題就出在,我們們是多人開發的專案,我們們的分支是需要與主分支合併(merge)。
別的同事的任務完成了,早已推送到我們將要合併的develop分支上了
所以我們在push之前需要進行code merge ,將develop分支上的內容merge到我們當前的feature分支上
程式碼合併
此時我們在feature分支上已經將修改內容commit了 需要將develop分支的內容合併到當前分支,先切換分支到develop上,再獲取一次更新
git checkout develop
git pull
複製程式碼
這裡切換到develop分支上獲取更新時有個小坑,我們們暫且按照一切順利來處理,後面再說一些常見的意外情況的處理。
獲取完更新後,再切換到我們的feature分支上,將develop的內容合併到我們的feature分支上
git checkout feature
複製程式碼
合併某分支到當前分支
git merge develop
複製程式碼
解決衝突
執行merge後,如果有衝突,控制檯會將有衝突的檔名展示出來,我們按照檔名找到對應檔案,將衝突給解決掉後。
開啟檔案我們可以看到衝突的內容,例如:
<<<<<<<HEAD hello world feature ======= hello world develop >>>>>> develop
Git用<<<<<<<,=======,>>>>>>>標記出不同分支的內容 <<<<<<<與=======之間的內容為當前分支的內容 =======與>>>>>>之間的內容為develop分支的內容(換句話說:就是需要被合併的分支內容)
將不需要保留的內容刪除即可解決衝突
解決衝突後,我們再將當前的feature分支推送到遠端倉庫
git push
複製程式碼
執行完本命令列後,即可將本地分支內容推送至遠端倉庫
獲取更新時的意外情況
前面說從feature分支切換到develop分支拉取更新時,會有個小坑,因為有時候Git會報錯
Git pull - Please move or remove them before you can merge
這個錯誤是因為無論原始檔案中.gitignore 檔案的內容是什麼,檔案都被新增到遠端儲存庫中。
由於檔案存在於遠端儲存庫中,因此git也必須將它們提取到本地工作樹,因此會抱怨檔案已經存在。
.gitignore 僅用於掃描新新增的檔案,它與已新增的檔案沒有任何關係。
因此,解決方案是刪除工作樹中的檔案並提取最新版本。或者長期解決方案是如果錯誤地新增了檔案,則從儲存庫中刪除檔案。
這時我們在develop 分支上刪除當前目錄下沒有被track過的檔案和資料夾
git clean -d -f
複製程式碼
現在重新獲取更新即可
開發到一半,卻需要切換分支
軟體開發中,Bug就像家常便飯一樣。有了Bug就需要修復,在Git中,由於分支是如此的強大,所以,在實戰中,每個Bug都是通過一個新的臨時分支來修復,修復後,將Bug分支合併到develop與master兩個分支上,然後將臨時分支刪除
注意:將Bug分支合併到develop與master兩個分支上,是在遠端倉庫完成。在本地,是需要將develop與master分支先獲取最新,然後將這兩分支分別合併在Bug分支上,解決衝突後直接推送Bug分支即可
可我們在feature分支上開發功能開發到一半,leader突然跑來告訴我們,生產環境出現了一個Bug,需要我們們緊急修復,我們們興致勃勃的使用git checkout Bug
命令,打算切換到Bug分支上去修復Bug
結果……Git卻告訴我們,無法切換過去,因為我們目前所在分支沒有提交……
可我們若要完成開發任務再去修復Bug,可能需要好幾個小時甚至幾天時間才能完成,而Bug修復卻是緊急任務,這該如何是好呢?
問題不大,不慌。此時我們可以將當前分支開發的工作狀態儲藏下來,待我們解決了Bug,再恢復我們現在的狀態
git stash
複製程式碼
執行完上述命令後,我們再來看看我們工作區是否乾淨
git status
複製程式碼
我們發現工作區非常乾淨,此時我們就可以順利的執行git checkout Bug
到Bug分支上去修改Bug了
我們們現在將Bug也解決了,也推送了,現在又回到feature分支繼續我們們之前的任務了,切換回feature分支後,之前修改的內容也沒有恢復啊!說好的儲藏了工作狀態呢?
我們們就來看看所有儲藏的工作
git stash list
複製程式碼
使用上述命令,Git會將所有的儲藏工作羅列出來,當我們想要恢復其中某一個儲藏狀態時,指定其名字就好了
git stash apply stash@{0}
複製程式碼
上述的stash@{0} 是當前分支儲藏的工作名,各位讀者根據自己的git stash list
中的內容,自行替換
切換後,確認完當前狀態無誤了,就可以將之前儲存的儲藏刪除
git stash drop stash@{0}
複製程式碼
覺得要執行兩行命令比較麻煩?沒關係,還有一次性解決問題的方法 切換後並自動刪除
git stash pop stash@{0}
複製程式碼
不過我個人不大推薦這種方式,萬一我們們恢復的儲藏指定錯了呢,要恢復起來還挺麻煩的。
版本回退
在開發時,總有需要回退到某個版本的時候,不然用版本控制系統幹嘛?是吧
我們先來看看我們的歷史版本
git log
複製程式碼
現在控制檯輸出了最近三次提交的日誌資訊,友情提示一下,按鍵盤Q可退出,按回車可檢視更多的日誌
要是嫌棄輸出的內容過於冗雜,可以讓Git顯示個簡單版
git log --pretty=oneline
複製程式碼
加上一個--pretty=oneline
引數,就可以只看提交的ID了
現在我們可以根據當時commit時填寫的描述資訊,來判斷哪一個ID是我們想要回退的版本
版本的回退,有兩種常用的方式
回退到上一個版本
git reset --hard HEAD
複製程式碼
根據commit的ID,回退到指定版本
git reset --hard commit_id
複製程式碼
commit_id這個版本號沒必要寫全,只需要寫6位以上就差不多了,Git能自己找到它,若存在前6位重複ID,那再多加幾位就好了
版本的回退也非常的簡單吧,Git的命令列操作寫到這兒,也進入尾聲了。上述的命令基本可以滿足日常的使用
寫在最後
Git命令列的操作,使用起來並不複雜,作為開發人員,要是沒有深入瞭解Git的意願,會用就行了,使用Git的要領就是大量使用分支
總結一下本文牽扯到的git操作
git config --global user.name
檢視使用者名稱或配置使用者名稱
git config --global user.email
檢視email或配置email
git clone
將遠端倉庫的專案克隆到本地
git branch
檢視分支
git branch -r
檢視遠端分支
git branch <name>
建立分支
git fetch origin origin/remote_branch:your_branch
將遠端分支下載到本地,並建立分支
git branch --set-upstream-to=origin/remote_branch your_branch
將本地分支與遠端分支做關聯
git pull
獲取更新
git clean -d -f
刪除當前目錄下沒有被track過的檔案和資料夾
git merge <name>
將目標分支合併到當前分支
git add
將內容新增到暫存區
git commit
將新增的內容提交
git push
將本地提交內容推送到遠端倉庫
git checkout
切換分支
git branch -d <name>
刪除分支
git stash
儲藏當前分支所有內容
git stash list
檢視當前分支儲藏列表
git stash apply
恢復指定儲藏內容
git stash drop
刪除指定儲藏內容
git stash pop
恢復並刪除指定儲藏內容
git status
顯示工作目錄和暫存區的狀態
git log
顯示commit的詳細日誌
git log --pretty=oneline
只顯示commit的ID與描述
git reset --hard HEAD
回退到最近的一個版本
git reset --hard commit_id
根據commit_id回退到指定版本