【git教程】快速掌握git

UnderTurrets發表於2024-09-01

@

目錄
  • 1.本地版本控制
    • 1.1 在一個目錄下建立倉庫git init
      • 1.1.1 刪除倉庫
    • 1.2 暫存區git add
    • 1.2.1 儲存到暫存區
    • 1.2.2 撤銷暫存區檔案
    • 1.3 提交與回退
      • 1.3.1 提交到版本庫git commit
      • 1.3.2 回退git reset
    • 1.4 刪除
      • 1.4.1 刪除未跟蹤的檔案git clean
      • 1.4.2 刪除已跟蹤的檔案git rm
    • 1.5 檢查
      • 1.5.1 檢視當前倉庫狀態git status
      • 1.5.2 檢視操作日誌git reflog
      • 1.5.3 檢視此分支的提交日誌git log
    • 1.6 分支管理git branch
      • 1.6.1 建立分支
      • 1.6.2 切換分支
      • 1.6.3 檢視分支
      • 1.6.4 合併分支(可能出現衝突,如兩個分支都修改了同一檔案)
      • 1.6.5 刪除分支
    • 1.7 模組管理git submodule
      • 1.7.1 新增子模組
      • 1.7.2 檢視子模組
      • 1.7.3 拉取子模組
      • 1.7.4 從遠端更新子模組
      • 1.7.5 刪除子模組
  • 2.遠端控制
    • 2.1 獲取本裝置的ssh金鑰
    • 2.2 與遠端庫建立或刪除連線git remote
      • 2.2.1 建立連線
      • 2.2.2 刪除連線
    • 2.3 繫結此分支到遠端庫的某一分支
    • 2.4 提交到遠端庫的某一分支git push
    • 2.5 標籤管理git tag
      • 2.5.1 打標籤
      • 2.5.2 刪除標籤
      • 2.5.3 檢視某一標籤
      • 2.5.4 檢視所有標籤
      • 2.5.5 推送標籤到遠端庫
      • 2.5.6 刪除遠端標籤
    • 2.6 克隆git clone
      • 2.6.1 克隆預設分支
      • 2.6.2 克隆指定分支
  • 3.多人協作
    • 3.1 版本落後於遠端庫而推送失敗
    • 3.2 老版本bug修復流程


1.本地版本控制

1.1 在一個目錄下建立倉庫git init

git init

1.1.1 刪除倉庫

rm -rf .git

1.2 暫存區git add

1.2.1 儲存到暫存區

  • 儲存某個檔案的修改到暫存區
git add <filename>
  • 全部儲存到暫存區
git add .

1.2.2 撤銷暫存區檔案

  • 撤銷某一個暫存區檔案
git reset HEAD <filename>
  • 撤銷所有暫存區檔案
git reset HEAD~0

1.3 提交與回退

1.3.1 提交到版本庫git commit

git commit -m "附加資訊"

1.3.2 回退git reset

git reset--soft--mixed--hard三種引數可選,其中--mixed是預設方式,不同含義如下:

  • --soft:只重置HEAD指標的位置
  • --mixed:重置HEAD指標的位置,並清空git add命令的暫存區
  • --hard:重置HEAD指標的位置,清空git add命令的暫存區,並重置工作空間所有的更改

以下是git reset的幾種用法:

  • 回退專案到指定版本
git reset <version>
  • 回退專案到上一個版本
git reset HEAD~1
  • 回退單一檔案到上個版本
git reset HEAD~1 <filename>
  • 回退到上n個版本
git reset HEAD~n

1.4 刪除

1.4.1 刪除未跟蹤的檔案git clean

# 刪除 untracked files
git clean -f
 
# 連 untracked 的目錄也一起刪掉
git clean -fd
 
# 連 gitignore 的untrack 檔案/目錄也一起刪掉 (慎用,一般這個是用來刪掉編譯出來的 .o之類的檔案用的)
git clean -xfd
 
# 在用上述 git clean 前,強烈建議加上 -n 引數來先看看會刪掉哪些檔案,防止重要檔案被誤刪
git clean -nxfd
git clean -nf
git clean -nfd

1.4.2 刪除已跟蹤的檔案git rm

git rm <filename>

1.5 檢查

1.5.1 檢視當前倉庫狀態git status

git status

1.5.2 檢視操作日誌git reflog

git reflog

1.5.3 檢視此分支的提交日誌git log

git log
  • 經過回退後,使用"git log"就看不到回退前的版本號了,但使用"git reflog"就可以檢視

1.6 分支管理git branch

1.6.1 建立分支

git branch <name of local branch>

1.6.2 切換分支

git switch <name of local branch>

1.6.3 檢視分支

git branch

1.6.4 合併分支(可能出現衝突,如兩個分支都修改了同一檔案)

git merge <name of local branch>
git merge --no-ff -m "附加資訊" <name of local branch>

1.6.5 刪除分支

