01. Git常用操作速查

@[toc]

一、Git配置

使用 Git Bash 控制臺(tái)操作

  1. 初始化
git init
  1. .git文件夾下的文件含義

    • HEAD 文件指示目前被檢出的分支
    • description 用來顯示對(duì)倉庫的描述信息
    • config 文件包含項(xiàng)目特有的配置選項(xiàng),本項(xiàng)目的配置,全局的在 對(duì)應(yīng)系統(tǒng)相應(yīng)用戶的文件夾/.gitconfig
    • info 目錄包含一個(gè)全局性排除文件
    • hooks 目錄包含客戶端或服務(wù)端的鉤子腳本
    • index 文件保存暫存區(qū)信息
    • objects 目錄存儲(chǔ)所有數(shù)據(jù)內(nèi)容
    • refs 目錄存儲(chǔ)分支的提交對(duì)象的指針
    • branches 新版本已經(jīng)廢棄無須理會(huì)
  2. 查看用戶名與郵件配置(查看改動(dòng)記錄非常方便)

git config user.name
git config user.email
  1. 設(shè)置(修改)用戶名與郵件
git config --global user.name "hahadasheng"
git config --global user.email "liuchnegdage@sina.com"
  1. 修改配置信息(低版本)
git config --global --replace-all user.name "lc"

可以直接修改全局配置文件,在用戶主目錄下;比如Windows的在當(dāng)前用戶的用戶文件夾下 C:\Users\administrator\.gitconfig

  1. 允許命令超長路徑
# git 設(shè)置支持超長路徑
git config --system core.longpaths true
  1. 配置代理 一般正規(guī)點(diǎn)的公司都有防火墻,上網(wǎng)需要代理服務(wù)器
git config --global http.proxy http://some.name.you.know:80

二、鑒權(quán) 拉取代碼

1). SSH 推薦

  1. 生成非對(duì)稱加密密鑰對(duì)
ssh-keygen
  1. ~/.ssh/id_rsa.pub 的內(nèi)容拷貝到托管平臺(tái)

  2. 克隆代碼

git clone
  1. 拉去代碼
git pull

2). HTTP(S) 不方便,不推薦

  1. 直接 clone (指定文件可選,建議不寫) 輸入托管平臺(tái)的用戶名密碼
git clone <url> [localDirName]
  1. 緩存用戶名密碼
# 默認(rèn)15分鐘
git config –-global credential.helper cache
# 設(shè)置為一個(gè)小時(shí)
git config credential.helper ‘cache –timeout=3600’ 
# 永久記住秘密
git config --global credential.helper store

~/.gitconfig 全局配置文件下會(huì)記錄此配置

[credential]
    helper = store

三、提交代碼一般流程

工作區(qū):正在編輯的文件夾下的文件,沒有通過 git add添加的文件
暫存區(qū):通過git add添加但是沒有git commit的文件所在的區(qū)域

  1. 拉取遠(yuǎn)程代碼
git pull
  1. 如果拉取失敗, 一般是本地未提交的修改的文件與與服務(wù)器提交記錄的文件有重合
git stash

git stash list 可以查看當(dāng)前本地stash的棧中有哪些修改,棧中可以存放多個(gè)分支的本地修改

git pull
git stash pop

注意,需要stash棧中棧頂對(duì)應(yīng)的分支修改與當(dāng)前一致,否則可能導(dǎo)致本地修改丟失

git stash list //查看本地stash棧中的記錄
git stash apply stash@{0} //選中對(duì)應(yīng)的記錄應(yīng)用到當(dāng)前工作區(qū)域,記錄不會(huì)被刪除
  1. 檢查是否有沖突,如果有則手動(dòng)解決

  2. 檢查改動(dòng)文件 (可選),顯示為紅色

git status
* Untracked: 未跟蹤,一般為新增文件,此文件在文件夾中, 但并沒有加入到git庫, 不參與版本控制. 通過git add 狀態(tài)變?yōu)镾taged.
* Modified: 文件已修改, 僅僅是修改, 并沒有進(jìn)行其他的操作.
* deleted: 文件已刪除,本地刪除,服務(wù)器上還沒有刪除.
* renamed:文件名稱被改變
  1. 如果發(fā)現(xiàn)無意編輯了一個(gè)文件,可以將其還原到修改前的狀態(tài)
