Git 基礎指令 (二)

檢視目前設定

$ git config –list

設定帳密

$ git config –global user.name ‘cxxxxxxx’
$ git config –global user.email ‘cxxxxxxx@gmail.com’

查詢設定

$ git config –list

Git 初始化

讓 Git 知道這個資料夾要進行版控

  • 建立目錄
    $ mkdir git-practice
    $ cd git-practice
  • git 初始化
    $ git init (自動建立一個.git 目錄)

Git 重要區塊

  • 工作目錄 (working)
  • 暫存區域 (staging)
  • 儲存庫 (repository)

它們並不是被放到某個「目錄」,比較像是狀態的「改變」

新增檔案

  • 現在 git 狀態
    $ git status
    $ git add index.html (新增一個檔案的時候,status 還是 untracked file,之後從工作目錄改到暫存區域變成 new file )
    $ git commit -m “add index” (推到儲存庫,status 顯示 working tree clean)

add+commit 這樣的循環是一次存檔
commit 的訊息很重要,重點是這次存了什麼

  • 檢視記錄
    $ git log
    $ git log –oneline

Git 使用情境 1

  • 檔案不小心刪掉怎麼辦?
    $ rm index.html
    $ git checkout –index.html
    $ git checkout . (把這個目錄恢復成最近一次 commit 狀態)

  • 查詢檔案作者
    $ git blame index.html

  • git 裡新增目錄並進行版控
    由於 git 不會把空資料夾運算進版控,所以可以放一個隱藏檔
    $ touch hello-world/.keep

使用分支

為什麼要使用分支?

一般來說,我們分支只是貼在某個 commit 上的貼紙,例如下圖的 master :

  • 查詢分支
    $ git branch
  • 開新分支
    $ git branch xxxx (git branch 後面加上要開的分支名稱)

如果 HEAD 現在指向 master,意思就是「現在正在 master 分之上」

  • 切換分支
    $ git checkout cat (switched to master ‘cat’ )
  • 合併分支
    $ git merge cat

合併前:

合併後:

合併分支可看成只是在移動貼紙,但是這邊的合併還算單純,所以算是一種「快轉合併

  • 刪除分支
    $ git branch -d cat

    只是把 cat 貼紙撕掉
    commit 或是檔案不會因此受到影響
    Git 的本體是 commit

複雜一點的分支

如果是各自新增的 branch 就沒辦法快轉合併了,要怎麼處理?例如現在分別有一個 dog 跟 cat branch,假設現在 HEAD 指向 dog branch:

  • 合併 dog 跟 cat branch
    $ git merge cat

另一種合併分支的方式 (rebase)


以 rebase 合併的好處:合併的歷史比較簡潔乾淨,但相對 merge,就比較難看清楚整個檔案的分支記錄過程。

如何回到上一步 (返回之前狀態)

對 Git 常見的誤解是以為 reset 是刪除 commit 的意思。但是 Git 的世界事實上沒有刪除 Commit 的指令。一般我們把 reset 理解成「重新設定」,其實可以理解成 become,一種「我想要變成 XXX」的狀態。

原始檔案狀態:

reset 狀態:

參數狀態決定檔案去留,常見參數有

  • mixed
  • soft
  • hard

在使用 –hard 的時候,如果要再次恢復專案到上一步,要怎樣做?

reflog (reference log )

Git 會把移動軌跡都記錄在 reference log,如果使用 –hard 之後想要復原,可先查詢 reflog

絕對定位法

$ git reflog (查詢 commit 編號)
$ git reset xxxxx(commit 編號) –hard

相對定位

  • ^ Caret
  • ~ Tilde

但是如果每次都要輸入 commit 編號有點麻煩,可以把編號改成代號,例如回到現在狀態的前 2 步

例如回到上一個步驟

1
$ git reset HEAD^ --mixed

reset 跟 checkout 差別是什麼?

Git 使用情境

  • 回到上一個步驟的兩種作法
    $ git reset xxxxx(commit 編號) –mixed
    $ git reset HEAD^ –mixed

  • 合併發生衝突怎麼辦?

如果合併時遇到像是同一行 HTML 檔案的衝突,該怎麼辦呢?這時在 HTML 檔案中會出現像這樣:

我們先把那些標記都清除

並且回到終端機,這時 git status 如下,表示我們要再做一次存檔動作

$ git add index.html
$ git commit -m “merge payment and member”

  • 不小心把還沒合併的分支砍掉了,救得回來嗎?
    $git branch -D new_dog (不小心砍掉一個分支)
    $git branch newnew_dog 053fb21 (在 reflog 重新貼上 newnew_dog)

  • 某個分支的某個 commit 做得不錯想收進來,但又不想合併整個分支
    使用 cherry pick 指令

使用標籤

什麼時候會使用標籤?在 Git,「標籤(tag)」是一個指向某一個 Commit 的指標。通常在開發軟體有完成特定的里程碑,例如軟體版號 1.0.0 或是 beta-release 之類的,這時候就很適合使用標籤做標記。
假設目前的 Commit 紀錄如下:

1
2
3
4
5
6
7
8
9
10
11
$ git log --oneline
db3bbec (HEAD -> master) add fish
930feb3 add pig
51d54ff add lion and tiger
27f6ed6 add dog 2
2bab3e7 add dog 1
ca40fc9 add 2 cats
1de2076 add cat 2
cd82f29 add cat 1
382a2a5 add database settings
bb0c9c2 init commit

想在 add lion and tiger 這個 Commit(51d54ff)打上一個 big_cats 的標籤:

1
$ git tag big_cats 51d54ff

修改歷史紀錄

修改 Commit 訊息 (圖型介面)

這裡使用的指令一樣是 rebase 但多了互動式操作,在圖型介面的位置如下。操作後可以修改

點擊之後可選擇要修改的地方
修改訊息之後,被修正的地方,還有在它後面的訊息的 Changeset 都會被改變

修改結果

修改 Commit 訊息 (終端機)

$ git rebase -i f66ba66 (意思是要修改後退到這個 commit 編號為止的歷史)

每一次的 rebase ,就算只改一個字,也會改變隨後全部的歷史紀錄

刪除或調整 commit 順序

Powered by Hexo and Hexo-theme-hiker

Copyright © 2013 - 2020 CYC'S BLOG All Rights Reserved.

UV : | PV :