git命令总结

Git命令整理(持续更新)

本文记录常用的git命令,涵盖绝大部分日常开发场景,持续更新中…

设置用户名和邮箱

1
2
3
4
5
6
# 设置用户名和邮箱
git config --global user.name "用户名"
git config --global user.email "hello@itcast.cn"
# 查看配置信息
git config --global user.name
git config --global user.email

git提交日志

1
2
3
4
5
git log [option] # 查看提交到哪个地方
--all # 显示所有分支
--pretty=oneline #将提交信息显示为一行
--abbrev-commit # 让输出的commit更简短
--graph # 以图的形式显示

解决git乱码问题

1
git config --global core.quotepath false

/etc/bash.bashrc文件中加入下面代码

1
2
export LANG="zh_CN.UTF-8"
export LC_ALL="zh_CN.UTF-8"

仓库操作

初始化仓库

1
git init # 在需要创建仓库的文件夹下执行,初始化仓库

工作区、暂存区、仓库

1
2
3
4
5
6
7
8
9
git status               # 显示文件状态,untracked
git add <文件名> # 暂存文件,文件名.表示所有文件

## 以下三个命令的作用效果:"reset" = "restore --stage" + "restore"
git restore --staged <文件名> # 将暂存区文件从暂存区撤出,但不会更改文件
git restore <文件> # 将在工作空间但不在暂存区的文件撤销更改
git reset <文件名> # 将暂存的文件从暂存区撤出,同时恢复至上一次提交的状态

git rm --cached <文件名> # 将文件恢复至未跟踪的状态,"-r"参数表示递归

提交

1
2
git commit -m "提交信息"        # 文件提交到仓库
git commit --amend -m "提交信息" # 修改上一次的提交信息,注意不要对远程仓库使用

版本管理

1
2
3
4
git checkout "commitID" # 签出指定的提交,不改变已有的提交树。
git revert "commitID" # 撤销已有提交,会创建一个完全相反的提交
git reset --hard <commitID> # 回退版本,该版本往后的所有提交都会被标记为删除,可以使用reflog命令在找回来。
git reflog # 前面所有的操作记录下来,可以看到已经删除的提交记录

暂存文件stash

1
2
git stash save "暂存信息" # 将未提交的文件暂存起来,以便切换分支和之后恢复
git stash pop # 将上一次暂存修改恢复出来

决定哪些文件不需要git管理

1
2
3
4
touch .gitignore # 创建忽略文件,里面写上不需要管理的文件,可使用文件通配符
*.a # 忽略.a文件
!lib.a # 但是保留lib.a文件
build/ # 忽略build目录下的所有文件

分支

1
2
3
4
5
6
7
8
9
git branch -a                 # 查看分支,-a表示查看远程所有分支,其中红色表示当前所在分支
git branch -m "旧名字" "新名字" # 重命名分支
git branch "分支名" # 创建分支
git checkout "分支名" # 切换分支
git checkout -b "分支名" # 创建并直接切换到分支,等价于上面两个命令
git merge "分支名" # 将分支合并到当前所在的分支
git branch [option] "分支名" # 删除分支
-d # 把分支删除,会做各种检查
-D # 强制删除

开发中,一般有如下分支使用原则和流程:

  • master(生产)分支

    线上分支,主分支,中小规模项目作为线上运行的应用对应的分支,master才能上线。

  • develop(开发)分支

    从master创建的分支,作为开发部门的主要分支,开发完成后合并到master分支准备上线,develop一般不删除。

  • feature(新功能)分支

    从develop创建出来,feature功能完成后合并到develop上面去,然后把feature分支删除掉。要新建多个feature分支。

  • hotfix分支

    从master创建出来,修改正常后合并到master,并合并到develop上面去。

  • test分支用于代码测试,pre分支用于预上线分支。

合并分支

1
2
3
4
5
6
git checkout "分支名" # 首先切换到待合并的分支分支
# 1. 以变基的方式将当前分支合并到master分支上
git rebase master
# 2. 以merge的方式将分支合并到master分支上
git merge --ff-only master
git merge --abort # 终止合并操作

公私密钥对

1
2
ssh-keygen -t rsa # 生成公私钥对
ssh -T git@github.com # 测试连接gitee或github

远程仓库

添加远程仓库

1
2
3
git remote add origin <远程仓库地址> # 添加远程仓库
git remote set-url origin <远程仓库地址> # 修改远程仓库地址
git remote -v # 查看远程仓库,-v表示显示地址

推送远程仓库

1
2
3
4
5
git push origin master # 把当前的master分支推送到origin仓库
git push [-f] [--set-upstream] [远端名 [本地分支名]:[远端分支名]] # --set-upstream推送到远程仓库,名字一样可以省略,up-stream表示本地和远端关联,-f表示强制覆盖
git push # 如果本地和远端已经关联,则直接可以推送

git branch -vv # 查看本地分支和远端分支的关联关系

克隆、抓取和拉取

1
2
3
git clone <远程仓库地址> <本地文件夹名字> # 如果不设置文件夹,默认使用仓库中的文件夹
git fetch <远程仓库名> <远程仓库分支名> # 把远程更新抓取下来,但不会合并
git pull <远程仓库> <远程分支> # 远程更新拉去并合并,相当于git fetch 和git merge

git子模块

如果git仓库下有别的git仓库,就可以添加到子模块,子模块的改变需要在其仓库中提交后才会在主存储库中显示。

1
2
3
# 删除子模块的.gitmodules文件
# 删除主存储库的.git/config对应的子模块项目
git rm --cached <子模块路径> # 取消管理子模块

对比文件差异

1
2
3
git diff <分支1> <分支2> -- <文件名字> # 对比两个分支的文件差异
git diff -cached # 对比工作区和暂存区的文件差异
git diff commitID # 对比工作区与对应提交的文件差异

git代理

1
2
git config --global http.proxy  # 设置代理
git config --global --unset http.proxy # 取消代理

删除大文件

有时候仓库对大文件有存储容量限制,直接删除文件后还需要从历史记录中将其剔除,使用以下命令:

1
2
3
4
# 不推荐该命令,似乎会污染历史记录
git filter-branch --force --index-filter 'git rm -r --cached --ignore-unmatch <文件名或文件夹名>' --prune-empty --tag-name-filter cat -- --all
# 使用下面命令
git filter-repo --path <文件名或文件夹名> --invert-paths