Git操作合集

不删除仓库重置仓库

方法一

1
2
3
4
5
6
git checkout --orphan ddmichael_branch #检出master
git add -A #暂存全部文件
git commit -am commit message #提交刚刚暂存的所有文件
git branch -D master #删除主线
git branch -m master #将目前这个ddmichael_branch重命名为master主线
git push -f origin master #将更新后名称的主线强制推到remote repository里面

方法二

创建一个空白文件夹,然后将此文件夹初始化为git仓库,最后将此仓库内容强推至远端。

不跟踪权限修改

本地的git仓库在移动、复制之后,文件内容并没有修改,但是用户或者文件权限被修改了。

git默认会把这些修改认为文件已经修改了。

在仓库目录执行,可以不跟踪文件权限修改

1
git config --add core.filemode false

也可以直接在仓库的.git/config文件中添加

压缩仓库

git仓库压缩,主要是把已经从仓库删除的文件的历史提交记录也清理掉,减少.git目录大小。

省流版

1
2
3
4
5
6
7
8
# 查看历史大文件
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"
# 从历史中删除 target/ 这个文件夹
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch target/' --prune-empty --tag-name-filter cat -- --all
# 执行仓库压缩
git gc --prune=now
# 推送到远程仓库
git push origin --force --all

分析

历史记录

第一条命令用于显示历史记录过的所有文件,示例中的命令是用来显示历史中体积最大的 5 个文件

1
git rev-list --objects --all | grep "$(git verify-pack -v .git/objects/pack/*.idx | sort -k 3 -n | tail -5 | awk '{print$1}')"

显示文件列表

1
git rev-list --objects --all

后面是筛选与排序, 当你对项目的结构非常了解的时候, 你大可不用排序,直接跳过这一步

从历史中删除文件引用

这一步是核心步骤, 把文件/文件夹从历史中删除, 示例命令删除的是 target/ 目录, 如果读者想要删除其他文件/文件夹, 例如删除 readme.md 文件, 可以改写成

1
git filter-branch --force --index-filter 'git rm -r  --cached --ignore-unmatch readme.md' --prune-empty --tag-name-filter cat -- --all
  • 这个命令的主要核心是 git filter-branch , 次要核心是 git rm
  • git rm 的用法和 shell 脚本里的删除命令 rm 是一样的, -r 参数是因为删除的内容是文件夹才要加, 表示递归删除,如果你只是要删除文件, 那大可不加 -r
  • 如果你删除的文件夹是目前还在使用的, 那也会被删除, 我就不小心把我 src/main/webapp 文件夹删除了, 还好我有克隆到其他文件夹备份, 文件可以快速找回来

触发垃圾回收, 删除没有被引用的文件

这一个步骤是真正让仓库缩小的命令, 上一步只是删除了引用,是逻辑结构上的删除, 而这一步是删除文件, 从物理上减少了磁盘空间使用, 如果你了解一些虚拟机的话, 你肯定知道我在说什么

示例中使用的 --prune 参数是时间, 如果你想了解具体的参数规则, 可以去 git-scm.com 找找官方文档

1
git gc --prune=now

同步到远程仓库

执行完以上所有步骤后, 只是本地仓库瘦身了, 而远程仓库并没有, 所以需要推到远程仓库
核心命令是 git push

1
git push origin --force --all
  • 参数 origin 是远程仓库地址别名, 具体请参照 git remote 命令
  • 参数 --force 是强制推送, 这个参数表示强行覆盖远程仓库, 这个参数跟TNT炸药一样不能乱用, 它可以简写为 -f
  • 参数 --all 表示所有历史都要覆写, 当然我不知道这里的 “全部” 是多少, 教程里还提到了再提交一次 tags 的
1
git push origin --force --tags

这样可以把打了 tag 的提交也改变历史, 我没有尝试. 因为已经成功压缩仓库了

分支重命名

重命名git仓库分支

本地分支

本地仓库或者还没有推送的本地分支

1
git branch -m 原名 新名

远程分支

分支内容已经推送到了服务器中

重命名本地分支

1
git branch -m 原 新

删除远程分支

1
git push --delete origin 原

推送新本地分支

1
git push origin 新

本地分支关联远程分支

1
git branch --set-upstream-to origin/新

制作与应用补丁

生成

创建新分支

1
2
git branch test
git checkout test

修改文件,制作补丁

1
git commit -a -m "修改网站信息"

生成patch文件

1
git format-patch HEAD~1

这里的1表示最近的1次提交

应用

确认位置与分支是否正确

1
git branch -a

应用patch

1
git am name.patch

查看结果

1
git log

Git操作合集
https://blog.jackeylea.com/linux/how-to-use-git/
作者
JackeyLea
发布于
2023年3月6日
许可协议