发布于

Git常用命令整理

Authors
  • avatar
    Name
    田中原
    Twitter

Git

目录

config相关

显示所有的配置

git config --list
git config -l

添加全局配置

git config --global user.name name

git config --global user.email [email protected]

为本地的工程里面添加单独的配置,可以使用不同的用户名和密码

git config --local [user.name](http://user.name) xxx

git config --local user.email [[email protected]](mailto:[email protected])

mac下全局配置的路径

~/.gitconfig

local配置的路径

$Project_dir/.git/configx

tag相关

# 查看所有tag
git tag

# 切换到某个tag
git checkout tag_name

# tag无法编辑,如果想基于tag编辑需要切换出一个新分支
git checkout -b branch_name tag_name

给分支添加备注

# 给分支写备注

git config branch.<branchName>.description <message>

# 获取当前分支的备注

git config branch.<branchName>.description


清空本地不存在的远端分支
git remote prune origin
git fetch -p origin

git clone depth=1时切换分支
git clone --depth 1 https://github.com/xxxxxxx.git
git remote set-branches origin 'remote_branch_name'
git fetch --depth 1 origin remote_branch_name
git checkout remote_branch_name
cherry-pick 将某次提交应用到另一分支上
git checkout a

# 将b分支的最新提交应用到a分支上
git cherry-pick b

# 或通过hash提交,可用多个hash
git cherry-pick <commitHash>
git cherry-pick <commitHash> <commitHash>
git cherry-pick 75f9991a9ae28ff396c5bbbaa55fa7c401707724 c42a39af542092aa25b54b0202e0b78859a928f2

# 转移连续的提交 (包右不包左)
git cherry-pick <commitHash>...<commitHash>

# 包含到A
git cherry-pick A^..B

rebase

# 继续
git rebase --continue
# 如果想放弃当前操作
git rebase --abort

fetch
# 拉取一定层级的记录
git fetch --depth=1

# 获取全部提交
git fetch --unshallow

设置git命令别名

git config --global alias.desc branch.develop-fusion-model-tags.description

git config --global alias.st status
git config --global alias.co checkout
git config --global alias.ci commit
git config --global alias.br branch
git config --global alias.cp cherry-pick
git config --global alias.unstage 'reset HEAD'
# 可用git pull -r代替
git config --global alias.fr '!f() { git fetch && git rebase $@; }; f';
# git提交日志
git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset - %Cgreen(%cd)%C(yellow)%d%Creset %s %C(blue)[%an/%cn]%Creset' --date=format:'%Y-%m-%d %H:%M:%S' --abbrev-commit"

删除git别名

git config --global --unset alias.xxx

设置git分支描述alias

git config --global --add alias.about '!describe() { msg="$1"; git config branch."$(git rev-parse --abbrev-ref HEAD)".description ${msg:+"$msg"}; }; describe'

通过bash设置别名获取分支信息

Step 1:

vi ~/.bashrc

Step 2: Put this

alias git-describe-branches='for line in $(git branch); do

  description=$(git config branch.$line.description)

  if [ -n "$description" ]; then

    echo "$line     $description"

  fi

done'

Step 3:

source ~/.bashrc

Step 4:

git-describe-branches

OR

for line in $(git branch); do

  description=$(git config branch.$line.description)

  if [ -n "$description" ]; then

    echo "$line     $description"

  fi

done

统计

统计仓库提交top5

# 查看仓库提交者排名前 5
git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5

统计每个人增删行数

# 统计每个人增删行数
git log --format='%aN' | sort -u | while read name; do echo -en "$name\t"; git log --author="$name" --pretty=tformat: --numstat | awk '{ add += $1; subs += $2; loc += $1 - $2 } END { printf "added lines: %s, removed lines: %s, total lines: %s\n", add, subs, loc }' -; done

获上周自己的提交历史

#!/bin/bash
function isMacOS() {
  # Mac下date命令式BSD(Berkeley Software Distribution)系的,
  # Linux 下date命令式GNU(GNU’s Not Unix)系,二者用法有一些区别。
  # BSD并不是特指定任何一个BSD衍生版本,而是类UNIX操作系统中的一个分支的总称。
  # Mac OS X 和 iOS实际上基于 Darwin,Darwin是BSD其中一个分支。
  uNames=$(uname -s)
  osName=${uNames: 0: 4}
  if [ "$osName" == "Darw" ] # Darwin, AKA "Mac OS X"
  then
    echo 0
  elif [ "$osName" == "Linu" ] # Linux, AKA "GNU/Linux"
  then
    echo 1
  elif [ "$osName" == "MING" ] # MINGW, windows, git-bash
  then
    echo 2
  else
    echo 3
  fi
}
is_mac=$(isMacOS)
author_name=$(git config -l|grep user.name=|cut -c11-)
if [ -z "$author_name" ]; then
  echo "[ERR]: Can not determine username for git, please check user.name"
  exit 1
fi

now_date=$(date +%Y-%m-%d)
if [ "$is_mac" ];
then
  # Mac , 通过-v参数,-v-1d 代表前一天,-v-1y代表上一年
  last_week=$(date -v-7d +%Y-%m-%d)
else
  # Linux,通过–date参数实线,–date=“-1 day” 代表前一天, –date=“-1 year” 代表上一年
  last_week=$(date -date="-7 day" +%Y-%m-%d)
fi
git log --oneline --since="$last_week" --until="$now_date" --author="$author_name" | awk '{ print $2$3}'

.gitignore配置文件

配置文件规则
  1. #为注释
  2. *.[oa] //忽略后缀为.o .a
  3. *.[oa] !my.a //忽略后缀为.o .a,my.a除外
  4. abc //忽略abc文件和abc目录
  5. adb/ //只忽略abc目录不忽略abc文件
  6. abc !adb/ //只忽略abc文件不忽略abc目录
  7. /dbg //只忽略当前文件下的dbg文件和目录,子目录的不忽略
ignore配置不生效的问题

在开发过程中经常会有需要将已经追踪过的文件添加为忽略文件,但是直接配置.gitignore文件是不会生效的。这时候需要先把本地缓存删除然后再提交

git rm -r --cached .
强制添加已被忽略文件

想要添加文件到Git但是已经被忽略的,可以通过-f强制添加到Git

git add -f filename
检查配置是由哪个配置忽略掉的

或者想修改.gitignore规则,可以使用git check-ignore命令检查当前文件是被.gitingore哪里的配置忽略掉的

git check-ignore -v filename