# 還原指定文件
git checkout -- <fileName>

# 還原所有文件
git checkout .
  1. 將文件添加到暫存區(qū)
# 添加工作區(qū)指定修改文件到暫存區(qū)
git add <file>

# 添加所有修改文件到暫存區(qū)(忽略文件除外)
git add . 

此時(shí) git status 時(shí)在暫存區(qū)的文件顯示為綠色

  1. 如果想取消添加到暫存區(qū)
git rm --cached <fileName>

--cached 作用為指定暫存區(qū);不寫默認(rèn)則為工作區(qū)

  1. 提交到本地倉庫
git commit . -m "commit message"

.標(biāo)識(shí)選擇暫存區(qū)所有文件,如果只需要指定文件換成對(duì)應(yīng)文件名即可。

  1. 最簡單的提交方式
git push

四、diff 比較不同

1). 同個(gè)分支下的比較

  1. 查看工作區(qū)與暫存區(qū)文件的修改情況
# 查看所有文件
git diff

# 查看指定文件
git diff <fileName>

紅色的-號(hào)代表刪除的內(nèi)容;綠色的加號(hào)表示添加的部分

  1. 查看暫存區(qū)與本地版本庫的對(duì)比
# 查看所有文件
git diff --cached

# 查看指定文件
git diff --cached <fileName>
  1. 查看歷史提交記錄的哈希值
git log

commit 后面的哈市值則為對(duì)應(yīng)的提交哈希值

  1. 工作區(qū)與對(duì)應(yīng)的歷史提交對(duì)比
git diff hash值 [<fileName>]
  1. 暫存區(qū)與提交記錄對(duì)比
git diff --cached hash值 [<fileName>]
  1. 將工作區(qū)和暫存區(qū)文件與最新的版本庫比較
git diff HEAD

HEAD代表當(dāng)前所在的分支名,如果想比較其他分支可以將其改為其他分支名

  1. 比較兩個(gè)歷史記錄
git diff hash值1  hash值2
  1. 工作區(qū)與歷史版本進(jìn)行比較
# 指定比較的歷史版本
git diff <commit_hash>

# 比較最近的一次提交
git diff
  1. 比較兩個(gè)歷史版本
git diff <commit_hash1> <commit_hash2>

2) 不同分支下的比較

  1. 查看兩個(gè)不同的分支有哪些文件不一樣
git diff branch1 branch2 --stat
  1. 顯示文件具體修改
git diff branch1 branch2 filename
  1. 顯示全部文件修改(如果文件多則會(huì)眼花繚亂)
git diff branch1 branch2
  1. 查看一個(gè)分支有而另一個(gè)沒有
# 查看dev有的記錄但是master沒有的記錄
git log dev ^master
  1. 單純比較差異,顯示所有記錄
git log branch1..branch2

有綠色顯示的表示只在哪個(gè)分支上有,另一個(gè)沒有

  1. 查看各個(gè)記錄存在于哪些分支上
git log --left-right develop...test

commit后面有<表示develop; >表示為test分支的提交記錄

  1. 顯示當(dāng)前分支與其他分支最新版本進(jìn)行比較
git diff <orher branch>
  1. diff可以跨分支進(jìn)行對(duì)比
# 當(dāng)前最新與其他分支的歷史版本進(jìn)行對(duì)比 `git log`查找commit_hash
git diff <other_commit_hash>

# diff 可以比較任意分支任意提交之間的差異
git diff <commit_hash1> <commit_hash2>

五、Git忽略文件權(quán)限問題

  1. Git會(huì)記錄文件的權(quán)限,如果本地與版本庫同一個(gè)文件需要合并,如果存在權(quán)限不一致則會(huì)產(chǎn)生沖突,實(shí)際工作中是幾乎不會(huì)讓Git記錄文件的權(quán)限,可以配置一下讓Git忽略文件的權(quán)限
# 項(xiàng)目局部配置
git config core.filemode false
# 全局配置
git config --global core.filemode false

六、忽略指定文件或目錄

