Git 版本控制基本使用
1.Idea版本共計基本操作
公司使用Git作為代碼版本管理工具,平時使用非常頻繁這里簡單整理方便后續學習查看
1.1 merge未推送回滾
我們代碼merge操作后,并且沒有推送到遠端,本地項目發現有推送箭頭,可以使用 Reset Current branch to Here… 將分支回退到merge之前。
注意:這是代碼未推送到遠端,既未push時候的操作。
1.2 merge推送到遠端后回滾
我們代碼如果推送到了遠端,那么我們就需要強制回退了,需要使用 --force命令進行回退了,具體操作步驟如下
-
我們首先使用 Reset Current branch to Here… ,回退時候會提示選擇那種回退,我們選擇 hard 類型,將本地分支代碼指向要回退的提交處,并且我們這種回退需要跟其他同事溝通,因為回退會影響其他人的提交。我們 Reset 之后在項目上會發現本地版本落后遠端代碼,會提示可以下載遠端代碼。
-
我們本地回退到要回退的提交點時,我們再通過git進行強制回退提交,在提交頁面選擇 Force push 的選項,然后進行提交,既本地代碼將會覆蓋遠端代碼,既回退操作。
1.3 部分代碼合并
有很多時候,我們的需求可能只是修改一兩個文件,或者很少的文件,修改后我們要合并到 UAT 或者 SIT 測試環境,此時我們從生產拉取的代碼與生產 master 在其他文件有沖突,此時我們如果只想合并我們某一個或者幾個提交,那么我們可以使用 Cherry-pick 功能進行基于commit 級別的合并,這樣只會合并提交部分代碼,避免了整個項目 merge 引起的沖突配置問題。具體操作如下:
-
我們在業務分支進行代碼修改,具體修改內容信息如下
-
代碼修改后,我們切換到要并入代碼的分支
-
切換之后我們點擊左下角的git按鈕,展示git提交目錄信息,然后在左上角的搜索分支框中填入我們的業務分支索引信息既 CCMS 搜索到自己的業務分支
-
雙擊之后,我們找到了剛剛提交的記錄信息,ceshi 提交,然后我們右鍵選擇 Cherry-pick 選項,即可檢出我們的ceshi提交內容到當前分支,如果有沖突解決,沒有沖突的話我們直接push 到遠端即可完成代碼的合并處理。
2. 客戶端基礎操作
Git客戶端操作相對簡單一些,我們在項目的目錄打開客戶端,shift + 右鍵,選擇 git bash,可以觀察當前項目是什么分支,然后可以使用客戶端進行操作
2.1 版本回退
使用命令行窗口我們同樣可以實現代碼版本操作,具體操作實現如下
-
我們可以使用git logs,查看當前branch 的git 操作日志,從而獲取我們的 commit id 信息,此處我們可以看到 ceshi 提交的版本信息
git log
-
我們要回滾 ceshi 版本信息,那么我們就要獲取測試之前的最后一版 commt id , 既 88f5559dcca3b243bb65b488c8cd0af82fe15965
-
有了提交id之后,我們需要進行本地回滾操作既使用 git reset --hard commit-id 命令,執行之后,在 Idea中觀察代碼,發現分支也進行了本地回退。
git reset --hard commit-id
-
之后執行強制提交,執行命令 git push origin your-branch-name --force,執行此代碼將本地回滾內容強制推送到遠端服務中,出現如下提示既遠端代碼回滾推送成功
git push origin your-branch --force
2.2 代碼合并追蹤
我們有時候會發現,有一些代碼不應該出現在一個分支上,比如我有一個分支 branch-A,修改了部分內容,進行了提交commit-A,然后合并到了 sit 上,那么我們的修改 commit-A 記錄應該出現在 branch-A 和 sit 上面,但是現在發現我們的 uat 分支也出現了 commit-A 修改的代碼,那么這個代碼就是被人錯誤的合并到了自己分支然后推送到 uat分支,要么就是被人直接錯誤合并到 uat 分支。
那么我們應該如何查找到底是誰如何操作到 uat 分支上呢,如果是有人將代碼合并到自己分支,然后再將代碼 merge 到 uat ,那么我們找到此人自己分支觀察git 提交記錄即可,如果是直接合并到 uat ,那么直接觀察 uat 分支即可
-
我們首先要更新自己本地所有git引用信息
# --all 獲取所有遠程倉庫的最新引用 # --prune 自動清理已刪除的遠程分支引用 git fetch --all --prune
-
我們首先找到對應的代碼信息,比如為 WorkFlowJumpServiceImpl 類的 156行到176行信息為錯誤信息,那么我們在同目錄中打開git窗口
-
之后我們執行命令 git blame WorkFlowJumpServiceImpl.java -L 156,176 ,此時我們可以看到每行的 commit id
git blame yourClass.java -L rowNumA,rowNumB
-
之后我們需要確定哪些分支擁有這些 commit-id,此處為舉例,正常新的業務應該只有 自己新增分支,合并測試分支 兩個分支包含此提交,其他分支應該沒有,如果有則證明該分支有人誤操作合并此代碼到此分支,此處我們找到對應分支查找提交記錄即可,就可以知道代碼是如何被提交到錯誤分支的,我們使用命令 git branch --contains commitId 即可觀察哪些分支包含此提交
# -a 參數顯示本地 + 遠程分支 git branch -a --contains commitId
-
找到包含的 分支 后,切換到問題分支,查看 git 操作記錄,了解代碼是如何添加到錯誤分支的,此處我們使用idea進行查看更加方便,此處為查詢是否有uat代碼合并到了業務分支。
2.3 生產Tag回退
我們在完整推送后端代碼后需要新增一個記錄Tag標簽,標注此次上線內容,此Tag標簽會作為回滾的標記點,作為未來回退版本依據。注意Tag不是一個brunch分支,只是一個當前提交點的一個鏡像,Tag 不會隨著 git commit 自動更新,它是靜態的。Tag 通常用于標識“穩定版本”,例如軟件發布的版本號。方便回溯版本。
我們只對master做Tag標記,具體格式為VyyyyMMdd.兩位序列號 eg: master-V20250630.01
填寫此次上線的具體上線內容描述,之后會作為回滾的依據條件,方便后續回滾了解回滾詳情
新增Tag完畢之后的效果如下:
如果上線發現需要回退,那么我們首先獲取需要回退tag的最后提交commit-id,根據commit-id進行回退,我們可以使用如下命令獲取commit-id
# --all 獲取所有遠程倉庫的最新引用
# --prune 自動清理已刪除的遠程分支引用
git fetch --all --prune
# 展示信息
git show master-V20250630.01
# 或者
git rev-parse master-V20250630.01^{commit}
之后我們切換分支到master,然后進行回退rollback操作,最后推送修改后master代碼到遠端即可
# 切換為master分支
git checkout master# 強制回退
git reset --hard 80a291da28650d62a48566942ae08a85eb2c6402# 推送到遠端
git push origin master --force
注意:如果我們回退版本不確定,我們可以使用模糊命令查看Tag注釋信息,可以快速定為到需要找到的版本Tag進行回滾
# 查找 master-V2025 開頭的Tag信息
git tag -l "master-V2025*" | xargs -I {} git show {}
2.4 其他操作
如果我們在Cherry-pick 操作過程中,已經Cherry-pick完畢了,但是代碼沒有進行push 操作,發現選錯了分支,那么我們可以使用 git cherry-pick --abort命令來取消Cherry-pick操作。
git cherry-pick --abort
同樣的我們 merge操作發現選錯了分支,并且沒有push到遠端,同樣可以使用 git merge --abort 命令或者使用 idea 選擇 git merge abort 操作進行回退
git merge --abort
2.5 git命令總結
--------------------------------------簡單提交--------------------------------------
git add .
git commit -m 'commit message'
git push origin 'your brunch name'
--------------------------------------刪除分支--------------------------------------
# 刪除分支
git branch -d your-branch
# 如果該分支有未合并的更改,Git 會提示錯誤。若仍想強制刪除該分支,可以使用 -D 參數:
git branch -D your-branch
# 推送刪除到遠程倉庫
git push origin --delete your-branch--------------------------------------分支改名--------------------------------------
# 重命名分支
git branch -m SIT2-RULE-20250805-基礎拖拽規則提取-lxc# 推送新分支并設置上游
git push origin -u SIT2-RULE-20250805-基礎拖拽規則提取-lxc# 刪除舊分支
git push origin --delete SIT2_NEW--------------------------------------代碼回滾--------------------------------------
# 查看提交歷史,找到上一個版本的commit_ID
git log# 切換到你想要回退的分支
git checkout your-branch# 將分支回退重置到commit-id版本
git reset --hard commit-id
git reset --hard 241d20a0d94090f97244a7f51cb69eee683ae5d8# 強制推送到遠端倉庫
git push origin your-branch-name --force--------------------------------------取消操作--------------------------------------
# pick 取消
git cherry-pick --abort# merge 取消
git merge --abort--------------------------------------代碼合并追蹤--------------------------------------
git blame youClass.java -L rowNumA,rowNumB
git branch --contains commitId--------------------------------------代碼版本Tag管理--------------------------------------
# --all 獲取所有遠程倉庫的最新引用
# --prune 自動清理已刪除的遠程分支引用
git fetch --all --prune# 項目發布后需要新增一個 tag, 格式為VyyyyMMdd.序列號 eg: master-V20250630.01,后續版本回滾依賴此Tag信息# 回滾操作獲取tag分支最后提交的commit-id eg: 80a291da28650d62a48566942ae08a85eb2c6402
git rev-parse master-V20250630.01^{commit}
# 或者使用
git show master-V20250630.01# 切換為master分支
git checkout master# 強制回退
git reset --hard 80a291da28650d62a48566942ae08a85eb2c6402# 推送到遠端
git push origin master --force# 刪除標簽,先刪除本地然后刪除遠端
git tag -d master-20250627-image-tag
git push origin --delete tag master-20250627-image-tag# 模糊查詢Tag注釋信息
git tag -l "master-V2025*" | xargs -I {} git show {}
3. GitLab代碼加解密
我們有這樣一個需求,就是我們需要使用外圍服務的gitlab進行代碼開發,代碼是公司的知識產權,我們不想外圍獲取我們的代碼源碼信息,那么我們就是需要將GitLab代碼進行加密處理,此處簡單記錄一下方便后續使用。
我們使用的工具是 git-crypt
對提交的文件進行可配置化的加密解密,git-crypt
是一款開源的 Git 倉庫加密工具,主要用于對敏感文件進行透明加密,確保只有持有密鑰的用戶才能訪問加密內容,同時不影響非加密文件的正常讀寫。具體的操作步驟如下:
3.1 基礎環境
我們需要準備Git環境,我將Git安裝在了D盤的目錄下,之后我們需要下載 git-crypt,并且將exe文件放置到Git的cmd目錄中,下載地址在此
下載后放置到我們的Git對應cmd目錄中
之后,我們下載我們 GitLab 測試的項目 git-crypt 到本地,導入到idea中
3.2 準備git-crypt環境
我們打開GitBash
,進入到導入項目的工作目錄,執行初始化命令,因為我已經執行過一次所以有以下提示
# 初始化git-crypt
git-crypt init
初始化之后我們要設置加密文件到本地磁盤中,協同開發的時候,該文件需要共享到他人,一定要需要保存好,具體操作如下
# 生成文件keyFile 到D:\crypt-key-file\ 目錄中
git-crypt export-key /d/crypt-key-file/keyFile
生成秘鑰文件之后,我們需要設定具體哪些文件需要進行加密解密,此處我們需要在項目根目錄生成一個 .gitattributes
文件,里面配置具體哪些文件需要進行加解密,語法為 : 文件名或文件范圍 filter=git-crypt diff=git-crypt
配置規則示例如下所示:
# 將特定目錄下 .java結尾文件加解密
src/main/java/cn/git/crypt/**/*.java filter=git-crypt diff=git-crypt
# 將Git開頭文件加解密
Git* filter=git-crypt diff=git-crypt
# 將Git目錄下所有文件加解密
Git/** filter=git-crypt diff=git-crypt
此處我們選擇的配置為只加密固定目錄下的全部java文件,項目目錄如下所示
src/main/java/cn/git/crypt/**/*.java filter=git-crypt diff=git-crypt
3.3 代碼加密提交
環境設置好后,我們現在修改代碼進行提交,觀察一下代碼在git環境是否已經進行加密。我們修改了三個文件兩個在crypt目錄下(既配置加密的目錄),Test文件沒有在目錄下
我們執行 git-crypt status / git-crypt status -f 命令可以看到哪些文件提交會被加密,哪些不會。
注意:只有在文件被修改并重新添加到暫存區時,才會被git-crypt status 命令掃描。
# 我們使用git-crypt status即可
# git-crypt status -f
git-crypt status
git-crypt status -f 與 git-crypt status 的區別
-
git-crypt status:顯示詳細的狀態信息,列出所有受管理的文件及其當前狀態(加密/解密),提供更完整的輸出信息。
-
git-crypt status -f:
-f 參數表示 “fast” 或 “force” 模式,提供更簡潔的輸出,通常只顯示文件列表。執行速度更快,不進行詳細的狀態檢查,主要用于快速查看哪些文件被 git-crypt 管理。
執行效果如下:
之后我們提交修改代碼到遠程服務
3.4 查看GitLab
我們登錄我們GitLab賬號,進入到加密項目對應文件中查看三個修改文件,具體結果如下,發現配置的目錄下兩個文件都已經加密,Test文件未加密
3.5 GitLab代碼解密
首先需要解密的電腦上同樣需要安裝Git工具以及git-crypt
工具,安裝步驟與加密步驟一致。同時解密需要使用我們之前的加密秘鑰文件 keyFile,我們先將GitLab中的加密項目克隆到本地
然后進入到克隆的git-crypt
項目中,發現文件被加密了
之后我們需要進入到倉庫根目錄,執行解密操作
# 注意 后面的目錄修改成自己放置keyFile文件的目錄地址
git-crypt unlock /d/crypt-key-file/keyFile
執行后我們再查看代碼部分,文件成功解密成功