Git 是一個免費的開源分散式版本控制系統,旨在快速高效地處理從小型到超大型專案的所有內容。
Git 易於學習,佔用空間很小,效能快如閃電。它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具有廉價的本地分支,方便的暫存區域和多個工作流程等功能。
git 是一個工具,是基礎設施。我們平時說的git就是純粹指git工具和其功能。但是我們常見github、gitlable、gitee等平臺。
不要把他們和git劃等號,因為git不用這些平臺也可以在本地作為你自己的一個版本管理工具。這些平臺是為了解決多人合作的雲平臺,使用Git作為程式碼管理工具,並在此基礎上搭建起來的Web服務。
同2一樣git只是一種工具,他並沒有什麼工作流程。日常開發中我們為了更好的共同作業產生了一些git開發流程規範。這種規範或者風格叫git workflow。
目前比較知名的有git-flow 、github-flow 、gitlable-flow。
Git Flow 主要是依靠五種分支,master,develop,feature branchs ,release branchs , hoxfixes來進行共同作業,因為比較複雜,所以並沒有那麼多人用。
github-flow 只有個主幹/長期分支,master分支用來」持續釋出「使用,但是由於只有主分支所以釋出不穩定,master通常會設定 protected 分支保護,只有有許可權的人才能推播程式碼到 master 分支。我們常用的github平臺就是採用該流程,其中特色就是Pull Request 方式。如果你要修改需要Pull Request 然後進行溝通和code review才能由有許可權的人合併進去。當然gitlable平臺你也能按照這種方式進行組織,他的Merger Request相當於Pull Request。
基於環境的的分支模型——面向持續釋出模型,有master,同時還有Pre-Production、Production分支用於維護髮布在不同環境上的程式碼。
採用上游到下游流動的方式,大家都在master上進行開發,當要釋出的時候將master分支合併到Pre-Production測試通過後再合併到Production進行釋出。如果有bug需要從master向下遊合併,除非特殊情況需要直接在其它分支上修改。
我們學習git的時候不要把遠端倉庫和本地倉庫混淆在一起,如果你混淆在一起就會陷入到梳理他們的邏輯混亂當中。
我們說了遠端倉庫只是為了協同工作,我們可以把遠端倉庫當作是本地倉庫的映象,只是用於我們拉取和提交來同步檔案。
所以對於遠端倉庫的主要操作就是:
# 拉取遠端專案到本地
git clone https://url
#初始化本地 Git 倉庫,會生成一個 .git 隱藏資料夾
git init
#將本地專案關聯遠端倉庫
git remote add origin https://url
#上傳之前更新一下,確保沒有衝突,master 為分支名稱
git pull --rebase origin master
#新增目錄下所有發生改變的檔案到暫存區
git add .
#新增提交註釋資訊
git commit -m '註釋xxx'
#提交到 master 分支
git push -u origin master
以上就是基本的遠端倉庫和本地倉庫的操作,接著我們下面的操作都是爭對本地倉庫的講解,你需要了解git的基本知識,比如git有三個部分:工作區、暫存區、版本庫。
工作區就是我們操作檔案的地方,以windwos作為演示,當我們在一個資料夾下初始化了git管理,那麼該資料夾下的三個部分就形成了。至於為什麼需要三個部分,就像兩口子吵架需要一箇中間人調節,有些事情可以先和中間人商量確定好後再傳達給對方,減少衝突。
git是基於分支管理的,預設分支就Master分支,爭對於分支我們可以做那些操作呢?
git pull/git fetch/git push
git pull 拉取遠端的最新提交到本地,並與本地當前分支合併更新所有區。
git fetch 拉取遠端的最新提交到本地,不會自動合併,也不會更新工作區。
git push 推播本地倉庫到遠端倉庫,推播的是本地版本庫裡面的內容,如果工作區或者暫存區沒提交則不會提交。
git add
# 新增一個檔案 xx 到暫存區,多個檔案以空格隔開
git add xx
# 新增全部檔案到暫存區
git add .
# 提交暫存區的檔案到本地倉庫,並新增提交備註
git commit -m '備註'
# 相當於 git add . 加上 git commit -m '備註',也就是直接從工作區一步完成提交
git commit -am '備註'
#檢視所有提交記錄
git log
#檢視最近10條記錄
git log -n10
# 建立一個標籤,預設打在最新提交的commit上
git tag [tagname]
# 建立一個標籤,在指定commitid上
git tag [tagname] [commitId]
# 檢視標籤列表
git tag
#提交所有tag到遠端,因為git push不會推播標籤
git push origin --tags
# 重置並復原 git commit 以及 git add,保留工作區中所有修改
git reset --mixed commitID
# 重置並復原 git commit,但不復原 git add,保留工作區中所有修改
git reset --soft commitID
# 重置並復原 git commit 以及 git add,並且刪除工作區中所有修改
git reset --hard commitID
# 取消某次合併
git reset --merge commitID
# 提交到暫存區的內容退回到工作區,相當於復原 git add .
git reset HEAD
# 把暫存區的 xx 重新放回到工作區
git reset HEAD xx
# 重置到上一個版本
git reset --hard HEAD^
# 重置到上上一個版本,可以繼續到上一個
git reset --hard HEAD^^
# 重置到指定版本
git reset --hard commitID
# 復原上一次 commit 之後所有檔案的修改,即復原暫存區
git restore .
# 把暫存區的 xx 重新放回工作區,和上面的 git reset HEAD xx 作用一樣
git restore --staged xx
和git reset類似,只是會保留不要的版本。
# 還原上次提交
git revert HEAD
# 還原某次提交
git revert commitID
比較差異
# 工作區和暫存區比較
git diff
# 工作區和版本庫最後版本比較
git diff head
# 暫存區和版本庫比較
git diff –cached
以上這些就是操作某一個分支的基本命令,我們說了git是分支管理,那麼多個分支呢。接下來我們就介紹一些多分支之間操作的命令。多分支是為了控制不同工作和並行工作,分支的建立可以是原生的,也可以是和遠端某個分支關聯的(這個遠端可以是任意分支)。所以git是靈活的,遠端和本地我們任然要區分開。
# 建立本地分支newbranch,但是不切換到該分支,仍然停留在當前分支
git branch newbranch
# 建立newbranch分支,並切換到newbranch分支上去
git branch -M newbranch
# 新建一個分支,與指定的遠端分支建立關聯
git branch --track [newbranch] [remote-branch]
# 刪除本地newbranch分支
git branch -d newbranch
# 切換到xx分支
git switch xx
只有提交的檔案才會進入git跟蹤,如果c.txt我在master分支上建立了,但是它在工作區,我們切換到newbranch分支任然能看到它,這個時候誰先提交就記錄到誰的分支
#把當前分支的修改儲存隱藏起來
git stash
# 檢視stash列表
git stash list
# 取出stash中最近一次的修改並刪除stash記錄
git stash pop
# 取出指定stash
git stash apply stash@{0}
# 刪除指定stash
git stash drop stash@{0}
# 把newbranch分支合併到master分支
git merge newbranch
# 把newbranch分支變基到master分支
git rebase newbranch
當我們要合併某個分支上的特定提交版本,我們可以使用git cherry-pick將某分支commitID版本合併到當前分支。
#合併其它分支的commitID
git cherry-pick commitID
整篇就是關於git介紹和git容易混淆的概念及命令,包括日常的基本操作。如果其它進階和騷操作,可以檢視檔案或搜尋,一般來說掌握這些足夠了,其它需要再去查就行。
作者:孫泉
出處:https://www.cnblogs.com/SunSpring/p/17511746.html
如果你喜歡文章歡迎點選推薦,你的鼓勵對我很有用!
本文版權歸作者所有,轉載需在文章頁面明顯位置給出原文連結。