[TOC]

GIT特殊功能使用介绍

1. git log 相关

1.1 查看一个文件的修改历史记录:git log -p filename

-p作用:可以显示每次提交的diff,不加-p值查看

git log -p doc/git/004-git常用功能使用介绍.md

commit 65f8493043498c8f9ad6349129e53a2d81ba3ebe
Author: user <user@outlook.com>
Date:   2021-06-23 17:12:36

    git常用功能使用介绍 文档修改

diff --git a/doc/git/004-git常用功能使用介绍.md b/doc/git/004-git常用功能使用介绍.md
index 0ca6418..947d869 100644
--- a/doc/git/004-git常用功能使用介绍.md
+++ b/doc/git/004-git常用功能使用介绍.md
@@ -174,6 +174,8 @@ git fetch -a && git checkout $branch && git pull

 `$branch`是Jenkins里面的分支名字变量。

+也可以修改Jenkins配置,在构建环境选项下面,把`Delete workspace before build starts`选线勾选上(在构建前删除工作空间)。然后部署即可,构建成功后在修改配置,把这个选项取消。

1.1.1 查看一个文件的所有改动历史记录:git log --pretty=oneline 文件名

~ git log --pretty=oneline package.json

60e56ca779e269a4c16a0bb2bb57d845c551f725 添加echarts包
20f437c268646797ce7680c1117eb0c8db23f3b0 添加base-64的包
76087b874926b6b62bd8455309c681bd0c8bc2f7 删除无用的lib
a8f7f419b2cb6e279f92a5660141fd32bbd963b3 自动计算高度
...

1.1.2 查看文件的某次提交的改动记录:git show 提交的hash值 文件名

~ git show 60e56ca779e26 package.json

commit 60e56ca779e269a4c16a0bb2bb57d845c551f725
Author: user <user@outlook.com>
Date:   Mon May 17 16:28:54 2021 +0800

    添加echarts、echarts-gl包

diff --git a/package.json b/package.json
index 8118086..08306c8 100644
@@ -15,6 +15,8 @@
     "base-64": "^1.0.0",
+    "echarts": "^5.0.0",
     "js-cookie": "^2.2.1",

1.2 查看开发者提交记录:git log --author=jack

1、这里的名字是git配置信息里面的名字,可使用git config --list命令查看配置信息,里面的user.name就是用户名。
2、名字可以不加冒号,如果名字中间有空格需要加冒号:git log --author=jackgit log --author="jack"一样

~ git log --author=jack

commit 12aa...144b9f37c092 (HEAD -> master, origin/master, origin/HEAD)
Author: jack <jack@outlook.com>
Date:   2023-05-24 17:09:08

    Mac系统操作习惯设置 文档编辑:添加mac操作系统升级说明

3、显示每次提交修改的代码:git log -p --author="jack"

4、查看一段时间的提交:

git log --author="jack" --since="2023-01-01" --until="2030-04-01"

5、只显示一行信息:

git log --author="jack" --oneline

6、统计提交了多少次:

git log --author="jack" --oneline | wc -l

1.3 统计代码行数

注意:下面的命令都是统计当前分支的,如果要统计所有分支,需要加--all参数,比如:

git log --all --since=2018-01-01 --until=2018-12-31

1.3.1 按提交时间段来统计

git log --since=2018-01-01 --until=2018-12-31 --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 }'

added lines: 36874, removed lines: 12214, total lines: 24660

上面的git命令按照2018-01-012018-12-31这段时间来统计你的代码提交量

1.3.2 按用户名来统计

此方法可以统计项目中,该用户的工作量

git log --author="username" --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 }'

added lines: 29146, removed lines: 7457, total lines: 21689

注意把username改成真正的用户名。

1.3.3 按用户名和时间段来统计

此方法过滤一段时间内,某个用户的代码量

git log --author="username" --since=2018-10-01 --until=2018-12-31 --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 }'

added lines: 2068, removed lines: 953, total lines: 1115

注意把username改成真正的用户名。

1.3.4 统计自己一天代码行数

git log --author="$(git config --get user.name)" --no-merges --since=1am --stat
git log --author="$(git config --get user.name)" --no-merges --since=1am --stat --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 }'

1.3.5 其他的统计方法

