git高级命令

用户信息

查询用户信息

git config –list

git修改本地仓库姓名和邮箱

git config user.name ‘zph’ git config user.email 1113955004@qq.com

git修改全局仓库姓名和邮箱

git config –global user.name ‘zph’ git config –global user.email zph@example.com

修改 Commit 的用户名与邮箱

注意: 只建议修改未 push 的 commit。 因为修改 Commit 的用户名或邮箱会生成一个新的 commit 来替换之前的 commit 。如果在修改之前已经 push 到了远端,修改后再次 push 会出现冲突。 只能使用 push -f。 如果其他人已经拉取( pull )了旧 commit 会出现很多麻烦。

只修改最新的 commit

如果你只需要修改最新的 commit ,直接使用:

git commit –amend –author=”Author Name email@address.com

如果你已经修改了 git config 中的用户名和邮箱,也可以使用

git commit –amend –reset-author –no-edit

如果要修改连续多个 commit

比如,你的 commit 历史为 A-B-C-D-E-F , F 为 HEAD , 你打算修改 C 和 D 的用户名或邮箱,你需要:

  1. 运行 git rebase -i B

    Example 如果你需要修改 A ,可以运行 git rebase -i –root

  2. 把 C 和 D 两个 commit 的那一行的 pick 改为 edit
  3. 当 rebase 开始后,将会暂停在 commit C
  4. 运行 git commit –amend –author=”Author Name email@address.com
  5. 然后运行 git rebase –continue
  6. 将会继续暂停在 commit D
  7. 再次运行 git commit –amend –author=”Author Name email@address.com
  8. git rebase –continue
  9. rebase 结束

如果需要更新到远程仓库, 使用 git push -f(请确保修改的commit 不会影响其他人)

参考文章

https://stackoverflow.com/questions/3042437/how-to-change-the-commit-author-for-a-single-commit/28845565#28845565

Git 迁移子模块,保持文件历史记录

git filter-branch –subdirectory-filter ./submodule – –all

Git filter-branch 重写历史

  我们知道了如何将A仓库全部迁移到B仓库(复制文件夹->包含.git->修改remote url->push)。 如果我们只需要将A仓库中的部分子目录文件迁移,就需要用到git重写历史的功能。git filter-branch 是git提供的重写历史的命令,我们可以用subdirectory-filter来实现重写git项目子路径的git历史记录。

–subdirectory-filter 重写子路径的git历史记录

   Only look at the history which touches the given subdirectory. The result will contain that directory (and only that) as its project root.

  subdirectory-filter可以从git项目中过滤出给定子目录的git历史记录,同时会把给定的子目录作为git项目的根目录。

Git 合并两个不相干的分支

Git 从 2.9.0 版本开始,预设行为不允许合并没有共同祖先的分支,需要加上 –allow-unrelated-histories 进行 pull 操作才不会出现此类错误信息。

这个预设行为是为了避免,人为误操作合并了两个不相干的分支,加参数–allow-unrelated-histories 你要自己确定你真的要合并这个两个没有共同祖先的分支。

demo示例

git pull origin master –allow-unrelated-histories

Git 更新所有分支脚本

git branch awk ‘BEGIN{print “echo **Update all local branch…@daimon”}{if($1==””){current=substr($0,3)};print a”git checkout “substr($0,3);print “git pull –all”;}END{print “git checkout “ current}’ sh

git统计代码行数

1、统计某人代码提交量

git log –author=”mengfanxiao” –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 }’ -

2、统计所有人代码提交量(指定统计提交文件类型)

git log –format=’%aN’ sort -u while read name; do echo -en “$name\t”; git log –author=”$name” –pretty=tformat: –numstat grep “(.html|.java|.xml|.properties|.css|.js|.txt)$” awk ‘{ add += $1; subs += $2; loc += $1 - $2 } END { printf “added lines: %s, removed lines: %s, total lines: %s\n”, add, subs, loc }’ -; done

3、统计某时间范围内的代码提交量

git log –author=mengfanxiao –since=2019-01-01 –until=2021-02-01 –format=’%aN’ sort -u while read name; do echo -en “$name\t”; git log –author=”$name” –pretty=tformat: –numstat grep “(.html|.java|.xml|.properties)$” awk ‘{ add += $1; subs += $2; loc += $1 - $2 } END { printf “added lines: %s, removed lines: %s, total lines: %s\n”, add, subs, loc }’ -; done

结果:added lines: 106243, removed lines: 14088, total lines: 92155

4、查看git提交前5名

git log –pretty=’%aN’ sort uniq -c sort -k1 -n -r head -n 5

5、贡献值统计

git log –pretty=’%aN’ sort -u wc -l

6、提交数统计

git log –oneline | wc -l 7、统计或修改的行数

git log –stat perl -ne ‘END { print $c } $c += $1 if /(\d+) insertions/’

分类:

更新时间:

留下评论