重新搞懂Git,掌握日常命令和基本操作

1、git

Git 是一個免費的開源分佈式版本控制系統,旨在快速高效地處理從小型到超大型項目的所有內容。
Git 易於學習,佔用空間很小,性能快如閃電。它超越了Subversion,CVS,Perforce和ClearCase等SCM工具,具有廉價的本地分支,方便的暫存區域和多個工作流程等功能。

2、git&平臺

git 是一個工具,是基礎設施。我們平時說的git就是純粹指git工具和其功能。但是我們常見github、gitlable、gitee等平臺。
不要把他們和git劃等號,因爲git不用這些平臺也可以在本地作爲你自己的一個版本管理工具。這些平臺是爲了解決多人合作的雲平臺,使用Git作爲代碼管理工具,並在此基礎上搭建起來的Web服務。

3、git開發流程

同2一樣git只是一種工具,他並沒有什麼工作流程。日常開發中我們爲了更好的協作產生了一些git開發流程規範。這種規範或者風格叫git workflow。
目前比較知名的有git-flow 、github-flow 、gitlable-flow。

  • git-flow

image
Git Flow 主要是依靠五種分支,master,develop,feature branchs ,release branchs , hoxfixes來進行協作,因爲比較複雜,所以並沒有那麼多人用。

  • github-flow

image

github-flow 只有個主幹/長期分支,master分支用來”持續發佈“使用,但是由於只有主分支所以發佈不穩定,master通常會設置 protected 分支保護,只有有權限的人才能推送代碼到 master 分支。我們常用的github平臺就是採用該流程,其中特色就是Pull Request 方式。如果你要修改需要Pull Request 然後進行溝通和code review才能由有權限的人合併進去。當然gitlable平臺你也能按照這種方式進行組織,他的Merger Request相當於Pull Request。

  • gitlable-flow

image

基於環境的的分支模型——面向持續發佈模型,有master,同時還有Pre-Production、Production分支用於維護髮布在不同環境上的代碼。
採用上游到下游流動的方式,大家都在master上進行開發,當要發佈的時候將master分支合併到Pre-Production測試通過後再合併到Production進行發佈。如果有bug需要從master向下遊合併,除非特殊情況需要直接在其它分支上修改。

4、git操作

我們學習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管理,那麼該文件夾下的三個部分就形成了。至於爲什麼需要三個部分,就像兩口子吵架需要一箇中間人調節,有些事情可以先和中間人商量確定好後再傳達給對方,減少衝突。
image

git是基於分支管理的,默認分支就Master分支,爭對於分支我們可以做那些操作呢?

  • git pull/git fetch/git push
    git pull 拉取遠端的最新提交到本地,並與本地當前分支合併更新所有區。
    git fetch 拉取遠端的最新提交到本地,不會自動合併,也不會更新工作區。
    git push 推送本地倉庫到遠程倉庫,推送的是本地版本庫裏面的內容,如果工作區或者暫存區沒提交則不會提交。

  • git add

# 添加一個文件 xx 到暫存區,多個文件以空格隔開
git add xx
# 添加全部文件到暫存區
git add .
  • git commit
# 提交暫存區的文件到本地倉庫,並添加提交備註
git commit -m '備註'
# 相當於 git add . 加上 git commit -m '備註',也就是直接從工作區一步完成提交
git commit -am '備註'
  • git log
#查看所有提交記錄
git log

#查看最近10條記錄
git log -n10
  • git tag
    tag就是標籤,常用來標記版本,相當於commit的一個標記。
# 創建一個標籤,默認打在最新提交的commit上
git tag [tagname]

# 創建一個標籤,在指定commitid上
git tag [tagname] [commitId]

# 查看標籤列表
git tag

#提交所有tag到遠端,因爲git push不會推送標籤
git push origin --tags
  • git reset
    git reset 用來重置到過去的某個版本,有五種模式(--mixed、--soft、--hard、--merge),重置後不要的版本就找不回來了。
# 重置並撤銷 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
  • git restore
# 撤銷上一次 commit 之後所有文件的修改,即撤銷暫存區
git restore .

# 把暫存區的 xx 重新放回工作區,和上面的 git reset HEAD xx 作用一樣
git restore --staged xx
  • git revert

和git reset類似,只是會保留不要的版本。

# 還原上次提交
git revert HEAD

# 還原某次提交
git revert commitID
  • git diff

比較差異

# 工作區和暫存區比較
git diff

# 工作區和版本庫最後版本比較
git diff head

# 暫存區和版本庫比較
git diff –cached
  • git checkout
    checkout命令用於版本庫或者暫存區域中撤銷更改到工作目錄,同時也可用於切換分支。爲了記憶錯亂避免混亂,我通常不用改操作,因爲對於撤銷完全可以用reset和restore,而對於分支切換可以用switch,他們從語義上來說更貼切。所以這個操作你可以不用,我也難得記!

以上這些就是操作某一個分支的基本命令,我們說了git是分支管理,那麼多個分支呢。接下來我們就介紹一些多分支之間操作的命令。多分支是爲了控制不同工作和並行工作,分支的建立可以是本地的,也可以是和遠端某個分支關聯的(這個遠端可以是任意分支)。所以git是靈活的,遠端和本地我們任然要區分開。

  • git branch
# 創建本地分支newbranch,但是不切換到該分支,仍然停留在當前分支
git branch newbranch

# 創建newbranch分支,並切換到newbranch分支上去
git branch -M newbranch

# 新建一個分支,與指定的遠程分支建立關聯
git branch --track [newbranch] [remote-branch]

# 刪除本地newbranch分支
git branch -d newbranch
  • git switch
# 切換到xx分支
git switch xx
  • git stash
    當我們切換到不同分支進行工作的時候,可能當前分支的修改我們還沒完成,但是又要緊急處理另外一個分支,此刻的修改如果不提交(git add -> git commit)。那麼切換的時候是阻止我們切換的,提示修改未提交或者隱藏,git stash就是用來隱藏分支工作區修改但不想提交的。將修改git stash後可以生成一個編號,等我們處理完切回來得時候就可以取出該修改還原到工作區並刪除隱藏。
    而這個功能的前提就是你要知道不同分支上的修改在你提交的版本庫之間是有差異性的,比如文件a.txt 我們添加到master分支,然後提交,然後你切換到newbranch分支上是沒有a.txt的。如果b.txt在兩個分支上都有,那麼在其中一個修改了提交後,在另外一個分支b.txt文件你是看不到修改的。
    注意:只有提交的文件纔會進入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}

  • git merge
    既然不同分支有不同的版本,我們可能需要合併分支的差異。比如我們要將newbranch的分支合併到master上,如果我們當前不在master分支,那麼我們需要先switch到master分支。
# 把newbranch分支合併到master分支
git merge newbranch

  • git rebase
    rebase 和 merge作用都是一樣的,區別是rebase 沒有分叉記錄,他們合併後兩個分支的HEAD都指向最新的版本,merge的提交歷史更完整。
# 把newbranch分支變基到master分支
git rebase newbranch

  • git cherry-pick

當我們要合併某個分支上的特定提交版本,我們可以使用git cherry-pick將某分支commitID版本合併到當前分支。

#合併其它分支的commitID
git cherry-pick commitID

整篇就是關於git介紹和git容易混淆的概念及命令,包括日常的基本操作。如果其它進階和騷操作,可以查看文檔或搜索,一般來說掌握這些足夠了,其它需要再去查就行。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章