git相關問題解析,你想要的都有?

甜點cc發表於2022-12-20

官網文件: https://git-scm.com/doc

本地克隆遠端程式碼倉庫

  1. git clone 地址

本地同步全量歷史資料,克隆所有檔案的歷史記錄

  1. git clone 地址 —depth 1

本地同步預設分支最近n次的commit資訊,克隆預設分支master最近一次commit

  1. git clone 地址 —depth 1 —branch  dev

本地同步指定分支最近n次的commit資訊,克隆dev分支最近一次commit

第三種方式克隆下來只存在指定的分支,如果想要切換分支,使用下面的命令?

git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name

常用git命令(更新中...)

  1. 顯示所有提交過的使用者,按提交次數排序
git shortlog -sn
  1. 顯示指定檔案是什麼人在什麼時間修改過
git blame [file]

eg: git blame README.md

Git 中的分支是指向提交的指標,是從特定時間點開始的專案及其更改的快照

  1. 刪除本地分支

git branch -d local_branch_name

  1. 切換分支

將遠端分支拉取到本地(本地切換到遠端分支,存在遠端分支,需要在本地)
git checkout -b dev origin/dev

  1. 關聯遠端分支

將本地新建的分支與遠端分支相關聯(在當前分支下輸入以下命令)

git branch -u origin/分支名

其中origin/xxx xxx為遠端分支名

eg: git branch -u origin/master 本地分支關聯遠端master分支

或者使用 git branch --set-upstream-to origin/xxx 同樣可以關聯

  1. 檢視本地分支與遠端分支的對映關係(檢視關聯效果)

git branch -vv

  1. 撤銷本地分支與遠端分支的關係

git branch --unset-upstream

  1. 合併分支
git  checkout master    # 切換到master分支上
git pull origin master  # 把遠端分支pull下去,及時更新
git  merge dev          # 把dev分支的程式碼合併到master上
git status              # 檢視狀態
git push origin master  # push到遠端分支

?本地倉庫同時關聯多個遠端倉庫(gitee, github, gitlab...)

因為Git本身是分散式版本控制系統,可以同步到另外一個遠端庫,當然也可以同步到另外兩個遠端庫。

使用多個遠端庫時,我們要注意,git給遠端庫起的預設名稱是origin,如果有多個遠端庫,我們需要用不同的名稱來標識不同的遠端庫, 具體操作步驟如下:

  1. 先刪除已關聯的名為origin的遠端庫:
git remote rm origin
  1. 再關聯GitHub的遠端庫:
git remote add github git@github.com:all-smile/pc-web.git

注意: 遠端庫的名稱叫github,不叫origin了。

  1. 接著,再關聯Gitee的遠端庫:
git remote add gitee git@gitee.com:hey-u/pc-web.git

同樣注意,遠端庫的名稱叫gitee,不叫origin。

  1. 檢視遠端庫資訊
git remote -v
gitee   git@gitee.com:hey-u/pc-web.git (fetch)
gitee   git@gitee.com:hey-u/pc-web.git (push)
github  git@github.com:all-smile/pc-web.git (fetch)
github  git@github.com:all-smile/pc-web.git (push)
  1. 本地修改推送到遠端
  • 推送到GitHub
git push github master
  • 推送到Gitee
git push gitee master

也可以在使用NPM包管理工具的專案新增如下scripts指令碼

"scripts": {
    "pull": "git pull github master && git pull gitee master",
    "push": "git push github master && git push gitee master"
},

拉取/推送的時候使用

npm run pull
npm run push

將遠端 URL 從 HTTPS 切換到 SSH

  • 開啟 Terminal(終端)。
  • 將當前工作目錄更改為您的本地倉庫。
  • 列出現有遠端倉庫以獲取要更改的遠端倉庫的名稱。
git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git(fetch)
origin  https://github.com/USERNAME/REPOSITORY.git(push)
  • 使用 git remote set-url 命令將遠端的 URL 從 HTTPS 更改為 SSH。
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
  • 驗證遠端 URL 是否已更改。
