Git 遊戲攻略(上篇)- 基礎&高階&整理提交記錄

germo發表於2021-09-09

一、基礎篇:循序漸進地介紹 Git 主要命令

1. Git Commit

如果說一個專案開發過程中所有的提交記錄構成一個樹,那麼commit 命令就是樹的一個個節點。首先遊戲介面是這樣的,第一關要求我們提交兩次,也就是建立兩個節點。


圖片描述



git commit -m "提交記錄,建立節點c2": 執行後就建立了c2節點


圖片描述



git commit -m "提交記錄,建立節點c3": 執行後就建立了c3節點


圖片描述


OK ,你成功透過第一副本的第一關卡


2. Git Branch

如果說commit 提交出一個個節點,一直下去,那他就是一柱擎天。樹嘛,總是要開枝散葉,branch 就能讓它發一個枝


圖片描述



git branch bugFix:這樣我們的樹就在master中發芽了,但也只是萌發


圖片描述



git checkout bugFix:透過checkout切換到當前枝,然後bugFix枝就可以生長了


圖片描述



雖然關卡,這裡就結束了,不過為了更形象,這裡在bugFix枝中提交一次看看


圖片描述



3. Git Merge

當一個bug被修復後,一條枝的使命就完成了,這時就可以將它合併到主支上。
該副本過程是新建一個分支,然後將其合併到主支上。


圖片描述



git checkout -b bugFix: 可以直接checkout -b來建立分支並切至


圖片描述



git commit -m "修復bug":當bug修復完畢,就可以將其提交


圖片描述



git checkout master:然後切回主支


圖片描述



git commit -m "bug修復完畢,主線提交":在主支提交後出現c3節點


圖片描述



git merge bugFix: 透過merge命令可以指定分支合併到當前支m主分支會產生c4

圖片描述



4. Git rebase

第二種合併分支的方法是 git rebase。Rebase實際上就是取出一系列的提交記錄,“複製”它們,然後在另外一個地方逐個的放下去。

git checkout -b bugFix
git commit -m "修復bug"
git checkout master
git commit -m "bug修復完畢,主線提交"
git checkout bugFix
git rebase master


圖片描述



圖片描述



圖片描述



圖片描述



圖片描述



圖片描述



圖片描述



二、高階篇

HEAD 總是指向當前分支上最近一次提交記錄。
1.分離HEAD : 從 bugFix 分支中分離出 HEAD 並讓其指向一個提交記錄

使用checkout 可以切換到一個節點,此時記錄頭HEAD指向該節點

圖片描述


git checkout C4: 記錄頭HEAD指向C4


圖片描述



雖然該副本就此結束,但是我還是忍不住再提交一個記錄看看,可見生成了C5並且頭下移


圖片描述



2.相對引用^

每個節點都有一個SHA1值與之對應,而我們可以透過該SHA1值回到某個節點,但SHA1太長了,可以使用^上移一步。
該副本需要:切換到 bugFix 的父節點,初始如下:


圖片描述



git checkout bugFix^:切換到 bugFix 的父節點


圖片描述



雖然該副本就此結束,但是我還是忍不住再提交一個記錄看看,可見下該頭之下生成了C5並且頭下移


圖片描述



3.相對引用~

如果要移動多步,用^就比較繁瑣,這時可以使用~來指定上移多少步
該副本需要:移動 HEAD,master 和 bugFix 到目標所示的位置。

圖片描述


可見結果中master指到C6,bugFix移到C0,HEAD指向C1


git branch -f master C6:會將 master 分支強制指向C6

圖片描述



git checkout HEAD~1:會將頭標上移一個到C1

圖片描述



git branch -f bugFix HEAD~1: 會將 bugFix 分支強制指向頭標的上一位,即C0。本關透過。


圖片描述



4.撤銷變更
git reset 透過把分支記錄回退幾個提交記錄來實現撤銷改動(遠端分支是無效)
git revert 為了撤銷更改並分享給別人,需要使用 git revert

該副本需要:分別撤銷 local(本地) 分支和 pushed(遠端) 分支上的最近一次提交。  初始如下:


圖片描述



