官網(wǎng)文檔: https://git-scm.com/doc
本地克隆遠(yuǎn)程代碼倉庫
- git clone 地址
本地同步全量歷史數(shù)據(jù),克隆所有文件的歷史記錄
- git clone 地址 —depth 1
本地同步默認(rèn)分支最近n次的commit信息,克隆默認(rèn)分支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命令(更新中...)
- 顯示所有提交過的用戶,按提交次數(shù)排序
git shortlog -sn
- 顯示指定文件是什么人在什么時間修改過
git blame [file]
eg: git blame README.md
Git 中的分支是指向提交的指針,是從特定時間點開始的項目及其更改的快照。
- 刪除本地分支
git branch -d local_branch_name
- 切換分支
將遠(yuǎn)端分支拉取到本地(本地切換到遠(yuǎn)程分支,存在遠(yuǎn)端分支,需要在本地)
git checkout -b dev origin/dev
- 關(guān)聯(lián)遠(yuǎn)程分支
將本地新建的分支與遠(yuǎn)程分支相關(guān)聯(lián)(在當(dāng)前分支下輸入以下命令)
git branch -u origin/分支名
其中origin/xxx xxx為遠(yuǎn)程分支名
eg: git branch -u origin/master 本地分支關(guān)聯(lián)遠(yuǎn)程master分支
或者使用 git branch --set-upstream-to origin/xxx 同樣可以關(guān)聯(lián)
- 查看本地分支與遠(yuǎn)程分支的映射關(guān)系(查看關(guān)聯(lián)效果)
git branch -vv

- 撤銷本地分支與遠(yuǎn)程分支的關(guān)系
git branch --unset-upstream
- 合并分支
git checkout master # 切換到master分支上
git pull origin master # 把遠(yuǎn)程分支pull下去,及時更新
git merge dev # 把dev分支的代碼合并到master上
git status # 查看狀態(tài)
git push origin master # push到遠(yuǎn)程分支
??本地倉庫同時關(guān)聯(lián)多個遠(yuǎn)端倉庫(gitee, github, gitlab...)
因為Git本身是分布式版本控制系統(tǒng),可以同步到另外一個遠(yuǎn)程庫,當(dāng)然也可以同步到另外兩個遠(yuǎn)程庫。
使用多個遠(yuǎn)程庫時,我們要注意,git給遠(yuǎn)程庫起的默認(rèn)名稱是origin,如果有多個遠(yuǎn)程庫,我們需要用不同的名稱來標(biāo)識不同的遠(yuǎn)程庫, 具體操作步驟如下:
- 先刪除已關(guān)聯(lián)的名為
origin的遠(yuǎn)程庫:
git remote rm origin
- 再關(guān)聯(lián)
GitHub的遠(yuǎn)程庫:
git remote add github git@github.com:all-smile/pc-web.git
注意: 遠(yuǎn)程庫的名稱叫g(shù)ithub,不叫origin了。
- 接著,再關(guān)聯(lián)
Gitee的遠(yuǎn)程庫:
git remote add gitee git@gitee.com:hey-u/pc-web.git
同樣注意,遠(yuǎn)程庫的名稱叫g(shù)itee,不叫origin。
- 查看遠(yuǎn)程庫信息
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)
- 本地修改推送到遠(yuǎn)端
- 推送到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

將遠(yuǎn)程 URL 從 HTTPS 切換到 SSH
- 打開 Terminal(終端)。
- 將當(dāng)前工作目錄更改為您的本地倉庫。
- 列出現(xiàn)有遠(yuǎn)程倉庫以獲取要更改的遠(yuǎn)程倉庫的名稱。
git remote -v
origin https://github.com/USERNAME/REPOSITORY.git(fetch)
origin https://github.com/USERNAME/REPOSITORY.git(push)
- 使用
git remote set-url命令將遠(yuǎn)程的 URL 從 HTTPS 更改為 SSH。
git remote set-url origin git@github.com:USERNAME/REPOSITORY.git
- 驗證遠(yuǎn)程 URL 是否已更改。
git remote -v
origin git@github.com:USERNAME/REPOSITORY.git (fetch)
origin git@github.com:USERNAME/REPOSITORY.git (push)
將遠(yuǎn)程 URL 從 SSH 切換到 HTTPS
- 打開 Terminal(終端)。
- 將當(dāng)前工作目錄更改為您的本地倉庫。
- 列出現(xiàn)有遠(yuǎn)程倉庫以獲取要更改的遠(yuǎn)程倉庫的名稱。
git remote -v
origin git@github.com:USERNAME/REPOSITORY.git (fetch)
origin git@github.com:USERNAME/REPOSITORY.git (push)
- 使用
git remote set-url命令將遠(yuǎn)程的 URL 從 SSH 更改為 HTTPS。
git remote set-url origin https://github.com/USERNAME/REPOSITORY.git
- 驗證遠(yuǎn)程 URL 是否已更改。
git remote -v
origin https://github.com/USERNAME/REPOSITORY.git (fetch)
origin https://github.com/USERNAME/REPOSITORY.git (push)
設(shè)置git提交用戶信息
這里牽涉到提交代碼的一些數(shù)據(jù)統(tǒng)計,了解一下會很有幫助的,可以看下我的這篇文章:
??語雀:github/gitlab/gitee 個人主頁無法統(tǒng)計提交記錄
后來有次居家辦公,跟同事公用一臺虛桌,為了把一些“數(shù)據(jù)”做的好看些,不得不切換本地的ssh配置。發(fā)現(xiàn)gitlab上代碼的數(shù)據(jù)統(tǒng)計采集數(shù)據(jù)的方式應(yīng)該不唯一,具體描述如下:
- 我給后端項目設(shè)置了項目級的git用戶配置,后端同事提交的時候直接提
- 前端項目提交使用系統(tǒng)級的git用戶配置
做完這些之后發(fā)現(xiàn),gitlab上項目里的提交信息統(tǒng)計的是正確的(猜測就是取得commit信息而已),在profile主頁確沒有統(tǒng)計到提交記錄(測試發(fā)現(xiàn)應(yīng)該是跟推送遠(yuǎn)程倉庫時使用得ssh密鑰有關(guān)系),具體的設(shè)置請看??常用的SSH,你了解多少?
如何查看".gitconfig"文件
在"Git Bash"命令行工具中輸入“cd && ls -a”便可以看到如下信息
再通過“view .gitconfig”命令打開.gitconfig文件,即可查看該配置文件內(nèi)容:

git log 不能正確顯示中英文

git config --global core.quotepath false

git config --global core.pager more
tag 標(biāo)簽

git tag -a <tagname:v1.0.0> -m "標(biāo)簽描述"
# 將tag顯示的推送到遠(yuǎn)程倉庫
git push origin v1.0.0
#-------------------
# 打 tag (tag指向commit ID)
git tag -a <tagname:v1.0.0> -m "標(biāo)簽描述"
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 標(biāo)簽名
eg:git tag -d v3.1.0
# 刪除遠(yuǎn)程`tag`
git push origin :refs/tags/標(biāo)簽名
eg:git push origin :refs/tags/v3.1.0
更新tag(不建議使用)
有副作用,一般的做法是刪除 tag, 重新打,或者遞增tag值
git tag -a -f <tag名稱> <新的commit ID>


git commit 信息的規(guī)范設(shè)置
- feat: 新功能、新特性
- fix: 修改 bug
- perf: 更改代碼,以提高性能
- refactor: 代碼重構(gòu)(重構(gòu),在不影響代碼內(nèi)部行為、功能下的代碼修改)
- docs: 文檔修改
- style: 代碼格式修改, 注意不是 css 修改(例如分號修改)
- test: 測試用例新增、修改
- build: 影響項目構(gòu)建或依賴項修改
- revert: 恢復(fù)上一次提交
- ci: 持續(xù)集成相關(guān)文件修改
- chore: 其他修改(不在上述類型中的修改)
- release: 發(fā)布新版本
- workflow: 工作流相關(guān)文件修改
- ...
如果想進(jìn)一步設(shè)置代碼的書寫規(guī)范,請看這里:??perttier+eslint+husky 使用
fatal: refusing to merge unrelated histories
git pull 的時候報錯 拒絕合并無關(guān)歷史記錄
粗暴解決:
使用強制命令
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
執(zhí)行命令: where bash : 獲取bash應(yīng)用程序路徑vs中打開設(shè)置,搜索 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下?lián)Q行符(\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) 錯誤的解決方案
上面的都是通過規(guī)范個人的行為來保持版本庫的統(tǒng)一,但團(tuán)隊開發(fā)中還是會有人不遵守規(guī)范,導(dǎo)致出現(xiàn)一些問題,所以最終的處理方案應(yīng)該是跟隨項目提供一個配置文件(??.gitattributes),并且給以最高的優(yōu)先級(像eslint配置一樣),??gitattributes這里提供了一系列針對各種開發(fā)環(huán)境,已經(jīng)寫好了的 ``.gitattributes` 文件。
參考網(wǎng)絡(luò)文章: ??http://www.itdecent.cn/p/fa4d5963b6c8
參考我的另一篇詳解: ??.gitattributes 文件作用詳細(xì)講解
.gitattributes 具有最高的優(yōu)先級,無論你是否設(shè)置相關(guān)的換行符風(fēng)格轉(zhuǎn)化屬性,你都可以和團(tuán)隊保持一致;
使用 * text=auto 可以定義開啟全局的換行符轉(zhuǎn)換;
使用 *.bat text eol=crlf 就可以保證 Windows 的批處理文件在 checkout 至工作區(qū)時,始終被轉(zhuǎn)換為 CRLF 風(fēng)格的換行符;
使用 *.sh text eol=lf 就可以保證 Bash 腳本無論在哪個平臺上,只要被 checkout 至工作區(qū),始終被保持 LF 風(fēng)格的換行符;
使用 *.jpg -text 可以禁止 Git 將 jpg 文件識別為文本文件,從而避免由于換行符轉(zhuǎn)換引入的數(shù)據(jù)損壞;
| Windows | Linux/Mac | Old Mac(pre-OSX) |
|---|---|---|
| CRLF | LF | CR |
| '\n\r' | '\n' | '\r' |
Windows 提交時轉(zhuǎn)換為LF,檢出時轉(zhuǎn)換為CRLF
git config --local core.autocrlf true
多個github賬號下,生成的key不能同時在兩個github下面使用,導(dǎo)致添加失敗:Key is already in use

這時候在執(zhí)行ssh-keygen -o -t rsa -C "your.email@example.com" -b 4096命令的時候就不能默認(rèn)回車了
可以修改生成key的文件名,默認(rèn)文件名是id_rsa,生成多個不同文件命名的key就可以添加使用了。
不同的代碼倉庫平臺可以采用設(shè)置
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 設(shè)置
再次測試連接
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版本, 并進(jìn)入到一個可編輯的界面。在編輯區(qū)頂部,會列出這次 rebase 操作所涉及的所有 commit 提交記錄的摘要,它們每一行默認(rèn)都是以 pick 開頭的。找到你想要修改的那個 commit,將行首的 pick 關(guān)鍵字修改為 edit。然后保存并退出。這么做可以在執(zhí)行和指定 commit 有關(guān)的 rebase 操作時暫停下來讓我們對該 commit 的信息進(jìn)行修改
git commit --amend 修改commit信息
執(zhí)行 git rebase --continue 命令完成剩余的 rebase 操作。
如果需要修改多個提交記錄的信息,則重復(fù)執(zhí)行 2、3步驟,直到出現(xiàn)以下輸出:
git rebase --continue
Successfully rebased and updated refs/heads/develop
到這里已經(jīng)完成了變基操作的所有節(jié)點,
執(zhí)行
git log命令查看我們剛才的修改情況,確認(rèn)已修改的內(nèi)容和預(yù)期一致。git push
Git本地有四個工作區(qū)域
工作目錄(Working Directory)、暫存區(qū)(Stage/Index)、資源庫(Repository或Git Directory)、git倉庫(Remote Directory)。文件在這四個區(qū)域之間的轉(zhuǎn)換關(guān)系如下

Workspace: 工作區(qū),就是你平時存放項目代碼的地方
Index / Stage: 暫存區(qū),用于臨時存放你的改動,事實上它只是一個文件,保存即將提交到文件列表信息
Repository: 倉庫區(qū)(或版本庫),就是安全存放數(shù)據(jù)的位置,這里面有你提交到所有版本的數(shù)據(jù)。其中HEAD指向最新放入倉庫的版本
Remote: 遠(yuǎn)程倉庫,托管代碼的服務(wù)器,可以簡單的認(rèn)為是你項目組中的一臺電腦用于遠(yuǎn)程數(shù)據(jù)交換
重置提交
情況一、沒有push到遠(yuǎn)程的情況(只是在本地commit)
git reset --soft|--mixed|--hard <commit_id>
git push develop develop --force (本地分支和遠(yuǎn)程分支都是 develop)
--mixed為默認(rèn),可以不用帶該參數(shù),用于重置暫存區(qū)的文件與上一次的提交(commit)保持一致,工作區(qū)文件內(nèi)容保持不變。只是將git commit和index 信息回退到了某個版本。--soft保留源碼,只回退到commit信息到某個版本.不涉及index的回退,如果還需要提交,直接commit即可。
git reset --soft HEAD--hard參數(shù)撤銷工作區(qū)中所有未提交的修改內(nèi)容,將暫存區(qū)與工作區(qū)都回到上一次版本,并刪除之前的所有信息提交。
情況二、已經(jīng)push到遠(yuǎn)程的情況
對于已經(jīng)把代碼push到線上倉庫,你回退本地代碼其實也想同時回退線上代碼,回滾到某個指定的版本,線上線下代碼保持一致,你要用到下面的命令
git revert <commit_id>
revert 之后你的本地代碼會回滾到指定的歷史版本,這時你再 git push 既可以把線上的代碼更新。
git revert是用一次新的commit來回滾之前的commit
HEAD 說明:
- HEAD 表示當(dāng)前版本
- HEAD^ 上一個版本
- HEAD^^ 上上一個版本
- HEAD^^^ 上上上一個版本
- 以此類推...
可以使用 ~數(shù)字表示
- HEAD~0 表示當(dāng)前版本
- HEAD~1 上一個版本
- HEAD^2 上上一個版本
- HEAD^3 上上上一個版本
- 以此類推...
其它相關(guān)文章推薦

我是 甜點cc?
微信公眾號:【看見另一種可能】
專注前端開發(fā),也喜歡專研各種跟本職工作關(guān)系不大的技術(shù),技術(shù)、產(chǎn)品興趣廣泛且濃厚。本號主要致力于分享個人經(jīng)驗總結(jié),希望可以給一小部分人一些微小幫助。