git remote -v
origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)

將遠端 URL 從 SSH 切換到 HTTPS

  • 開啟 Terminal(終端)。
  • 將當前工作目錄更改為您的本地倉庫。
  • 列出現有遠端倉庫以獲取要更改的遠端倉庫的名稱。
git remote -v
origin  git@github.com:USERNAME/REPOSITORY.git (fetch)
origin  git@github.com:USERNAME/REPOSITORY.git (push)
  • 使用 git remote set-url 命令將遠端的 URL 從 SSH 更改為 HTTPS。
git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
  • 驗證遠端 URL 是否已更改。
git remote -v
origin  https://github.com/USERNAME/REPOSITORY.git (fetch)
origin  https://github.com/USERNAME/REPOSITORY.git (push)

設定git提交使用者資訊

這裡牽涉到提交程式碼的一些資料統計,瞭解一下會很有幫助的,可以看下我的這篇文章:
?語雀:github/gitlab/gitee 個人主頁無法統計提交記錄

後來有次居家辦公,跟同事公用一臺虛桌,為了把一些“資料”做的好看些,不得不切換本地的ssh配置。發現gitlab上程式碼的資料統計採集資料的方式應該不唯一,具體描述如下:

  1. 我給後端專案設定了專案級的git使用者配置,後端同事提交的時候直接提
  2. 前端專案提交使用系統級的git使用者配置
    做完這些之後發現,gitlab上專案裡的提交資訊統計的是正確的(猜測就是取得commit資訊而已),在profile主頁確沒有統計到提交記錄(測試發現應該是跟推送遠端倉庫時使用得ssh金鑰有關係),具體的設定請看?常用的SSH,你瞭解多少?

如何檢視".gitconfig"檔案

在"Git Bash"命令列工具中輸入“cd && ls -a”便可以看到如下資訊
再透過“view .gitconfig”命令開啟.gitconfig檔案,即可檢視該配置檔案內容:

git log 不能正確顯示中英文

git config --global core.quotepath false

git config --global core.pager more

tag 標籤

git tag -a <tagname:v1.0.0> -m "標籤描述"

# 將tag顯示的推送到遠端倉庫
git push origin v1.0.0

#-------------------
# 打 tag (tag指向commit ID)
git tag -a <tagname:v1.0.0> -m "標籤描述"

eg: git tag -a v1.0.0 -m "test"

# 推送tag
git push github v1.0.0
git push gitee v1.0.0

# 獲取tag
git tag

# 刪除本地`tag`

git tag -d 標籤名

eg:git tag -d v3.1.0


# 刪除遠端`tag`

git push origin :refs/tags/標籤名

eg:git push origin :refs/tags/v3.1.0

更新tag(不建議使用)

有副作用,一般的做法是刪除 tag, 重新打,或者遞增tag值

git tag -a -f <tag名稱> <新的commit ID>

git commit 資訊的規範設定

  1. ?commitlint 配置
  • feat: 新功能、新特性
  • fix: 修改 bug
  • perf: 更改程式碼,以提高效能
  • refactor: 程式碼重構(重構,在不影響程式碼內部行為、功能下的程式碼修改)
  • docs: 文件修改
  • style: 程式碼格式修改, 注意不是 css 修改(例如分號修改)
  • test: 測試用例新增、修改
  • build: 影響專案構建或依賴項修改
  • revert: 恢復上一次提交
  • ci: 持續整合相關檔案修改
  • chore: 其他修改(不在上述型別中的修改)
  • release: 釋出新版本
  • workflow: 工作流相關檔案修改
  • ...

如果想進一步設定程式碼的書寫規範,請看這裡:?perttier+eslint+husky 使用

fatal: refusing to merge unrelated histories

git pull 的時候報錯 拒絕合併無關歷史記錄
粗暴解決:

使用強制命令

git pull origin master --allow-unrelated-historie 

生成ssh金鑰對

  1. 右鍵 git bash
    ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096一路回車

  2. 複製公鑰到剪下板