git branch -d <name>
git branch -D <name>#強行刪除,慎用

1.7 模組管理git submodule

1.7.1 新增子模組

git submodule add <URL of the submodule> <folder's name of the submodule>

使用此命令後,專案根目錄下會自動新增.gitmodules檔案,用來存放子模組的資訊;同時,也會自動下載子模組倉庫的主分支最新版本並用指定名字的目錄去裝載,如果未給出指定的名字,則使用子模組倉庫的預設名字。

使用子模組的意義在於便捷地引用其他人的庫。如果你需要對別人的庫進行自己的修改,那麼你完全沒有必要使用submodule,因為你沒有修改別人庫的許可權,你可以直接把別人的庫克隆下來之後提交。如果你只是想使用而不需要更改,那麼推薦你使用submodule,這樣的話,在提交時,主專案不會記錄子模組的更改。

1.7.2 檢視子模組

git submodule

1.7.3 拉取子模組

  • 在克隆一個專案時直接拉取:
git clone https://github.com/yyy/xxx.git --recursive
  • 在克隆之後再拉取:
git submodule init
git submodule update

這兩個命令也可以合併為一個:

git submodule update --init

如果子模組又巢狀了子模組,則需要新增--recursive引數

git submodule update --init --recursive

1.7.4 從遠端更新子模組

  • 法一:直接在子模組目錄下拉取
git pull
  • 法二:專案根目錄下執行:
git submodule update --remote <name of the submodule which you want to update>

若不給出需要更新的子模組名字,則預設更新所有子模組。

拉取之後,記得提交主專案的更改。

1.7.5 刪除子模組

先登出並清楚快取:

git submodule deinit -f <submodule's name>
git rm --cached <submodule's name>

然後檢查子模組目錄和.git/module中的子模組條目是否刪除:

rm -rf .git/modules/<submodule's name>
rm -rf <path/to/submodule>

再檢查配置檔案中的子模組條目是否刪除

gedit .gitmodules
gedit .git/config

最後提交即可,示例如下:

git commit -m "Remove submodule"

2.遠端控制

2.1 獲取本裝置的ssh金鑰

ssh-keygen -t rsa -C "email@*.com"
  • 金鑰在Linux系統中儲存於/usr/local/home/.ssh

2.2 與遠端庫建立或刪除連線git remote

2.2.1 建立連線

git romote add <name of the remote repository> <SSH offered by the website>

2.2.2 刪除連線

git remote rm <name of the remote repository>

2.3 繫結此分支到遠端庫的某一分支

git branch --set-upstream-to <name of local branch> <name of the remote repository >/<name of remote branch>

2.4 提交到遠端庫的某一分支git push

git push <name of the remote repository> <name of local branch>
  • 如果遠端庫沒有對應名字的分支,那麼會在遠端庫自動建立一個同名分支
  • 如果不給定<name of local branch>引數,那麼會按照git branch --set-upstream-to繫結的關係進行推送。如果未繫結,則推送失敗

2.5 標籤管理git tag

2.5.1 打標籤

git tag <name of tag> <version>
git tag -a <name of tag> -m "附加資訊" <version> #帶說明資訊的標籤

2.5.2 刪除標籤

git tag -d <name of tag>

2.5.3 檢視某一標籤

git show <name of tag>

2.5.4 檢視所有標籤

git tag

2.5.5 推送標籤到遠端庫

git push <name of the remote repository> <name of tag>
git push <name of the remote repository> --tags #一次性推送所有標籤

2.5.6 刪除遠端標籤

git push <name of the remote repository>:refs/tags/<name of tag>

2.6 克隆git clone

2.6.1 克隆預設分支

git clone <URL>

2.6.2 克隆指定分支

git clone -b <name of remote branch> <URL>

3.多人協作

3.1 版本落後於遠端庫而推送失敗

  1. 先用git branch --set-upstream-to 繫結到指定遠端分支
git branch --set-upstream-to <name of local branch> <name of the remote repository >/<name of remote branch>
  1. 用git pull指令:抓取所繫結分支的最新版本並嘗試merge。若出現衝突要手動解決
git pull <name of remote repository> <name of remote branch>:<name of local branch>
  1. 最後提交併推送即可
git commit -m "附加資訊"
git push <name of the remote repository>

3.2 老版本bug修復流程

  1. 儲存此分支的工作現場
git stash
  1. 切換到有bug的分支,從這個有bug的分支建立一個新分支修復bug,然後合併,儲存好合並時給出的版本號
  2. 用這個版本號,對所有存在這個bug的分支做一次相同的提交
git cherry-pick <version>
  1. 回到工作現場,檢視貯藏列表並恢復
git stash list #列出貯藏列表
git stash apply stash@{n} #根據序號n恢復到指定工作現場
git stash drop stash@{n}#根據序號n刪除指定工作現場

本文由部落格一文多發平臺 OpenWrite 釋出!