查看仓库提交者排名前 5

git log --pretty='%aN' | sort | uniq -c | sort -k1 -n -r | head -n 5

贡献值统计

git log --pretty='%aN' | sort -u | wc -l

提交数统计

git log --oneline | wc -l

添加或修改的代码行数:

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

1.3.6 使用find命令统计JS、css代码量

js统计命令:find src/ -name "*.js*" |xargs cat|grep -v ^$|wc -l
css统计命令: find src/ -name "*.scss*" |xargs cat|grep -v ^$|wc -l

1.4 统计提交次数

统计2024年1月1日至今当前分支的提交次数:

git log --since="2024-01-01" --author="作者名字" --pretty=oneline | wc -l

统计2024年1月1日至今所有分支的提交次数:

git log --all --since="2024-01-01" --author="作者名字" --pretty=oneline | wc -l

统计2023-01-01至2024-01-01当前分支的提交次数:

git log --since="2023-01-01" --until="2024-01-01" --author="作者名字" --pretty=oneline | wc -l

统计2023-01-01至2024-01-01所有分支的提交次数:

git log --since="2023-01-01" --until="2024-01-01" --author="作者名字" --pretty=oneline | wc -l

图片里面的仓库就一个分支,所以查看当前分支和查看所有分支是一样的。

2. 合并多个commit

这个合并操作是在本地仓库,如果提交记录已经提交到远程仓库中了,如果别人还没有拉取,那么可以使用强制推送覆盖掉远程仓库的提交git push origin -f

1、如下图,有三个commit需要合并:

复制第四个commit的hash值后,使用git rebase -i 568361540e8c命令开始合并:

~ git rebase -i 568361540e8c

2、执行命令后,终端会进入一个VI编辑界面,如下图:

在VI编辑界面里面,上方未注释的部分是填写要执行的指令,而下方注释的部分则是指令的提示说明。指令部分中由前方的命令名称、commit hash 和 commit message 组成。

目前需要用的指令有两个pick 和 quash,指令的意思:

pick:使用这个提交commit
reword:使用这个提交commit,并且编辑这个提交信息;
edit:选中,rebase时会暂停,允许你修改这个commit
squash:选中,会将当前commit与上一个commit合并
fixup:与squash相同,但不会保存当前commit的提交信息
exec:执行其他shell命令

在VI编辑里面,按I按键,进入编辑模式,把第一行指令改成pick,第二行执行改成改成 squash 或 s 后,按esc键后,退出编辑模式,然后按:wq保存并退出,然后会进入到编辑commit界面:

其中, 非注释部分就是两次的 commit message, 进入编辑模式后,编辑提交信息,退出编辑模式,然后按:wq保存并退出。再次输入git log查看 commit 历史信息,你会发现这两个 commit 已经合并了。

3、注意事项:如果这个过程中有操作错误,可以使用 git rebase --abort来撤销修改,回到没有开始操作合并之前的状态。

3. 修改最后一次commit注释

其commit提供了一个--amend参数,可以修改最后一次提交的信息:

git commit --amend

这个命令会将暂存区中的文件提交。 如果自上次提交以来你还未做任何修改(例如,在上次提交后马上执行了此命令), 那么快照会保持不变,而你所修改的只是提交信息。

git commit --amend 详细教程

4. 代码回退到以前版本

当修改的代码发现有问题,需要回退到以前的版本。代码回退分一下几种情况。

4.1 仅在本地有commit信息:git reset --hard 9e53f3

当commit只在本地,没有推送到仓库中。则可进行如下操作:

1、保证git工作区域是干净的,如果有改动,可以暂存代码:

~ git diff > tmp.patch # 代码改动存放到一个文件中
~ git checkout . # 取消所有改动
# 代码回退后可使用如下命令来 恢复改动
~ git apply tmp.patch # 把改动还原回来

2、代码回退到特定的commit:

~ git reset --hard 9e53f30b7ab56e

HEAD is now at 9e53f30 开始页面:添加提交按钮。

此时所有历史commit记录可使用git reflog来查找:

~ git reflog

26c5d5a (HEAD -> test, origin/test) HEAD@{0}: reset: moving to 26c5d5a
9e53f30 HEAD@{1}: reset: moving to 9e53f30b7ab56e
26c5d5a (HEAD -> test, origin/test) HEAD@{2}: commit: 添加测试包
9e53f30 HEAD@{3}: commit: 提交信息

