假設你已經(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 cat-file -p comitMsgId

獲取遠端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