來源:Java聯盟

Git 是什麼?

有了Git這些操作,我再也不怕開發了!

Git 是一個分佈式的代碼管理容器,本地和遠端都保有一份相同的代碼。 Git 倉庫主要是由是三部分組成:本地代碼,緩存區,提交歷史。

Git 有哪些常規操作?

Git的常規操作你瞭解嗎?那讓我們來簡單說說Git的簡單操作吧!

克隆代碼

➤克隆遠端代碼

git clone + 遠程庫地址

➤查看本地的代碼狀態

// 可以明確的呈現出本地倉庫的狀態

// 哪些文件發生改動,哪些文件已經提交到本機

// 以及一些操作指示。

git status

有了Git這些操作,我再也不怕開發了!

➤同步遠端分支變化

// 拉取指定分支的變化

git fetch origin master

// 拉取所有分支的變化

git fetch

// 拉取所有分支的變化,並且將遠端不存在的分支同步移除【推薦】

git fetch -p

➤同步遠端代碼變化。

// 都是先 git fetch,然後執行合併操作

// 不同的是,git pull 執行的是 git merge,git pull -r 執行的是git rebase

git pull origin master

git pull -r origin master

本地代碼

首先我們要明確一個概念:就是每個 commit 都是一份完整的代碼狀態,用一個 commitID 來唯一標誌。

有了Git這些操作,我再也不怕開發了!

從某個角度上來說,Git維護的就是一個commitID樹,分別保存着不同狀態下的代碼。 所以你對代碼的任何修改,最終都會反映到 commit 上面去。

➤新增 commit

// 添加文件到緩存區,然後提交到本地倉庫

git add files

git commit -m '提交備註'

➤撤銷 commit

// 會將提交記錄回滾,代碼不回滾

git reset b14bb52

// 會將提交記錄和代碼全部回滾

git reset --hard b14bb52

// 將部分代碼文件回滾

git checkout -- files

➤合併 commit 合併 commit,本質上合併兩份不同狀態下的代碼。

// Git 提供了兩種合併 commit 的方式

git merge master

git rebase master

➤那麼 git rebase 和 git merge 到底有什麼區別呢?

merge是兩個分支處理衝突後,新增一個 commit 追加到master上。 rebase是將someFeature分支上的commit記錄追加到主分支上,值得注意的是,這個時候他的commit其實已經發生變化。

有了Git這些操作,我再也不怕開發了!

git merge 處理衝突更直接,而git rebase 能夠保證清晰的 commit 記錄。

合併 commit 的時候,通常會發生衝突。那麼,這個時候我們可以做什麼呢?首先全局搜索特殊字符比如<<

有了Git這些操作,我再也不怕開發了!

操作分支

所謂的分支其實就是一個指向 commitID 的指針,你可以去.git/refs/heads裏去看看。通常情況下,我們建議分支至少能夠明確的標記功能名稱,如果能標記用戶就更好了,比如qixiu/feature。

有了Git這些操作,我再也不怕開發了!

➤查看分支

可以同時看到本地分支和遠端分支,配合上前文介紹的git fetch -p可以第一時間查看到最新的分支信息。

有了Git這些操作,我再也不怕開發了!

➤新增本地分支 其實就是創建一個指針指向某一個 commitID。

// git branch qixiu/feature + git checkout qixiu/feature

// 從當前分支新增一個新的分支qixiu/feature

// 一般情況下,我們應該從master或者其他穩定分支來新增分支

git checkout -b qixiu/feature // 新建分支

git checkout qixiu/feature // 切換分支

➤刪除本地分支 其實就是移除一個指向 commitID 的指針。

// 刪除本地分支,如果本地還有未合併的代碼,則不能刪除

git branch -d qixiu/feature

// 強制刪除本地分支

git branch -D qixiu/feature

➤新增遠端分支 通常情況下,我們是新建本地分支,然後更新到遠端的方式來新增一個遠端分支