cat ~/.ssh/id_rsa.pub | clip

3.登入gitlap配置公鑰

vscose配置git bash

  1. vscode配置bash
    右鍵git bash here
    執行命令: where bash : 獲取bash應用程式路徑

  2. vs中開啟設定,搜尋 shell,選擇Automation Shell: Windows, 在setting.json中編輯

  3. 新增配置項

"terminal.integrated.shell.windows": "填寫獲取到的bash路徑",
"terminal.integrated.automationShell.windows": "填寫獲取到的bash路徑"

where bash 命令在安全賬戶(多賬戶下)有相容問題
去掉usr路徑
D:/Git/usr/bin/bash.exe -> D:/Git/bin/bash.exe

?必要的git bash配置

git config --global user.name "xxx"
git config --global user.email "xxx@123.com"
git config --global core.autocrlf false   // 不同平臺mac/windows/linux下換行符(\n, \r\n, \r)不一致的問題 
git config --global core.longpaths true
git config --global core.quotepath false
git config --global i18n.logoutputencoding utf-8
git config --global i18n.commitencoding utf-8
git config --global gui.encoding utf-8
echo "export LANG=zh_CN.UTF-8" >> ~/.bash_profile
echo "export LESSCHARSET=UTF-8" >> ~/.bash_profile

程式碼換行符告警問題

參考我的另一篇:?Delete eslint(prettier/prettier) 錯誤的解決方案

