官方资料:Git Community Book 中文版

1. 个人gitconfig

 1# cat ~/.gitconfig
 2
 3[color]
 4	ui = auto
 5
 6[safe]
 7#	directory = *
 8
 9[core]
10# 支持中文
11	quotepath = false
12	editor = vim
13#
14	pager = less -x1,5
15# 支持https下保存用户名密码
16[credential]
17	helper = store

参考git 显示中文和解决中文乱码

1git config --global core.quotepath false

3. 使用git grep快速搜索

1git grep -Inw xxx
2git grep -Inw -p xxx
3git grep -Inw --heading xxx

5. 取消git clone –depth=1

1git pull --unshadow

4. git统计每个人的代码量

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

6. 解决warning: refname ‘private’ is ambiguous

6.1. 现象

 1$ git checkout private
 2warning: refname 'private' is ambiguous.
 3Switched to branch 'private'
 4Your branch is up to date with 'private/private'.
 5
 6$ git branch -a
 7  main
 8* private
 9  remotes/origin/main
10  remotes/private/HEAD -> private/private
11  remotes/private/private

6.2. 解决方法

1$ find .git -name HEAD
2.git/logs/refs/remotes/private/HEAD
3.git/logs/HEAD
4.git/refs/remotes/private/HEAD
5.git/HEAD
6
7find .git -name HEAD | grep -w private | xargs rm -f

6.3. 处理后的现象

1$ git checkout private
2Switched to branch 'private'
3Your branch is up to date with 'private/private'.

7. 合并git仓库并保留commit记录

参考【Git教程】如何清除git仓库的所有提交记录,成为一个新的干净仓库

从网上查到的使用git merge的方式不能满足需求。就改成了将一个仓库的历史记录生成patch,再在另一个仓库中使用git am应用patch来实现合并仓库。

仓库目录结构如下,需要将repoBBB中的提交记录合并到repoAAA中,之后就可以删除repoBBB了。

1.
2├── patch
3├── repoAAA
4└── repoBBB

7.1. 没有同名文件

两个参考下没有同名文件(包括.gitignore等以.开头的文件),或同名文件已经移动或重命名,并commit。

需要注意,repoAAA中不能存在任何repoBBB历史中曾出现过的文件,否则会导致patch应用失败。

 1rm -f patch/*
 2cd repoAAA
 3# 把$BRANCH分支所有commit都生成patch
 4git format-patch --root -o ../patch  $BRANCH
 5
 6
 7cd repoBBB
 8# 防止之前有未完成的操作
 9git am --abort
10# 应用所有patch
11git am ../patch/*
12git push

7.2. 存在同名文件

需要首先将同名文件用新仓库中的文件覆盖。

需要注意,repoAAA中不能存在任何repoBBB历史中曾出现过的文件,否则会导致patch应用失败。

 1rm -f patch/*
 2cd repoAAA
 3
 4first_commit=$(git rev-list --max-parents=0 HEAD)
 5# first_commit=$(git log --reverse | head -1 | cut -d ' ' -f 2)
 6
 7# 除第一次提交之外,其他的commit都生成patch
 8git format-patch -o ../patch  ${first_commit}
 9# 回退到第一次commit时的状态,为了后续覆盖repoBBB中的同名文件使用
10git reset --hard  ${first_commit}
11
12
13cd repoBBB
14cp -fr ../repoAAA/*   ./
15# 使用repoBBB中的文件覆盖当前目录的同名文件
16cp -fr ../repoAAA/.*  ./
17git add .
18# 这次commit是为了保证repoAAA中的文件与repoBBB的${first_commit}一致,以便后续应用patch
19git commit -m "message"
20
21git am --abort
22git am ../patch/*
23git push