git push origin qixiu/feature

➤刪除遠端分支 同樣,我們也是通過更新到遠端的方式來刪除一個遠端分支

// 等同於git push origin -d qixiu/feaure

git push origin :qixiu/feature

最後我們來彙總一下平常用的比較多的操作,學會這些操作應付日常是沒有問題啦~

git status // 查看本地代碼狀態

git add files // 添加代碼到緩存區

git commit -m '提交內容的備註' // 提交代碼到本地倉庫

git checkout -b branchName // 不加-b就是普通切換分支

git fetch -p // 同步遠端分支狀態

git pull -r origin branchName // fetch遠端代碼到本地,並且以rebase的方式合併代碼

git push origin branchName // 更新本地代碼到遠端

Git 有哪些比較好的實踐?

Git 有一些成熟的開發流程,比較主流的有兩種:基於功能分支的開發流程 和 GitFlow開發流程。如果是做比較簡單的項目的話,前者會更好;如果是做比較複雜的大型項目,那麼後者會更好喲!

基於功能分支的協作模式

基於功能分支的開發流程其實就是一句話:用分支來承載功能開發,開發結束之後就合併到 master 分支。 他的優點是能夠保證master分支的整潔,同時還能讓分支代碼邏輯集中,也便於 CodeReview。

➤從 master 切出一個新分支

git checkout -b qixiu/newFeature

➤開發一些新功能,然後提交 建議較多頻次的提交代碼到本地倉庫,以便能夠更靈活的保存或撤銷修改。

git status

git add files // 挑選需要提交的文件,或者全部提交

git commit -m '提交備註'

git push origin qixiu/newFeature

➤如果功能開發完成,可以發起一個CodeReview流程 ,如果代碼測試通過,合併到 master,然後準備上線

// 冗餘版 合併到 master

git checkout master

git pull -r origin master

git checkout qixiu/newFeature

git rebase master // 處理衝突

git checkout master

git merge qixiu/newFeature

git push origin master

// 精簡版 合併到 master

git checkout qixiu/newFeature

git pull -r origin master // 將master的代碼更新下來,並且rebase處理衝突

git push origin master // 將本地代碼更新到遠端

注意!!不要在master合併代碼,保證master的可用性很重要。 確保在正確的分支執行正確的操作。 無論是處理衝突還是更新遠端代碼,請保有敬畏之心。

分支命名規範

推薦使用如下格式:ownerName/featureName。這樣既便於知道分支覆蓋的功能,也便於找到分支的負責人。

GitFlow 比前文講的基於功能分支的開發流程要複雜得多,它更適合大型的複雜項目。 它圍繞項目發佈流程定義了一個嚴格的分支模型,所有的開發流程都是圍繞這個嚴格的分支模型進行。 而這個模型約定了每個分支的角色,以及他們如何溝通。

GitFlow 開發流程中幾個約定的分支

有了Git這些操作,我再也不怕開發了!

➤Master分支:用於存放線上版本代碼,可以方便的給代碼打版本號。

➤Develop分支:用於整合 Feature 分支。

➤Feature分支:某個功能的分支,從 Develop 分支切出,並且功能完成時又合併回 Develop 分支,不直接和 Master 分支交互。

➤Release分支:通常對應一個迭代。將一個版本的功能全部合併到 Develop 分支之後,從 Develop 切出一個 Release 分支。這個分支不在追加新需求,可以完成 bug 修復、完善文檔等工作。注意!代碼發佈後,需要將其合併到 Master 分支,同時也要合併到 Develop 分支。

➤Hotfix分支:緊急修復的分支,是唯一可以從 Master 切出的分支,一旦修復了可以合併到 Master 分支和 Develop 分支。

從每個分支的功能和約定可以看出,它流程多約束多,對於小規模應用並不適合。 當然 GitFlow 有一些輔助工具 gitflow 可以自動化的完成這些任務,對於大型項目也很有幫助。

相關文章