上面的都是透過規範個人的行為來保持版本庫的統一,但團隊開發中還是會有人不遵守規範,導致出現一些問題,所以最終的處理方案應該是跟隨專案提供一個配置檔案(?.gitattributes),並且給以最高的優先順序(像eslint配置一樣),?gitattributes這裡提供了一系列針對各種開發環境,已經寫好了的 ``.gitattributes` 檔案。

  • .gitattributes 具有最高的優先順序,無論你是否設定相關的換行符風格轉化屬性,你都可以和團隊保持一致;

  • 使用 * text=auto 可以定義開啟全域性的換行符轉換;

  • 使用 *.bat text eol=crlf 就可以保證 Windows 的批處理檔案在 checkout 至工作區時,始終被轉換為 CRLF 風格的換行符;

  • 使用 *.sh text eol=lf 就可以保證 Bash 指令碼無論在哪個平臺上,只要被 checkout 至工作區,始終被保持 LF 風格的換行符;

  • 使用 *.jpg -text 可以禁止 Git 將 jpg 檔案識別為文字檔案,從而避免由於換行符轉換引入的資料損壞;

Windows Linux/Mac Old Mac(pre-OSX)
CRLF LF CR
'\n\r' '\n' '\r'

Windows 提交時轉換為LF,檢出時轉換為CRLF

git config --local core.autocrlf true

多個github賬號下,生成的key不能同時在兩個github下面使用,導致新增失敗:Key is already in use

這時候在執行ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096命令的時候就不能預設回車了

可以修改生成key的檔名,預設檔名是id_rsa,生成多個不同檔案命名的key就可以新增使用了。

不同的程式碼倉庫平臺可以採用設定 ssh config的方式,可以參考?常用的SSH,你瞭解多少?自己嘗試一下

新增ssh之後 git clone xxx還不行

嘗試一:

配置ssh config

# gitcode - csdn
Host gitcode.net
  HostName gitcode.net
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/gitcode

# gitlab
Host gitlab.com
  HostName gitlab.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/gitlab-rsa

# github
Host github.com
  HostName github.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa

# gitee
Host gitee.com
  HostName gitee.com
  PreferredAuthentications publickey
  IdentityFile ~/.ssh/id_rsa

# 公共配置
# Host *
#   key value

# 其它金鑰對說明
# 18143945157 : github-cli 使用的
# gh-pages : hexo deploy_key 設定

再次測試連線

ssh -T git@gitlab.com

嘗試二

ssh-keygen -R 你要訪問的IP地址

ssh-keygen -R git@gitlab.com:all-smile/gitbook.git
Host git@gitlab.com:all-smile/gitbook.git not found in /c/Users/xiao/.ssh/known_hosts

修改 known_hosts 的檔名字,也就是讓它不起作用。(host)

重新clone ,生成新的 known_hosts

ping gitlab.com

修改commit提交資訊

情況一、修改最後一次的提交資訊

  1. git commit --amend

然後再vim編輯器裡面(具體以什麼方式開啟要看git bash的配置,可以配置成 notepad++, 或者使用 Git Extensions)修改儲存即可

  1. git push

情況二、修改指定commit的提交資訊

  1. git log 檢視資訊,獲取到commmit-id

  2. git rebase -i 6579ghjk^

變基到指定的commit-id版本, 並進入到一個可編輯的介面。在編輯區頂部,會列出這次 rebase 操作所涉及的所有 commit 提交記錄的摘要,它們每一行預設都是以 pick 開頭的。找到你想要修改的那個 commit,將行首的 pick 關鍵字修改為 edit。然後儲存並退出。這麼做可以在執行和指定 commit 有關的 rebase 操作時暫停下來讓我們對該 commit 的資訊進行修改

  1. git commit --amend 修改commit資訊

  2. 執行 git rebase --continue 命令完成剩餘的 rebase 操作。

如果需要修改多個提交記錄的資訊,則重複執行 2、3步驟,直到出現以下輸出:

git rebase --continue
Successfully rebased and updated refs/heads/develop

到這裡已經完成了變基操作的所有節點,

  1. 執行 git log 命令檢視我們剛才的修改情況,確認已修改的內容和預期一致。

  2. git push

Git本地有四個工作區域

工作目錄(Working Directory)、暫存區(Stage/Index)、資源庫(Repository或Git Directory)、git倉庫(Remote Directory)。檔案在這四個區域之間的轉換關係如下

  • Workspace: 工作區,就是你平時存放專案程式碼的地方

  • Index / Stage: 暫存區,用於臨時存放你的改動,事實上它只是一個檔案,儲存即將提交到檔案列表資訊

  • Repository: 倉庫區(或版本庫),就是安全存放資料的位置,這裡面有你提交到所有版本的資料。其中HEAD指向最新放入倉庫的版本

  • Remote: 遠端倉庫,託管程式碼的伺服器,可以簡單的認為是你專案組中的一臺電腦用於遠端資料交換

重置提交

情況一、沒有push到遠端的情況(只是在本地commit)

git reset --soft|--mixed|--hard <commit_id>
git push develop develop --force  (本地分支和遠端分支都是 develop)
  • --mixed 為預設,可以不用帶該引數,用於重置暫存區的檔案與上一次的提交(commit)保持一致,工作區檔案內容保持不變。只是將git commit和index 資訊回退到了某個版本。

  • --soft 保留原始碼,只回退到commit資訊到某個版本.不涉及index的回退,如果還需要提交,直接commit即可。
    git reset --soft HEAD

  • --hard 引數撤銷工作區中所有未提交的修改內容,將暫存區與工作區都回到上一次版本,並刪除之前的所有資訊提交。

情況二、已經push到遠端的情況

對於已經把程式碼push到線上倉庫,你回退原生程式碼其實也想同時回退線上程式碼,回滾到某個指定的版本,線上線下程式碼保持一致,你要用到下面的命令

git revert <commit_id>

revert 之後你的原生程式碼會回滾到指定的歷史版本,這時你再 git push 既可以把線上的程式碼更新。

git revert是用一次新的commit來回滾之前的commit

HEAD 說明:

  • HEAD 表示當前版本
  • HEAD^ 上一個版本
  • HEAD^^ 上上一個版本
  • HEAD^^^ 上上上一個版本
  • 以此類推...

可以使用 ~數字表示

  • HEAD~0 表示當前版本
  • HEAD~1 上一個版本
  • HEAD^2 上上一個版本
  • HEAD^3 上上上一個版本
  • 以此類推...

其它相關文章推薦

我是 甜點cc

微信公眾號:【看見另一種可能】

專注前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。

相關文章