如果回退错了,可使用上面命令找到commit的hash值,然后使用git reset --hard 9e53f30把之前的操作还原回来。

4.2 代码已经推送到仓库

4.2.1 强制更新仓库:git push -f,适用于影响小的

此方法适用于以下情况:

1、仅仅只是仓库更新代码了,仓库代码还没有被其他地方更新。
2、其他开发人员拉取代码了,但是没有修改代码。
3、自动部署拉取代码了,但是支持清理拉取的分支,或者支持清理操作空间。

1、本地代码使用4.1中的方式回退,然后强制推送到仓库中:

# 本地仓库回退到指定位置
~ git reset --hard 9e53f30b7
HEAD is now at 9e53f30 开始页面:添加提交按钮。

# 强制推送到服务器仓库中
~ git push -f

注意,如果推送的分支是保护分支(gitlab仓库有保护分支设置),那么只有这个仓库的Maintainer角色权限才能强推代码,或暂时把保护分支关闭才能正确推送代码。

2、其他开发人员拉取代码了,但是没有修改代码:使用git pull origin -f强制拉取服务器代码,覆盖掉本地代码。或者删除本地分支从新拉取这个分支代码。

3、部署工具支持清理代码:
以Jenkins自动部署工具为例,在Jenkins配置里面的代码打包脚本里面添加如下命令(需要权限才能看到Jenkins配置项):

# 删除问题分支,然后从新拉取分支, $branch Jenkins里面的 分支名 变量
git checkout master && git branch -d $branch
git fetch -a && git checkout $branch && git pull

也可以修改Jenkins配置,在构建环境选项下面,把Delete workspace before build starts选线勾选上(在构建前删除工作空间)。然后部署即可,构建成功后在修改配置,把这个选项取消。

4.2.2 git revert 创建留下记录的回退

由于代码已经在其他地方有了修改并提交了,或者一些环境不能破坏性的退回(git reset)。

此时可以使用git revert命令回退代码。具体参考git revert 命令介绍

5. git revert 创建留下记录的回退

当代码提交后,发现有问题,需要回退代码。但是代码已经扩散被其他成员拉取并修改了,则可以使用 revert 命令退回某个以提交的代码。

revert命令回退指定的commit提交。revert命令会产生一个新的commit信息,就像做了一次修改一样。使得其他环境可以正常的拉取回退代码,而不会导致冲突。

1、使用git log命令找到要回退 commit 的hash值。

2、使用 git revert 命令执行回退操作:

~ git revert d1e81adc50f2

上面的命令在终端执行后,会跳转到VI编辑commit提交信息中,写好回退说明后,保存退出VI编辑。终端使用git log命令就会看到这次回退记录:

commit 3806cbee824f86bde4101739b8179211a674e640 (HEAD -> master)
    Revert "2.txt文件添加"
    This reverts commit d1e81adc50f2a965e17b524fd93ac222032817d4.
....其他记录略。。。。

3、git revert命令还可以一起连续回退几个连续的commit:

~ git revert d1e81adc5^..254524b4  # 注意^和..符号,重要

[master ffe7792] Revert "3.txt文件添加"
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 3.txt
[master 993a1ac] Revert "2.txt文件添加"
 1 file changed, 0 insertions(+), 0 deletions(-)
 delete mode 100644 2.txt

注意:旧的commit在前面,新的commit在后面,中间用..连接,在第一个commit后面放一个^表示这个commit也取消,如果没有^表示当前commit不取消。

在执行命令后,会连续进入几个VI编辑commit信息中,取消几个commit,就会添加几次新commit,其实这个连续revert命令跟一个一个的取消是一样的,

其他参考资料:https://blog.csdn.net/yxlshk/article/details/79944535

6. revert后取消revert

1、找到revert的commit的hash值

2、使用git revert hash的方式来取消回退

7.查看两个分支某个文件的差异

1、查看两个分支某个文件的差异:

git diff branchOne branchTwo src/pages/index.js

1、查看两个分支详细差异:

git diff branchOne branchTwo

2、查看两个分支简单的diff结果,只查看修改的文件名、修改了多少内容

