git相關(guān)問題解析,你想要的都有??

官網(wǎng)文檔: https://git-scm.com/doc

本地克隆遠(yuǎn)程代碼倉庫

  1. git clone 地址

本地同步全量歷史數(shù)據(jù),克隆所有文件的歷史記錄

  1. git clone 地址 —depth 1

本地同步默認(rèn)分支最近n次的commit信息,克隆默認(rèn)分支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. 顯示所有提交過的用戶,按提交次數(shù)排序
git shortlog -sn
  1. 顯示指定文件是什么人在什么時間修改過
git blame [file]

eg: git blame README.md

Git 中的分支是指向提交的指針,是從特定時間點開始的項目及其更改的快照。

  1. 刪除本地分支

git branch -d local_branch_name

  1. 切換分支

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

  1. 關(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)

  1. 查看本地分支與遠(yuǎn)程分支的映射關(guān)系(查看關(guān)聯(lián)效果)

git branch -vv

  1. 撤銷本地分支與遠(yuǎn)程分支的關(guān)系

git branch --unset-upstream

  1. 合并分支
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)程庫, 具體操作步驟如下:

  1. 先刪除已關(guān)聯(lián)的名為origin的遠(yuǎn)程庫:
git remote rm origin
  1. 再關(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了。

  1. 接著,再關(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。

  1. 查看遠(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)
  1. 本地修改推送到遠(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)該不唯一,具體描述如下:

  1. 我給后端項目設(shè)置了項目級的git用戶配置,后端同事提交的時候直接提
  2. 前端項目提交使用系統(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è)置

  1. ??commitlint 配置
  • 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密鑰對

  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
    執(zhí)行命令: where bash : 獲取bash應(yīng)用程序路徑

  2. vs中打開設(shè)置,搜索 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下?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` 文件。

  • .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提交信息

情況一、修改最后一次的提交信息

  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版本, 并進(jìn)入到一個可編輯的界面。在編輯區(qū)頂部,會列出這次 rebase 操作所涉及的所有 commit 提交記錄的摘要,它們每一行默認(rèn)都是以 pick 開頭的。找到你想要修改的那個 commit,將行首的 pick 關(guān)鍵字修改為 edit。然后保存并退出。這么做可以在執(zhí)行和指定 commit 有關(guān)的 rebase 操作時暫停下來讓我們對該 commit 的信息進(jìn)行修改

  1. git commit --amend 修改commit信息

  2. 執(zhí)行 git rebase --continue 命令完成剩余的 rebase 操作。

如果需要修改多個提交記錄的信息,則重復(fù)執(zhí)行 2、3步驟,直到出現(xiàn)以下輸出:

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

到這里已經(jīng)完成了變基操作的所有節(jié)點,

  1. 執(zhí)行 git log 命令查看我們剛才的修改情況,確認(rèn)已修改的內(nèi)容和預(yù)期一致。

  2. 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é),希望可以給一小部分人一些微小幫助。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容