git用法总结

本文最后更新于:2021年11月1日 下午

为了防止代码越改越凉,一定要选择一款代码版本控制工具,目前用的人数最多的就是git了,我把使用过程中遇到的问题,和自己常用的命令在此总结一下。

写在前面

本身git的官方网站就有很详细的教程点击进入,而且还是中文的,所以我建议直接把官方的教程看一遍就可以了,如果是初学者的话,只需要认真的把前两章看完就完全够用了,第三章大概看一下,如果不理解以后慢慢消化。

git命令

配置文件解释

如果命令是git config说明是修改配置文件用的,后面如果加上了--global说明修改的是全局的配置文件,对所有的本地仓库生效,如果不加,则修改的是当前项目的config文件。

  • 全局配置文件默认在用户目录下,文件名是.gitconfig
  • 项目配置文件则在项目对应.git目录中

经常使用的命令

1
2
3
4
5
6
7
8
git init # 把当前目录变为git仓库
git status # 查看当前的状态
git add . # 添加目录下的所有文件到缓存
git add a.txt # 添加a.txt到缓存
git commit -m "first commit" # 进行一次提交,提交到本地仓库
git push -u username master # 将本地仓库提交到远程
git push -f orgin master # 将本地仓库强制提交到远端
git clone --recursive https://....git # 克隆带子仓库的项目

不是很常用的命令

1
2
3
4
5
6
7
8
9
10
11
12
git config core.ignorecase false # 设置git目录区分大小写
git config --global credential.helper store # 设置git记住密码
git config credential.helper 'cache --timeout=3600' # 设置自动保存密码过期时间
git diff # 比较为加入缓存区的文件和缓存区的区别
git diff --cached # 比较缓存区的文件和提交后的文件的区别
git log # 显示提交日志
git log --pretty=oneline # 用一行来显示提交日志
git log -2 -p # 显示最后两次提交 和详细信息
git pull --rebase origin master # 推送之前,进行合并 解决远程有文件 而本地没有时的报错
git rm -r --cached . # 清空本地缓存,然后再重新添加文件,就可以去除不必要的垃圾文件了
git branch new # 新开一个分支,
git checkout master # 跳到master这个分支;

提高git clone的速度

使用ssh地址

克隆项目的时候选择ssh的地址,https和ssh的速度差距超级大,优先推荐

添加代理

因为git clone项目的话,一般克隆的是GitHub上的项目,然而GitHub的服务器在国外,所以速度你懂的。

如果受不了这个速度的话,可以自己搭建或者找一个代理,然后用代理来克隆项目,这个时候速度就飞起了。

下面的代码只有代理能用的时候才可以使用,要不就无法上网了。如果不需要使用了,或者不小心输入错误了,可以打开全局配置文件,把里面的这几行代码删除即可。

注意看代理后的端口是啥,我这里是1080

1
2
git config --global http.https://github.com.proxy socks5://127.0.0.1:1080
git config --global https.https://github.com.proxy socks5://127.0.0.1:1080

一些问题

Git修改区分目录大小写

通过代码规范,修改了包名为全小写(修改了文件夹目录),但发现push后,git服务器的文件夹目录还是为大写
解决方法:
git默认是不区分大小写的,意思是你修改一个文件名/文件夹的时候,git status 是不会提示你有修改的
可以通过git config --get core.ignorecase查看默认配置
通过git config core.ignorecase false设置为区分大小写
然后git status就可以看到变动
然后push到远程服务器

Git 工具 - 打包

这些情况下 git bundle 就会很有用。 bundle 命令会将 git push 命令所传输的所有内容打包成一个二进制文件, 你可以将这个文件通过邮件或者U盘传给其他人,然后解压到其他的仓库中。

1
2
git bundle create repo.bundle HEAD main # 创建一个名字为repo.bundle的包
git clone repo.bundle repo # 通过repo.bundle创建repo项目

