一些Git的高端用法

假设你已经了解了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 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 前的状态
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
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容