重學Git(一)

一、最最最基礎操作

# 初始化倉庫
git init

# 添加文件到暫存區
git add readme.md

# 提交
git commit -m 'wrote a readme file'

二、簡單的時空穿梭

1. 文件修改後,查看狀態

修改 readme.md 文件,查看狀態

image.png

git status 命令告知,已經對文件修改但仍未提交暫存區,下一步運用 git diff readme.md 對文件狀態進行比較,比較結果顯示新的文件比舊的文件新增兩行

image.png

git add readme.md 後,提示文件已提交暫存區,下一步需要 commit

image.png

提交後再次查看 status

image.png

2. 查看過去

再次修改並提交,用 git log 命令查看版本

image.png

對於 git log 命令,可以添加參數從而更加清晰展示

git log --oneline --graph

image.png

此外也可以在 git gui 中更加清晰查看版本變動

image.png

3. 回到過去

git 中,運用 Head 代表當前版本,用 Head^ 代表上一個版本,用 Head^^ 代表上上個版本,如果回退過多,如要回退上一百個版本,則可使用 Head-100

image.png

回退版本後查看,發現只剩下了兩個版本

image.png

此時發現已找不到第三個版本的 commit id,如果此時恰好也沒有其他歷史記錄獲取 commit id,可以通過命令 git reflog 獲取完整的記錄

image.png

找到 commit id 後再次回到第三個版本

image.png

三、工作區、暫存區與版本庫

image.png

1. git diff 差異比較

# 1. 比較工作區與暫存區
# 當工作區有改動,暫存區為空,比較工作區與最後一次commit的共同文件
# 當工作區有改動,暫存區不為空,比較工作區與暫存區的共同文件
git diff

# 2. 比較工作區與HEAD
git diff HEAD --filename

# 3. 比較暫存區與HEAD
# 比較的是所有不同文件的增刪改
git diff --cached
git diff --staged

# 4. 比較兩個不同版本
git diff 211ba2 2948ac2 --filename

2. 撤銷工作區的修改

如果需要撤銷工作區的修改,將工作區文件還原成暫存區的狀態,運用 git checkout -- file 命令,可以還原修改文件到與暫存區相同的狀態。

image.png

如果不但修改了工作區,並且已進行 add 到暫存區的操作,則可運用 git reset HEAD <file> 將暫存區修改撤銷掉

image.png

還原後則撤銷了該文件的 add,此時可再用 git checkout -- file 命令,還原工作區該文件的更改。

3. 刪除文件

# 刪除工作區的文件
rm filename

# 刪除工作區與暫存區的文件,可以運用-r進行遞歸刪除
git rm filename

# 只將文件存暫存區刪除
git rm --cached filename

三、git 分支管理

通過創建新分支,可以在團隊開發中在自己的分支中進行開發,而不影響其他的分支,在開發完成後可以將自己的分支一次性合併到原有的分支上,不會影響團隊其他人的工作。

1. 分支創建

# 創建並切換分支到「dev」
git checkout -b dev
# 相當於如下兩條命令的合併
git branch dev  # 創建分支
git checkout dev  # 切換分支

# 查看目前所處分支
git branch

# switch命令也可以創建新的分支
git switch -c dev

操作創建 dev 分支,並切換;在 dev 分支對 readme 文件進行操作,新增一行並提交;重新切換回 master 分支,發現 readme 文件並無剛剛更新的內容

image.png

運用 git merge 命令,將剛剛在 dev 的更改合併到 master

image.png

再次查看 readme 文件,發現更新已合併。

2. 衝突

如果同時對 master 分支和 dev 分支新增一行並提交,在合併時會產生衝突,無法 automerge:

解決衝突詳見“5. 衝突處理”

image.png

3. 刪除分支

在完成某一部分的開發後,如果此分支之後不會再使用,則可對該分支進行刪除。此時,如果已完成 merge 操作的分支可以直接刪除,如果分支沒有完成 merge 操作,則會進行提示:

image.png

4. 切換分支的正確姿勢

切換分支可以使用 git checkout <branch>,而 git checkout 這一命令同樣也可用於恢復工作樹。

git checkout 的用法****總結

  1. 檢出指定文件
    從暫存區檢出某一文件;如果暫存區為空,這該文件回滾到最近一次提交狀態,該命令常用於對某一文件修改的撤銷(上文提到);如果添加 commit id 則回從某一次特定提交中檢出某一文件。

    git checkout [commit id] [--] <paths>
    
  2. 創建並切換分支
    如上文提到用法,如果-b 更改為-B,則會強制創建並覆蓋分區

    git checkout -b <new_branch_name>
    
  3. 新建一個無 log 歷史的分區
    如果當前分支經多次提交,log 歷史過長,則可創建一個無 log 歷史的新分支,但分支內容齊全

    git checkout --orphan <new_branch_name>
    
  4. 切換分支時將修改內容打包合併
    在切換分支時可以利用該命令,將修改內容打包合併,同步到切換的分支

    git checkout --merge <branch_name>
    
    • 容易造成衝突
    • 造成修改內容丟失
  5. 分支差異比較
    比較兩個分支之間的差異,並提供交互介面進行操作

    git checkout -p <branch_name>
    

因此,更加推薦使用 git switch 命令切換分支,避免命令混淆。

5. 衝突處理

如果分支某一個文件內容存在衝突,在合併分支時無法直接合併,這時可以用編輯器打開合併衝突產生的文件,根據提示增刪需要的內容,再次 add-commit 提交,處理衝突

image.png

運用 git log 命令查看分支合併情況

image.png

6. 強制禁用 Fast Forward

禁用 Fast Forward 模式進行分支合併,會在合併時新增一個 commit

image.png

image.png

image.png

7. 緊急任務下 stash 當前工作區

如果在開發過程中,需要處理緊急任務,當前分支只進行了一半,還沒有辦法提交,此時可以運用 git stash 命令,將當前工作區暫存。當完成緊急任務後,運用 git stash pop 命令就可還原到之前進行了一半的工作區

image.png

在實際運用中,可以如同 commit 命令一樣,給 stash 添加 message,便於區分

image.png

如果想多次運用 stash,而不刪除,則可用 apply 命令代替 pop

8. Bug 修復後直接運用

如果 master 分支上存在的一個 Bug 得到了修復,而 dev 分支是由 master 分支 Bug 修復前的版本創建的,為了避免重複操作,我們可以通過 git cherry-pick 命令,將一個特定的提交複製到當前分支。

如修復 Bug 的提交版本為 e2d9109,則在 testbranch 分支上運用上述命令,則複製了 Bug 修改的提交到 testbranch 分支

image.png

9. Feature 分支

在開發中,會有不斷的新功能增加,這其中不乏有很多是實驗性質的,為了不與主分支混淆,最好每新增一個新功能,就添加一個 feature 分支;在開發完畢後,與主分支進行合併,並刪除該 feature 分支。

如果該實驗功能廢棄,則可使用 git branch -D <feature_branch_name> 強制刪除該 feature 分支。

四、標籤管理

為了更加清晰地區分每一次 commit,通常會對 commit 打標籤。

默認情況下,使用 git tag <tagname> 是對頭指針對應的分支打標,也可指定某個 commit id 進行打標。

image.png

使用 git tag 查看所有打過的標籤:

image.png

曾經對 commit 打過的標籤也會顯示在 git log 中

image.png

也可使用 git tag -a <tagname> -m <tagcommit> [<commit id>] 的形式,對某一個 tag 新增說明,使用 git show <tagname> 則可看到對某一個 tag 增加的說明文字:

image.png

如果標籤打錯,可以進行刪除操作

image.png

參考資料

廖雪峰 git 教程

Tags: