menu XUJINKAI 的个人主页
create settings
home
主页
list
全部博文
  • Collection
  • About
  • assistant_photo
    个人项目
    tag_faces
    捐赠
    person
    关于

    git常用命令整理

    Tags: git

    git常用命令整理

    常用命令

    根据.gitignore清除仓库

    git clean -dXf
    

    将其他分支merge到当前分支

    merge命令会更新当前分支(到目标分支),若想反过来将目标分支更新到当前分支,可使用如下命令:

    git fetch . develop:master
    # git fetch <remote> <sourceBranch>:<destinationBranch>
    # 当前在develop分支,master分支落后,将master分支更新到develop分支
    # 使用SourceTree可添加自定义命令 git fetch . $BRANCH :master
    

    以上命令相当于:

    git checkout master  # 切换到master分支
    git merge develop    # 将master分支同步到develop
    git checkout develop # 切换回develop分支
    

    统计代码行数

    bash代码,需要在linux环境执行:

    git log --format='%aE' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; diff += $1 + $2; loc += $1 - $2 } END { printf "add: %6s, remove: %6s, diff: %6s, sum: %6s\n", add, subs, diff, loc }' -; done
    

    温馨提示:代码行数无法判定贡献值大小

    网上能搜到的代码使用用户名统计,这里改为使用email来统计,并增加了diff一栏。

    引用其他仓库代码(submodule)

    submodule对于本仓库而言,仅是一个指针,并不会将submodule的代码重复上传,这样保证了公共代码在云端仅有一份。

    git submodule add http://URL                    # 添加引用
    git submodule update --init --recursive         # 更新
    

    全局设置

    使git记住用户名密码

    git config --global credential.helper store
    

    设置用户名及邮箱

    在使用git之前,必须正确设置邮箱名,否则会上传失败。

    git config --global user.name "用户名"
    git config --global user.email "邮箱名@邮箱.com"
    

    对目录文件名大小写敏感

    git config --global core.ignorecase false
    

    修改默认编辑器为vim

    git config --global core.editor vim
    

    统一文件换行符

    # 统一换行符为 crlf
    git config --global core.eol crlf
    # 将自动转换关闭,避免转换失败不能不同进行提交
    git config --global core.autocrlf true
    # 禁止混用 lf 和 crlf 两种换行符
    git config --global core.safecrlf false
    

    自动转换换行符(autocrlf)最好配合.gitattributes文件指定换行符格式:

    * text eol=lf
    

    常见问题处理

    修改本地提交(commit)的邮箱

    若已在本地使用错误的邮箱提交,可使用以下脚本修改后上传。

    #!/bin/sh
    
    git filter-branch --env-filter '
    
    OLD_EMAIL="要修改的旧邮箱"
    CORRECT_NAME="正确的用户名"
    CORRECT_EMAIL="正确的邮箱@邮箱.com"
    
    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
    ' --tag-name-filter cat -- --branches --tags
    

    清理节点

    谨慎使用以下命令,因为会节点会永久丢失。

    git reflog expire --expire-unreachable=now --all
    git gc --prune=now      # 本地
    git remote prune origin # 远端
    

    或在.git文件夹中,移除refs/remote中错误的节点。

    获取信息

    在写一些自动化脚本时经常需要获取git仓库的信息:

    获取tag信息

    获取当前节点的tag git describe --tags --exact-match HEAD 当前节点无tag会报错

    获取最近的一个tag git describe --tags --abbrev=0

    根据最近的tag自动生成tag git describe --tags 例如最近的tag是3个commit之前的v1.0,则此命令会得到v1.0-3-HASH

    获取commit哈希值

    短哈希 git rev-parse --short HEAD

    完整哈希 git rev-parse HEAD


    Disqus评论加载中。。。