git diff branchOne branchTwo --stat

8. 两个仓库间代码同步

有2个仓库A、B, 先拉取A仓库代码,代码修改后,提交。

1、在A仓库中,添加B仓库地址:

git remote add upstream 
https://oauth2:H6misJwA@gitlab.xp.aaa.com/data-center/awakens-frontend.git

2、使用 git fetch 命令从 A 仓库中拉取代码到 B 仓库的本地仓库中,但是你应该指定远程仓库的名称(即 upstream),而不是直接使用 URL。

git fetch upstream

3、使用 git merge 命令将从 A 仓库拉取的代码合并到 B 仓库的当前分支。你需要指定要合并的分支,即 upstream/master

git merge upstream/master
# --allow-unrelated-histories 选项来允许合并不相关的历史。
git merge upstream/master --allow-unrelated-histories

注意在合并的时候可能会出现冲突和合并记录,按照要求解决即可,然后提交代码。

4、合并代码后,可以推送到A仓库中:

git push 
# 或者
git push origin

9. 将提交转移到其他分支:git cherry-pick

对于多分支开发,将代码开发转移到另外一个分支是非常常见的操作。这时分两种情况:1、将一个分支所有变动都转移,那么就可以用git merge命令合并分支。2、只需要部分代码变动(某几个提交),比如修复的bug修改,这个时候则可以采用 cherry-pick 命令。操作如下:

1、找到需要的commit的hash值:

# 查看自己开发的提交信息
git log --author="Developer Name"
# 一行显示自己开发的提交信息
git log --author="Developer Name" --oneline

2、开始cherry-pick代码,如果这个过程遇到代码冲突,跟合并冲突显示一样,需要手动解决:

# 1、执行命令
git cherry-pick fd0c11547

# 如果遇到冲突
# 2、解决冲突后,添加冲突问题件
git add file.js
# 3、继续执行cherry-pick
git cherry-pick --continue
# 4、中断执行 cherry-pick
git cherry-pick --abort

3、cherry-pick结束后,推送代码。

参考链接:

https://blog.csdn.net/weixin_44799217/article/details/128279250

https://www.ruanyifeng.com/blog/2020/04/git-cherry-pick.html

10. 查看项目占用磁盘大小

使用git命令查看:

git ls-files | xargs cat | wc -c # 单位字节

其他方式查看

1、github项目,在浏览器中输入地址:

https://api.github.com/repos/organization/repository

其中organization替换为项目的所有者(组织),repository替换为项目的名称。返回的页面是描述这个项目的JSON数据,其中的size指的就是项目的大小,单位为kB(千字节)。结果见上图

2、新克隆一个项目,项目下载后,进入项目文件夹,把查看隐藏文件功能打开,删除.git文件夹,然后查看这个项目文件夹大小,就可以知道整个项目大小。

3、对于仓库在码云中,浏览器打开仓库,选择 统计 -> 仓库数据统计 ,在页面中有一个 仓库大小 显示列,就是这个仓库在码云中的存储大小。注意:由于码云仓库有存储库 GC 功能(位置:管理 -> 存储库 GC),导致仓库存储会慢慢变大,这个大小会加到 仓库大小 里面,导致显示的大小会比真实的项目大,所以需要先来清理一下 存储库 GC,然后再去看仓库大小.

11. git count-objects:已解压对象文件的数量及其占用的磁盘空间

计算已解压对象文件的数量及其占用的磁盘空间,帮助你决定何时是重新打包的好时机

git count-objects -v 命令 提供更详细的报告,输出结果:

git count-objects -v
count: 2918          # 松散物体的数量
size: 60032          # 松散对象占用的磁盘空间,单位为 KiB(除非指定 -H)
in-pack: 1799        # 包内对象的数量
packs: 4             
size-pack: 12264     # 数据包占用的磁盘空间,单位 KiB(除非指定 -H)
prune-packable: 4    # 在数据包中也存在的松散对象的数量。可以使用 `git prune-packed`对这些对象进行剪枝。
garbage: 0           # 对象数据库中既不是有效松散对象也不是有效包的文件数
size-garbage: 0      # 垃圾文件占用的磁盘空间,单位 KiB(除非指定 -H)