Git 笔记:将两个提交合并为一个

  1. 命令行输入:git rebase -i HEAD~2 (i的意思是:interactive,HEAD~2为在历史的前两个提交)

  2. 将第二行的pick改成s, 也就是squash(挤压合并),作用是:使用提交,将此提交与之前的提交合并。 然后保存文件退出vim。

  3. 提交你的代码,git commit -a, vim出现如下所以文件信息:注意看:第4行和第8行分别对应这你第一次和第二次的提交描述信息,这时你就要将这两条描述信息合并为一条。

  4. 将之前的两条提交描述信息,修改合并为一条,然后保存退出vim,如下所示:

  5. 保存退出后,push代码:git push origin master -f (注意:因为时rebase操作,所以要加-f, 强制push), 推送完成, 如下所以,完成将两个提交合并为一个。

https://blog.csdn.net/jerechen/article/details/89556281

给git瘦身

https://linux.cn/article-8556-1.html

push时报错

git提交本地代码到远程仓库之前没有pull导致push失败解决办法

git push错误failed to push some refs to的解决
当我们在github版本库中发现一个问题后,你在github上对它进行了在线的修改;或者你直接在github上的某个库中添加readme文件或者其他什么文件,但是没有对本地库进行同步。这个时候当你再次有commit想要从本地库提交到远程的github库中时就会出现push失败的问题。

如下图所示
我在github库中对某个文件进行了在线的编辑,并且没有同步到本地库,之后我在本地库添加了文件test.txt,并想提交到github,出现以下错误:error:failed to push some refs to。

解决方案
这个问题是因为远程库与本地库不一致造成的,那么我们把远程库同步到本地库就可以了。
使用指令
git pull --rebase origin master
这条指令的意思是把远程库中的更新合并到本地库中,–rebase的作用是取消掉本地库中刚刚的commit,并把他们接到更新后的版本库之中。
具体细节可以点击查看

清理垃圾

参考GitHub官网: https://help.github.com/articles/removing-sensitive-data-from-a-repository

例如, 我的jekyll博客代码库提交了大量mp3文件, 使用下面命令清除后代码库由233M缩小为1.3M, 提交到GitHub部署博客轻快飞速

清除垃圾文件(大量无用的mp3文件)

1
git filter-branch --force --index-filter 'git rm --cached --ignore-unmatch *.mp3' --prune-empty --tag-name-filter cat -- --all

提交到远程仓库(如GitHub, 我再次从git clone GitHub代码库会变小为1.3M)

1
git push origin --force --all

必须回收垃圾,本地仓库才变小

1
2
3
4
5
6
7
8
git for-each-ref --format='delete %(refname)' refs/original | git update-ref --stdin
git reflog expire --expire=now --all
git gc --prune=now

rm -rf .git/refs/original
git reflog expire --expire=now --all
git gc --prune=now
git gc --aggressive --prune=now

Git仓库下子模块仓库简单操作

新建一个仓库

1
2
3
4
5
6
//新建文件夹demo1
mkdir demo1
//进入将要创建的仓库
cd demo1
//初始化仓库
git init

添加子仓库

git submodule add url

把url替换成你想添加的子仓库;执行成功后,可以在demo1文件夹下看到.gitsubmodule文件

推送到远程仓库

在推送到远程仓库前,我们还要给本地仓库添加一个远程仓库地址,可以到git.oschina 或github上创建

1
2
3
4
5
6
7
8
//添加远程仓库地址
git remote add origin https://....git //origin 是该远程仓库在本地的别名,可自定义。
//添加所有文件到缓存
git add .
//提交到本地仓库
git commit -m "first commit"
//推送到远程仓库
git push origin master //master是分支名称`

子仓库的常用操作

克隆带子仓库的仓库

1
2
3
4
//回到demo1的上级目录
cd ..
//克隆仓库到demo2
git clone https://....git demo2 //demo2为指定的文件夹,也可以不指定。

克隆主仓库后,子仓库是没有代码的,所以继续

初始化子仓库

git submodule init

有子仓库的文件夹了,但是没有代码

克隆子仓库代码。

git submodule update

此时可以看到在下载子仓库代码了

参考笔记

很不错的一个笔记
https://www.jianshu.com/p/86c44bef4ea1