一些Git的高端用法

假設你已經(jīng)了解了git flow的使用了,那么就不得不了解一下運行流程,和其中涉及到的命令

查看當前HEAD分支

git symbolic-ref HEAD

Tag之間亦有差別

輕量標簽(Lightweight Tag)是 Git 中的一種標記特定提交的輕量級方式,它不包含額外的信息(比如標簽作者、日期、描述等),僅僅是一個指向某個特定提交的引用。

與附注標簽(Annotated Tag)相比,輕量標簽沒有存儲額外的元數(shù)據(jù),因此在創(chuàng)建和使用時更加簡單。它們通常用于臨時或簡單的版本標記,或者用于在代碼中標記重要的里程碑,而不需要額外的信息。

要創(chuàng)建輕量標簽,只需要指定標簽名稱和要標記的提交即可:

git tag <tag-name> <commit>

帶附注的標簽(Annotated Tag)是 Git 中的一種標簽類型,它不僅僅是一個簡單的指向某個特定提交的引用,還包含額外的元數(shù)據(jù),比如標簽創(chuàng)建者的名字和郵箱、標簽的創(chuàng)建日期以及標簽的描述信息。帶附注的標簽通常用于標記重要的版本或發(fā)布點,因為它們提供了更多的上下文信息。

git tag -a <tag-name> -m "<tag-message>"

<tag-name> 是你想要創(chuàng)建的標簽名稱。
<tag-message> 是標簽的描述信息。

在默認情況下,git-flow 在執(zhí)行 git tag 命令時使用的是帶附注的標簽(Annotated Tag),而不是輕量標簽(Lightweight Tag)。

查看單次提交的詳情

查看標簽詳細信息

git show tagName
git show.png

查看帶附注的標簽信息

git cat-file -p comitMsgId
git cat-file -p.png

獲取遠端tag并同步至本地

git tag -l | xargs git tag -d
git fetch --tags

查看指定的提交

通過二分法查找快速定位想要的提交

git bisect start

git bisect start:開啟一個二分查找過程
git bisect good/new:指定某個 commit 為 good/new
git bisect bad/old:指定某個 commit 為 bad/old
git bisect terms:查看當前用的標記是啥
git bisect skip:跳過某個 commit
git bisect reset:回到 git bisect 前的狀態(tài)
git bisect view:當前二分查找過程還剩下多少 commit
git bisect log:查看 bisect 過程的日志
git bisect run:通過可執(zhí)行文件來自動測試和打 good、bad 標記
git bisect replay:根據(jù)日志文件重新跑二分查找過程

查看丟失的提交記錄

git reflog

git reflog 可以查看所有分支的所有操作記錄(包括commit和reset的操作),包括已經(jīng)被刪除的commit記錄
git log 則不能查看已經(jīng)刪除了的commit記錄
git blame 顯示文件的每一行最后修改的版本和作者

--abbrev-commit: hash值commitID簡短形式出現(xiàn)
--graph:以ASCII 圖形表示的分支合并歷史

修改歷史記錄

通過git filter-branch(廢棄) git filter-repo(建議)修改過往提交郵箱

git filter-branch -f --env-filter '
OLD_EMAILS=("old1@qq.com" "old2@qq.com")
CORRECT_NAME="Soul"
CORRECT_EMAIL="new@gmail.com"

for OLD_EMAIL in "${OLD_EMAILS[@]}"
do
    if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_COMMITTER_NAME="$CORRECT_NAME"
        export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
    fi
    if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
    then
        export GIT_AUTHOR_NAME="$CORRECT_NAME"
        export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
    fi
done
' --tag-name-filter cat -- --branches --tags


git filter-repo --force --commit-callback '
if commit.author_name == b"oldName":
    commit.author_name = b"newName"
    commit.author_email = b"newEmail@mail.com"
if commit.committer_name == b"oldName":
    commit.committer_name = b"newName"
    commit.committer_email = b"newEmail@mail.com"
'

強制同步遠端的代碼到本地

用于多端同步

# 獲取所有遠程分支
git fetch --all

# 將遠程分支創(chuàng)建為本地分支
for branch in $(git branch -r | grep -v '\->'); do
    git branch --track ${branch##origin/} $branch || true
done

# 強制同步所有本地分支到對應的遠程分支
for branch in $(git branch | sed 's/..//'); do
    git checkout $branch
    git reset --hard origin/$branch
done

清除未引用的對象(舊的提交歷史)

比如全局修改歷史后,產(chǎn)生了新的commit Id,此時舊的commit id在本地歷史中不可見但存在;可以使用gc進行存儲庫清理

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

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

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