git count-objects -H 命令以人类可读的格式打印对象大小,输出结果:

~ git count-objects -H # 以人类可读的格式打印对象大小
1 objects, 4.00 KiB

这个命令本人是用来清理git空间内容发现的一个命令

参考资料:https://git-scm.com/docs/git-count-objects/zh_HANS-CN

12. git gc:清理git存储库

整理、转载自:https://www.atlassian.com/zh/git/tutorials/git-gc

git gc 命令是一个存储库维护命令,"gc" 代表垃圾回收。执行 git gc 实际上是让 Git 清理它在当前存储库中造成的混乱。垃圾回收是一个源自解释型编程语言的概念,这些语言会进行动态内存分配。解释型语言中的垃圾回收用于恢复正在执行的程序无法访问的内存。

Git 存储库会积累各种类型的垃圾。有一类 Git 垃圾是孤立提交或不可访问的提交。执行 git resetsgit rebase 等修改历史记录的命令时,Git 提交可能会变得不可访问。为了保留历史记录和避免数据丢失,Git 不会删除分离的提交。分离的提交仍然可以通过 git log 签出、精心挑选和检查。

除了清理游离的提交外,git gc 还将对存储的 Git 对象执行压缩,从而释放宝贵的磁盘空间。当 Git 识别出一组相似的对象时,它会将它们压缩成一个‘包’。包就像 Git 对象的 zip 文件一样,存在于存储库的 ./git/objects/pack 目录中。

git gc 与 git prune:git gc 是一个父命令,git prune 是一个子命令。git gc 将在内部触发 git prunegit prune 用于移除 git gc 配置认为无法访问的 Git 对象。

git gc 可以使用 --agtressive 命令行选项调用。--aggressive 选项会导致 git gc 在优化工作上花费更多时间。这会导致 git gc 运行速度变慢,但在完成后会节省更多磁盘空间。--aggressive 的效果是持久的,只有在对存储库进行大量变更后才需要运行。

使用例子:

git gc --aggressive
Enumerating objects: 4070, done.
Counting objects: 100% (4070/4070), done.
Delta compression using up to 8 threads
Compressing objects: 100% (4025/4025), done.
Writing objects: 100% (4070/4070), done.
Total 4070 (delta 2607), reused 401 (delta 0), pack-reused 0

执行效果可以通过git count-objects -v命令来查看效果,在执行git gc前,count-objects命令count: 2918、size: 60032(见上一节里面的图片),执行git gc后,变成了count: 1、size: 4

13. 在错误分支开发了代码处理方法

开发代码发现分支不对,需要把当前分支代码移到正确的分支,并且把当前分支代码回退到未修改前的状态。

13.1 代码还没有commit

1、使用git diff > tmp.patch 形式

# 1、保存修改到 tmp.patch 文件中
git diff > tmp.patch
# 2、取消所有修改
git checkout .
# 3、切换到正确的分支
git checkout branch_name
# 4、把修改的代码添加上
git apply tmp.patch
# 5、删除临时文件
rm tmp.patch

2、使用 stash 命令:

# 1、把当前修改的内容暂存起来,然后我们的工作区就恢复到在没有开发新功能之前的样子。
git stash
# 2、切换到正确的分支
git checkout branch_name
# 3、把之前暂存的内容,应用到当前分支。
git stash apply

13.2 代码已经commit,但是还没有推送到仓库

1、提交的代码移到正确分支中,有以下两种命令可以实现:
1.1 使用 git cherry-pick,这个命令会把commit移到其他分支,详情参考这个文档里面 的命令介绍。
1.2 使用git merge 分支合并命令把代码合并到正确分支中。注意:只有在确认了两个分支的差别只有新提交的commit才可以使用这个命令。

2、当前分支代码回退到未修改前:

git reset --hard 9e53f30b7ab56e

# 所有历史commit记录可使用git reflog来查找,回退错了可以使用这个命令来找到commit 从新回退
git reflog

13.3 代码已经commit,并且已经推送到仓库中

1、提交的代码移到正确的分支中,参考 13.2中的方法。

2、当前分支代码回退到未修改前:参考4.2中的方法。

powered by Gitbook文件最后修改时间: 2025-01-03 15:56:50

results matching ""

    No results matching ""