假设你已经了解了git flow的使用了,那么就不得不了解一下运行流程,和其中涉及到的命令
查看当前HEAD分支
git symbolic-ref HEAD
Tag之间亦有差别
轻量标签(Lightweight Tag)是 Git 中的一种标记特定提交的轻量级方式,它不包含额外的信息(比如标签作者、日期、描述等),仅仅是一个指向某个特定提交的引用。
与附注标签(Annotated Tag)相比,轻量标签没有存储额外的元数据,因此在创建和使用时更加简单。它们通常用于临时或简单的版本标记,或者用于在代码中标记重要的里程碑,而不需要额外的信息。
要创建轻量标签,只需要指定标签名称和要标记的提交即可:
git tag <tag-name> <commit>
带附注的标签(Annotated Tag)是 Git 中的一种标签类型,它不仅仅是一个简单的指向某个特定提交的引用,还包含额外的元数据,比如标签创建者的名字和邮箱、标签的创建日期以及标签的描述信息。带附注的标签通常用于标记重要的版本或发布点,因为它们提供了更多的上下文信息。
git tag -a <tag-name> -m "<tag-message>"
<tag-name> 是你想要创建的标签名称。
<tag-message> 是标签的描述信息。
在默认情况下,git-flow 在执行 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 前的状态
git bisect view:当前二分查找过程还剩下多少 commit
git bisect log:查看 bisect 过程的日志
git bisect run:通过可执行文件来自动测试和打 good、bad 标记
git bisect replay:根据日志文件重新跑二分查找过程
查看丢失的提交记录
git reflog
git reflog 可以查看所有分支的所有操作记录(包括commit和reset的操作),包括已经被删除的commit记录
git log 则不能查看已经删除了的commit记录
git blame 显示文件的每一行最后修改的版本和作者
--abbrev-commit: hash值commitID简短形式出现
--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
# 将远程分支创建为本地分支
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
清除未引用的对象(旧的提交历史)
比如全局修改历史后,产生了新的commit Id,此时旧的commit id在本地历史中不可见但存在;可以使用gc进行存储库清理
git reflog expire --expire=now --all
git gc --prune=now --aggressive