git reset HEAD~1 :local(本地) 分支撤銷一步到達C1


圖片描述



git checkout pushed:將分支切到pushed(遠端) 分支


圖片描述



git revert HEAD: 此時 C2' 的狀態與 C1 是相同的,達到撤銷目的


圖片描述


Ok,這樣你就會了Git的90%,就像天才是百分之九十九的努力和百分之一的靈感,然而那百分之一卻是你最大的門檻....


三、整理提交記錄

1.Git cherry-pick
git cherry-pick <提交號>...
如果你想將一些提交複製到當前所在的位置(HEAD)下面的話,記住 cherry-pick

該副本需要: 將三個分支中的提交記錄複製到 master 上,下面看起來挺複雜,不過別怕:


圖片描述



git cherry-pick C3 C4 C7: 將 C3 C4 C7複製到,當前所在的位置(master)


圖片描述


怎麼樣,就這麼簡單。


2.Git rebase
你知道錄提交記錄的SHA1值時, 用 cherry-pick 再好不過。 but, 但是如果不清楚你想要的提交記錄的雜湊值呢? 記住: rebase 互動式 rebase 指的是使用帶引數 --interactive 的 rebase 命令, 簡寫為 -i 複製程式碼

該副本需要:將C3,C5,C4節點依次複製至C1下


圖片描述



git rebase -i overHere:就可以開啟一個互動皮膚。


圖片描述



圖片描述


OK ,講得也挺多的,之後的知識。


四、寫個小例子

經過上篇,你一定對git 有所瞭解了,本文不再是攻略,而是一個實際測試:

1.初始化git倉庫

git init mixed: 將mixed資料夾使用git管理

圖片描述




2.新增檔案到git倉庫

git add HelloWorld.java:新增檔案,git add .會新增資料夾內所有檔案

---->[在mixed資料夾建立HelloWorld.java檔案]----
public class HelloWorld {

    public static void main(String[] args) {
        System.out.println("Hello World");
    }
}

3.提交檔案到git倉庫
toly:mixed mac$ git commit -m "HelloWorld 初始專案"
[master(根提交) 0eb09bc] HelloWorld 初始專案
 1 file changed, 7 insertions(+)
 create mode 100644 HelloWorld.java

git commit -m "提交的描述"下面是提交後的反饋,0eb09bc代表唯一的SHA1,用於節點的身份標識
可見第一次提交之後會形成一個master主支和HEAD節點。


圖片描述



在程式碼裡新增一個string2Int的方法,然後進行測試。

public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");
        System.out.println(result);
    }

    private static int string2Int(String num) {
        return Integer.parseInt(num);
    }
}

結果表現良好,現在你要去睡覺了。每晚躺床第一句,程式碼沒提趕快去
看到了節點增加完成,你就安心地睡覺了

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "增加字串轉數字功能"
[master 0c4056a] 增加字串轉數字功能
 1 file changed, 6 insertions(+), 1 deletion(-)


圖片描述

然後你思來想去,不行,還沒加註釋呢,明早起來看不懂了怎麼辦

public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");//使用方法
        System.out.println(result);//列印
    }
    /**
    * 將一個字串轉化成數字
    * @param num 待轉字串
    * @return 數字
    */
    private static int string2Int(String num) {
        return Integer.parseInt(num);
    }
}

於是你修改了檔案,新增註釋,再提交,成功出現第三個節點,終於可以安心睡覺了。

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "增加註釋"
[master dcf9cd3] 增加註釋
 1 file changed, 7 insertions(+), 3 deletions(-)

圖片描述



4.建立分支

這時你發現有bug,轉換"aaa"有異常。修復bug,先建分支,以免改廢了影響主支。
git checkout -b bugFix ,這樣就可以建立分支,並切換到該分支,你就可以愉快地抓小蟲了,用導彈,大炮,原子彈什麼的轟炸bug,都不會影響到你的主支。

toly:mixed mac$ git checkout -b bugFix
切換到一個新分支 'bugFix'

之後經過不懈努力,修復了bug,其間提交了兩次,加了異常捕捉。

toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "修復bug提交點1"
[bugFix 246b11f] 修復bug提交點1
 1 file changed, 13 insertions(+), 5 deletions(-)
toly:mixed mac$ git add .
toly:mixed mac$ git commit -m "修復bug提交點2"
[bugFix f9299a6] 修復bug提交點2
 1 file changed, 1 insertion(+)

圖片描述


public class HelloWorld {

    public static void main(String[] args) {
        int result = string2Int("1994");//使用方法
        System.out.println(result);//列印
    }
    /**
     * 將一個字串轉化成數字
     * @param num 待轉字串
     * @return 數字
     */
    private static int string2Int(String num) {
        int result =0;

        try {
            result = Integer.parseInt(num);
        } catch (NumberFormatException e) {
            System.out.println("喵了個咪,給老子傳數字");
            e.printStackTrace();
        } finally {
        }
        return result;
    }
}

5.切換分支與合併分支,檢視分支與刪除分支

現在仍在bugFix分支,既然bug已修復,那就回到master主支繼續開發,並且將bugFix支合併到主支上

toly:mixed mac$ git checkout master
切換到分支 'master'

toly:mixed mac$ git merge bugFix
更新 dcf9cd3..f9299a6
Fast-forward
 HelloWorld.java | 19 ++++++++++++++-----
 1 file changed, 14 insertions(+), 5 deletions(-)

透過git branch可以檢視當前分支情況,如果想看更多資訊,加-v

toly:mixed mac$ git branch
  bugFix
* master

toly:mixed mac$ git branch -v
  bugFix f9299a6 修復bug提交點2
* master f9299a6 修復bug提交點2

一個bug解決了,該分支也沒有必要了,就可以刪除分支。

toly:mixed mac$ git branch -d bugFix
已刪除分支 bugFix(曾為 f9299a6)。


圖片描述


這樣一套流程下來,bugFix既不會影響主線的程式碼,在bug修復後合併刪除,也就相當於bugFix從未出現過一樣。bug 如此,feature 也一樣,在某種意義上,兩者是非常類似的。(從不寫bug的人,手動滑稽)


6.git reflog 和 git log

如果你想檢視日誌,可以透過git refloggit log

toly:mixed mac$ git reflog
f9299a6 (HEAD -> master) HEAD@{0}: merge bugFix: Fast-forward
dcf9cd3 HEAD@{1}: checkout: moving from bugFix to master
f9299a6 (HEAD -> master) HEAD@{2}: commit: 修復bug提交點2
246b11f HEAD@{3}: commit: 修復bug提交點1
dcf9cd3 HEAD@{4}: checkout: moving from master to bugFix
dcf9cd3 HEAD@{5}: commit: 增加註釋
0c4056a HEAD@{6}: commit: 增加字串轉數字功能
0eb09bc HEAD@{7}: commit (initial): HelloWorld 初始專案
toly:mixed mac$ git log
commit f9299a6fe2e1e04fe5e334288fee737ebbf8d7b5 (HEAD -> master)
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:45:36 2019 +0800

    修復bug提交點2

commit 246b11fac86392f55a83feb41f6e674d644074a3
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:43:53 2019 +0800

    修復bug提交點1

commit dcf9cd3244926e2e3113713bc1465b823038fcdc
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:31:08 2019 +0800

    增加註釋

commit 0c4056af93721074324544ba4b562061e442dccd
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:21:11 2019 +0800

    增加字串轉數字功能

commit 0eb09bc5abc9c4f42401cf543306fe485e17acfa
Author: toly <1981462002@qq.com>
Date:   Sat Sep 28 14:04:16 2019 +0800

    HelloWorld 初始專案

7.版本回溯

git 最強大的功能之一在於可以版本回溯,讓你能在前線奮勇殺敵,沒有後顧之憂。
大不了搞不好,再退回來唄。如果你debug搞得一團糟,輕輕來一句:

git reset --hard 0c4056a


圖片描述


Git還有非常多的特性,這裡主要是想讓你對Git一個形象的認識,後面的路,還要自己走。



來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/1868/viewspace-2823806/,如需轉載,請註明出處,否則將追究法律責任。

相關文章