官網文件: https://git-scm.com/doc
本地克隆遠端程式碼倉庫
- git clone 地址
本地同步全量歷史資料,克隆所有檔案的歷史記錄
- git clone 地址 —depth 1
本地同步預設分支最近n
次的commit資訊,克隆預設分支master最近一次commit
- 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命令(更新中...)
- 顯示所有提交過的使用者,按提交次數排序
git shortlog -sn
- 顯示指定檔案是什麼人在什麼時間修改過
git blame [file]
eg: git blame README.md
Git 中的分支是指向提交的指標,是從特定時間點開始的專案及其更改的快照。
- 刪除本地分支
git branch -d local_branch_name
- 切換分支
將遠端分支拉取到本地(本地切換到遠端分支,存在遠端分支,需要在本地)
git checkout -b dev origin/dev
- 關聯遠端分支
將本地新建的分支與遠端分支相關聯(在當前分支下輸入以下命令)
git branch -u origin/分支名
其中origin/xxx xxx為遠端分支名
eg: git branch -u origin/master 本地分支關聯遠端master分支
或者使用 git branch --set-upstream-to origin/xxx 同樣可以關聯
- 檢視本地分支與遠端分支的對映關係(檢視關聯效果)
git branch -vv
- 撤銷本地分支與遠端分支的關係
git branch --unset-upstream
- 合併分支
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,如果有多個遠端庫,我們需要用不同的名稱來標識不同的遠端庫, 具體操作步驟如下:
- 先刪除已關聯的名為
origin
的遠端庫:
git remote rm origin
- 再關聯
GitHub
的遠端庫:
git remote add github git@github.com:all-smile/pc-web.git
注意: 遠端庫的名稱叫github,不叫origin了。
- 接著,再關聯
Gitee
的遠端庫:
git remote add gitee git@gitee.com:hey-u/pc-web.git
同樣注意,遠端庫的名稱叫gitee,不叫origin。
- 檢視遠端庫資訊
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)
- 本地修改推送到遠端
- 推送到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上程式碼的資料統計採集資料的方式應該不唯一,具體描述如下:
- 我給後端專案設定了專案級的git使用者配置,後端同事提交的時候直接提
- 前端專案提交使用系統級的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 資訊的規範設定
- 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金鑰對
-
右鍵 git bash
ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096
一路回車 -
複製公鑰到剪下板
cat ~/.ssh/id_rsa.pub | clip
3.登入gitlap配置公鑰
vscose配置git bash
-
vscode配置bash
右鍵git bash here
執行命令: where bash : 獲取bash應用程式路徑 -
vs中開啟設定,搜尋 shell,選擇Automation Shell: Windows, 在setting.json中編輯
-
新增配置項
"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 檔案作用詳細講解
-
.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提交資訊
情況一、修改最後一次的提交資訊
git commit --amend
然後再vim編輯器裡面(具體以什麼方式開啟要看git bash的配置,可以配置成 notepad++
, 或者使用 Git Extensions
)修改儲存即可
git push
情況二、修改指定commit的提交資訊
-
git log 檢視資訊,獲取到commmit-id
-
git rebase -i 6579ghjk^
變基到指定的commit-id版本, 並進入到一個可編輯的介面。在編輯區頂部,會列出這次 rebase 操作所涉及的所有 commit 提交記錄的摘要,它們每一行預設都是以 pick 開頭的。找到你想要修改的那個 commit,將行首的 pick 關鍵字修改為 edit。然後儲存並退出。這麼做可以在執行和指定 commit 有關的 rebase 操作時暫停下來讓我們對該 commit 的資訊進行修改
-
git commit --amend 修改commit資訊
-
執行 git rebase --continue 命令完成剩餘的 rebase 操作。
如果需要修改多個提交記錄的資訊,則重複執行 2、3步驟,直到出現以下輸出:
git rebase --continue
Successfully rebased and updated refs/heads/develop
到這裡已經完成了變基操作的所有節點,
-
執行
git log
命令檢視我們剛才的修改情況,確認已修改的內容和預期一致。 -
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☭
微信公眾號:【看見另一種可能】
專注前端開發,也喜歡專研各種跟本職工作關係不大的技術,技術、產品興趣廣泛且濃厚。本號主要致力於分享個人經驗總結,希望可以給一小部分人一些微小幫助。