項(xiàng)目中的一些編譯文件,或者不想提交的配置文件等可以過濾掉

  1. 在項(xiàng)目的工作區(qū)創(chuàng)建一個(gè) .gitignore 的文件,Win下建議使用notepad++的另存為進(jìn)行創(chuàng)建,直接創(chuàng)建文件會(huì)失敗
  2. 每行代表一個(gè)忽略的文件,支持通配符,支持文件夾,支持文件
# 文件的忽略方式
.jeckins.ini

# 文件夾以及其下的所有文件
target/
.idea/

# 通配符
*.iml

# 防止通配符導(dǎo)致向提交的文件被忽略(如果是直接忽略則無效)
!want.jar
  1. 添加忽略的文件 .gitignore配置有誤的檢查
git check-ignore -v <fileName>
  1. 強(qiáng)制添加被忽略的文件
git add -f haha.iml
  1. 保留忽略的文件夾下部分文件寫法
# 忽略的文件夾
test/*

# 過濾的被忽略的文件夾下的文件
!test/index.html

上述的*號(hào)通配符必須得保留才能生效

  1. 忽略已經(jīng)提交commit的文件(夾),先在.gitignore中設(shè)置該文件(夾)為忽略,然后從暫存區(qū)中刪除
# 移除緩存中的文件
git rm --cached <fileName>
# 如果是文件夾則需要在加一個(gè)參數(shù)
git rm -r --cached <dirName>

# 提交此次修改,由于忽略文件中已經(jīng)忽略了此文件夾和文件,需要強(qiáng)制添加 -f
git add -f <dirName>

七、分支管理

  1. 查看本地分支 綠色表示當(dāng)前分支
git branch
  1. 查看本地和遠(yuǎn)程所有分支
git branch -a
  • 查看遠(yuǎn)程倉庫信息
git remote show origin
  1. 切換到遠(yuǎn)程或者本地分支(遠(yuǎn)程或者本地已經(jīng)存在的分支)
git checkout <exist branch>
  1. 新建本地分支 (將當(dāng)前分支的版本拷貝過去)
git checkout -b <new branch>
  1. 將本地新建的分支推送到服務(wù)器
git push --set-upstream origin <new branch>
  1. 合并分支
git merge <other branch>

查看合并的結(jié)果 git log 哈希值后面有個(gè)(HEAD -> branch1,branch2) 就是合并的記錄

  1. 普通刪除分支,可避免數(shù)據(jù)丟失
git branch -d <branch name>
  1. 如果普通無法刪除,使用強(qiáng)制刪除分支
git branch -D <branch name>
  1. 恢復(fù)刪除的分支
git branch <branch name> <hash value>

八、回滾提交,不會(huì)滾代碼

工作中,有時(shí)提交的代碼審核沒有過(CI/KW等),被abandon了;后續(xù)可以在本地進(jìn)行追加提交(中途不能有自己的新提交),但是有時(shí)候就想放棄此次提交,或者本地提交后想要丟棄,可以使用reset命令

  1. 查看需要回滾的提交節(jié)點(diǎn),拷貝對(duì)應(yīng)的哈希值(推薦直接在idea工具中操作)
git log
  1. 進(jìn)行回滾
git rebase //將自己的提交放在前面,這樣下方的reset就只回到上個(gè)版本就可以了
git reset 哈希值
  1. 如果想撤銷最近的一次提交
git reset HEAD^
  1. 如果想撤銷修改的代碼
# 撤銷某個(gè)文件并查看狀態(tài)
git checkout filename && git status

# 撤銷所有的修改到上次提交的位置
git checkout .

九、刪除過期的分支,清理無意義數(shù)據(jù)

清理不需要的分支數(shù)據(jù),提高響應(yīng)速度

  1. 查看所有分支列表
git branch -a

紅色的為遠(yuǎn)程分支

  1. 刪除遠(yuǎn)程分支
git push origin --delete <remote branch>

控制臺(tái)顯示 deleted 表示刪除成功

  1. 將遠(yuǎn)程分支與本地分支進(jìn)行對(duì)比
git remote prune origin
  1. 查看本地分支的標(biāo)注情況
git branch -vv

對(duì)應(yīng)分支后面如果有:gone的標(biāo)識(shí)則表示遠(yuǎn)程分支已經(jīng)被刪除,該分支可以被清理

  1. 刪除本地分支
git branch -d <branchName>

十、配置多個(gè)遠(yuǎn)端倉庫:把代碼推送到不同的服務(wù)器

1) 每個(gè)倉庫分別對(duì)應(yīng)一個(gè)遠(yuǎn)程地址

配置多個(gè)遠(yuǎn)程倉庫

  1. 查看當(dāng)前地址
git remote -v

默認(rèn)的倉庫為origin; 顯示的信息有pushfetch兩種
執(zhí)行git push會(huì)調(diào)用對(duì)應(yīng)的push地址,執(zhí)行git fetch
則會(huì)調(diào)用fetch地址;拉取代碼默認(rèn)情況下會(huì)產(chǎn)生一個(gè)遠(yuǎn)程倉庫origin,
并且對(duì)應(yīng)的push地址也只有一個(gè)。

補(bǔ)充:git fetch 為只拉取更新,不進(jìn)行合并 git pull = git fetch && git merge

# 將某個(gè)遠(yuǎn)程主機(jī)的更新全部取回本地
git fetch <remoteAddr>

# 取回特定分支的更新
git fetch <remoteAddr> <branchName>

# 查看取回的信息
git log -p FETCH_HEAD
  1. 添加多個(gè)倉庫

一般默認(rèn)的倉庫名為origin

git remote add <新的倉庫名> <遠(yuǎn)程倉庫地址>
  1. 提交代碼時(shí)選擇倉庫
# review 提交方式
git push origin head:refs/for/master

# 直接提交方式
git push github master

# 不寫倉庫則push到默認(rèn)倉庫
git push
  1. 修改默認(rèn)指定倉庫
git push -u github
  1. 刪除倉庫
# 刪除指定的倉庫
git remote remove <倉庫名稱>

2) 一個(gè)倉庫對(duì)應(yīng)多個(gè)遠(yuǎn)程地址

執(zhí)行一條命令,將代碼往兩個(gè)地址同時(shí)推送

  1. 向origin倉庫中添加多個(gè)地址
git remote set-url --add origin <remoteAddr>

十一、代碼覆蓋

1) 本地覆蓋遠(yuǎn)端

如果不小心提交了錯(cuò)誤的信息到遠(yuǎn)程,可以用新的提交來覆蓋,但是如果是敏感信息,這種方式顯然有缺點(diǎn),因?yàn)樘峤挥涗浿羞€是可以查看到;不推薦使用此種方式;

  1. 查看需要回滾提交的哈希值
git log
  1. 回滾本地提交,不會(huì)滾代碼改動(dòng)
git reset <哈希值>
  1. 強(qiáng)制推送到遠(yuǎn)程
git push origin -f

此類命令比較危險(xiǎn),一般在托管品臺(tái)比如GitLab上會(huì)對(duì)類似的操作進(jìn)行權(quán)限設(shè)置

2) 遠(yuǎn)端覆蓋本地

  1. 拉取遠(yuǎn)程最新代碼,但是不進(jìn)行合并
git fetch
  1. 將當(dāng)前工作的差異部分丟棄掉,完全與目標(biāo)保持一致
git reset --hard origin/master

這里origin/master則是目標(biāo)比較分支

十二、恢復(fù)已刪除的分支,文件等

前提是沒有執(zhí)行 git gc 清除信息,一般如果不手動(dòng)執(zhí)行此命令,git會(huì)對(duì)那些無用的object保留很長的時(shí)間

1) 恢復(fù)已刪除的分支

  1. 顯示分支管理命令 找到要恢復(fù)分支的某次提交前面的 commit_id
git reflog show
  1. 建立新的分支并進(jìn)行恢復(fù)
git checkout <新取一個(gè)分支名稱> <commit_id>

通過此種方式則重建的刪除的分支

2) 回滾reset操作

如果想找回git reset之前的提交記錄

  1. 查看操作歷史
git reflog
  1. 找到reset之前的commit_id并回退到那個(gè)id即可
git reset --hard <commit_id>

3) 從歷史版本中找回刪除的文件

  1. 查看操作歷史
git reflog
  1. 找到需要找回對(duì)應(yīng)的commit_id
git checkout <commit_id> <需要找回的文件名稱>

十三、單獨(dú)回滾代碼 記錄不變只回滾代碼

reset命令會(huì)回滾記錄,如果遠(yuǎn)程由此記錄,并禁止強(qiáng)制提交;則此時(shí)可以
使用revert命令只回滾代碼

  1. 查詢需要回滾代碼的分支commit_hash(比如向撤銷此次提交的代碼修改)
git log
  1. 回滾需要撤銷的提交
git revert <對(duì)應(yīng)的commit_hash>

注意,撤銷對(duì)飲的提交,revert后面的hash就是對(duì)應(yīng)的那次提交

  1. 命令執(zhí)行后會(huì)彈出一個(gè)合并代碼的提示框,編輯好信息后 esc :x進(jìn)行保存退出
    再通過git log發(fā)現(xiàn)多了一條Revert的記錄,說明已經(jīng)成功;此時(shí)可以用git diff <被回退的提交hash>
    可以發(fā)現(xiàn)被回退的提交修改已經(jīng)被放棄了。

  2. 提交代碼

git push

在使用 revert 去恢復(fù)某個(gè)版本代碼時(shí),Git 只會(huì)撤銷指定版本的代碼,對(duì)指定版本后的所有版本不會(huì)有任何影響。
比如說你提交了 1、2、3 三個(gè)版本,當(dāng)你撤銷版本2的時(shí)候,會(huì)生成版本4,但是不會(huì)對(duì)版本3產(chǎn)生影響。

git reset 與 git revert的比較

  • git reset: 會(huì)改變之前的版本記錄,可能會(huì)導(dǎo)致不能提交到遠(yuǎn)程倉庫;
  • git revert: 只會(huì)撤銷某個(gè)版本的代碼,然后在當(dāng)前分支增加一條版本新記錄;
  • git revert: 只會(huì)撤銷指定版本的代碼,而不是指定版本后的所有版本。

十四、合并分支merge

1) 全部進(jìn)行合并,不過濾特定文件

  1. 切換到需要合并的分支,比如將dev合并到test分支
git checkout test
  1. 將dev合并到test分支
git merge dev
  1. 如果出現(xiàn)沖突,建議使用工具手動(dòng)解決沖突,(比如使用IEDA的Git解決沖突)

  2. 將解決后的沖突文件添加到暫存區(qū)并提交一個(gè)新的版本 (工具可能會(huì)自動(dòng)執(zhí)行這一步)

git add . && git commit -a

解決沖突后的提交需要使用-a選項(xiàng)

2) 忽略有沖突文件的合并

  1. 上述案例中的dev項(xiàng)目工作區(qū)添加一個(gè)文件 .gitattributes 寫入內(nèi)容
<忽略沖突文件的文件名> merge=ours
  1. 按照上述合并操作進(jìn)行合并

合并后的test分支中對(duì)應(yīng)文件如果和dev有沖突則保留原來的內(nèi)容,如果沒有沖突也會(huì)進(jìn)行合并

十五、鉤子事件

Git進(jìn)一步學(xué)習(xí)可以研究哈,目前只是了解

1) 客戶端鉤子事件

  1. 鉤子事件在一些特定命令執(zhí)行時(shí)觸發(fā)
  2. 鉤子函數(shù)腳本在 .git/hooks 下面
  3. 鉤子語法使用的為shell腳本,部分混雜了Perl代碼,可以Pytho或者其他腳本語言編寫
  4. 鉤子觸發(fā)的腳本文件需要正確命名,以.sample結(jié)尾的腳本文件,
  5. 一般情況下鉤子觸發(fā)的鉤子名稱
鉤子名字 觸發(fā)時(shí)間
pre-commit 執(zhí)行g(shù)it commit命令完成前被執(zhí)行。
prepare-commit-msg 在執(zhí)行完pre-commit鉤子之后被調(diào)用。
commit-msg git commit執(zhí)行完成后被調(diào)用。
post-commit post-commit鉤子在commit-msg鉤子之后立即被運(yùn)行 。
post-checkout post-checkout鉤子在使用git checkout命令時(shí)候會(huì)被調(diào)用。
pre-rebase pre-rebase鉤子在使用git rebase命令發(fā)生更改之前運(yùn)行
pre-receive pre-receive鉤子在有人用git push向倉庫推送代碼時(shí)被執(zhí)行。
update update 鉤子在pre-receive之后被調(diào)用,分別被每個(gè)推送上來的引用分別調(diào)用。
post-receive 在成功推送后被調(diào)用,適合用于發(fā)送通知。

2) 服務(wù)端鉤子使用 服務(wù)端接受推送時(shí)事件處理

  1. 服務(wù)端的鉤子同樣在 .git/hooks
  2. 服務(wù)端的鉤子配置一般是在托管平臺(tái)進(jìn)行管理

十六、合并代碼保留提交記錄:rebase功能的使用

rebase與merge功能類似,但有所不同

  1. git rebase 會(huì)將另外一個(gè)分支提交的所有新版本記錄復(fù)制到當(dāng)前分支中

2.切換到合并的分支,比如test

git checkout test

git rebase dev
  1. merge與rebase的相似點(diǎn):代碼層面沒有什么變化

  2. merge與rebase的區(qū)別: 版本記錄的變化

    • git merge命令合并代碼之后,版本記錄會(huì)按照時(shí)間順序排序,并自動(dòng)產(chǎn)生一個(gè)Merge branch的版本;撤銷操作會(huì)很麻煩
    • git rebase命令合并代碼之后,版本記錄會(huì)將目標(biāo)分支的版本放在后面,然后再將當(dāng)前分支的版本記錄放在前邊,不會(huì)產(chǎn)生其他類似Merge branch的版本。撤銷操作會(huì)相對(duì)容易

十七、復(fù)制指定記錄到當(dāng)前分支: cherry-pick

將另外一個(gè)分支中的某個(gè)版本單獨(dú)復(fù)制到當(dāng)前的分支中來; 建議在類似IDEA工具中進(jìn)行操作,如果出現(xiàn)沖突可以很方便解決

  1. 在對(duì)應(yīng)分支確定需要cherry-pick的提交
git log
  1. 切換到需要合并的分支
git cherry-pick <commit_hash>

十八、工作區(qū)暫存 stash解決提示代碼未提交問題

git stash 命令會(huì)將當(dāng)前工作區(qū)未提交的改動(dòng)放在一個(gè)stash棧中,此時(shí)代碼會(huì)與最新的提交保持一致,如果切換到
其他分支或者有改動(dòng)再次執(zhí)行,此時(shí)棧頂?shù)脑貢?huì)變成最新stash的記錄

還有種場景;在git pull時(shí)發(fā)現(xiàn)本地未修改未提交的文件與在服務(wù)器最新提交的記錄中也有修改導(dǎo)致pull失敗;
此時(shí)可以使用git stash && git pull && git stash pop 合并修改,如果有沖突則解決沖突。

  1. 執(zhí)行stash命令
git stash
  1. 查看stash棧中存放的記錄
git stash list
  1. 從stash棧中恢復(fù)棧頂?shù)牡奶峤?并保持棧頂?shù)挠涗?/li>
git stash apply
  1. 從stash棧中恢復(fù)指定的提交,并保持對(duì)應(yīng)的記錄
git stash apply <編號(hào)如stash@{0}>
  1. 從stash棧中彈出棧頂?shù)脑兀瑮V斜粡棾龅膭t不會(huì)保留
git stash pop
  1. 清除stash棧中指定的提交
git stash drop <提交的id比如stash@{1}>
  1. 清空stash棧中的信息
git stash clear

十九、解決臨時(shí)緊急任務(wù)的開發(fā)思路

  1. 場景復(fù)現(xiàn):dev分支正在開發(fā)下一個(gè)迭代版本,預(yù)計(jì)2個(gè)月;test分支為當(dāng)前發(fā)布線上版本;
    先有一個(gè)必須在一周上線的緊急任務(wù)!

  2. 設(shè)計(jì)思路:

    1. 從test中新建一個(gè)分支 temp,并在temp中完成緊急開發(fā)。
    2. 將temp中新的提交記錄通過git rebase的方式經(jīng)提交記錄復(fù)制到test版本中進(jìn)行測試上線
    3. 為了避免將來代碼合并產(chǎn)生沖突,將temp中的新提交git rebase到dev開發(fā)分支中

二十、代碼沖突解決總結(jié)

  1. git mergegit pull命令導(dǎo)致的沖突,處理完沖突后使用git commit -a;
  2. git rebase命令導(dǎo)致的沖突,處理完沖突之后使用git rebase --continuegit rebase --skip
  3. git stash apply命令導(dǎo)致的沖突,處理完沖突之后使用git add .即可。
  4. 終極解決方案:使用IDEA或者烏龜git處理沖突,直觀、大氣、方便、效率高

二十一、Git瘦身方案

1) 克隆最后一個(gè)版本,避免Git拉去所有的歷史版本導(dǎo)致緩慢

  1. 本地克隆
git clone <remoteAddr> --depth==1

代碼不會(huì)改變,只是歷史提交記錄只有一條

2) 清空版本記錄

  1. -新建本地干凈分支,只保留最后一次版本信息
git checkout --orphan <new_branch_name>
  1. 刪除久的分支
git branch -D <branch_name>
  1. 將新的分支重命名為原有分支
git branch -m <branch_name>
  1. 強(qiáng)制推送到遠(yuǎn)程服務(wù)器(臨時(shí)關(guān)閉強(qiáng)制推送限制)
git push -f origin <branch_name>

3) 清理大文件(比較高級(jí))

使用git branch-filter可以遍歷 Git 的版本歷史信息

  1. 找出大文件對(duì)應(yīng)的hash值,這里一找出前5個(gè)為例
git verify-pack -v .git/objects/pack/pack-*.idx | sort -k 3 -g | tail -5
  1. 根據(jù)hash值找到對(duì)應(yīng)文件名
git rev-list --objects --all | grep <hash_value>
  1. 執(zhí)行刪除文件命令
git filter-branch --index-filter 'git rm --cached --ignore-unmatch <file_name>'
  1. 刪除無用的記錄信息
rm -rf .git/refs/original/  && git reflog expire --expire=now --all
  1. 重新建立文件與 Git 倉庫的關(guān)聯(lián)關(guān)系
git fsck --full --unreachable
  1. 重新壓縮代碼,減少倉庫體積
git repack -A -d
  1. 執(zhí)行GC,清理垃圾
git gc --aggressive --prune=now
  1. 強(qiáng)制推送到遠(yuǎn)程
git push --force origin master

二十二、Docker快速搭建GitLab

1) 快速搭建Docker環(huán)境

Linux環(huán)境Docker安裝略

  1. 拉去鏡像
docker pull gitlab/gitlab-ce
  1. 創(chuàng)建本地持久化卷
mkdir -p ~/config/gitlab/config
mkdir -p ~/config/gitlab/logs
mkdir -p ~/config/gitlab/data

假設(shè)默認(rèn)用戶為ubuntu 則 ~ = /home/ubuntu

  1. 運(yùn)行容器
docker run --detach --publish 8443:443  \
    --publish 8090:80 --publish 2222:22 \
    --name gitlab --restart always 
    -v /home/ubuntu/config/gitlab/config:/etc/gitlab   \
    -v /home/ubuntu/config/gitlab/logs:/var/log/gitlab \
    -v /home/ubuntu/config/gitlab/data:/var/opt/gitlab \
    gitlab/gitlab-ce

進(jìn)入http://localhost:8090即可進(jìn)入Gitlab頁面

  1. 查找容器ID
docker ps |grep gitlab/gitlab-ce
  1. 進(jìn)入容器
docker exec -it <容器ID> sh
  1. GitLab配置文件路徑 /opt/gitlab/embedded/service/gitlab-rails/config/gitlab.yml
  1. GitLab容器內(nèi)總開關(guān)命令
gitlab-ctl restart  // 重啟
gitlab-ctl stop      // 停止
gitlab-ctl start     // 啟動(dòng)

二十三、補(bǔ)充

  1. git tag標(biāo)簽的使用
  2. 遠(yuǎn)端分支強(qiáng)制覆蓋本地對(duì)應(yīng)分支
git fetch --all  
git reset --hard origin/<branch_name>
git pull
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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