前言:本文是作者学习git的笔记。在一番周转之后,推荐学习路径:

  1. 了解基础概念:
    Git 教程 - 菜鸟教程
  2. 练习分支操作:
    Git 分支小游戏
  3. 工作流管理:
    Gitflow工作流
  4. 约定式提交:
    约定式提交

1. 学习资料

2. Git基础

2.1 查看文档

  • 查看命令帮助
    • git <command> --help
    • git help <command>
    • man git-<command>

2.2 安装配置

  • 配置文件位置
    • 局部:.git/config
    • 全局:~/.gitconfig
    • 系统:/etc/gitconfig
  • git config:
    • git config --global user.name "your name":设置用户名
    • git config --global user.email "your email":设置邮箱
    • git config --global --edit:编辑全局配置文件
    • git config --global --unset alias.co:删除全局别名
    • git config --global alias.co checkout:设置全局别名
    • git config --list:查看所有配置信息
    • git config --global --edit:编辑全局配置文件
    • git config --global --unset alias.co:删除全局别名
    • git config --global alias.co checkout:设置全局别名
    • git config --list:查看所有配置信息

2.3 工作区、暂存区和版本库

  • git status:查看当前状态
    • git status -s:简化输出
  • git add:工作区 → 暂存区
    • git add . :添加所有文件到暂存区
    • git add -u:添加所有已修改文件到暂存区
  • git commit:暂存区 → 版本库
    • git commit -m "commit message":提交暂存区到版本库
    • git commit -a -m "commit message":提交所有已修改文件到版本库
    • git commit --amend -m "commit message":修改上次提交
  • git restore:恢复文件
    • git restore <file>:恢复暂存区文件,工作区受影响

      git restore ./source/_posts/git使用.md:我在进行代码编辑时,将一部分工作提交到缓存区,然后做了一些修改,这时我想撤销这部分工作,这时就可以使用git restore命令。

    • git restore --staged <file>:恢复暂存区文件,工作区不受影响
    • git restore --staged <file>:恢复暂存区文件,工作区不受影响
    • git restore --source <commit-id> <file>:恢复指定提交版本文件,工作区受影响

      git restore --source=HEAD~1 ./source/_posts/git使用.md:将上一次提交的git使用.md文件恢复到工作区。

  • git reset:版本库 → 暂存区
    • git reset HEAD <file>:取消暂存区文件
    • git reset --soft HEAD^:取消上一次提交,不影响工作区
    • git reset --hard HEAD^:撤销上一次提交,影响工作区
    • git reset --hard <commit-id>:回退到指定提交
  • git clean:清理工作区
    • git clean -f:强制删除未跟踪文件
    • git clean -df:强制删除未跟踪目录,会删除空目录
    • git clean -df:强制删除未跟踪目录,会删除空目录
    • git clean -d -f:强制删除未跟踪目录及子目录
  • git diff:显示当前工作区与暂存区的差异

    git d ./*/*/git使用.md:加了别名以后使用

    • git diff HEAD:显示工作区和版本库差异
    • git diff <commit-id> <commit-id>:显示两个提交间差异
    • git diff <file-path>:显示文件差异
    • git diff --name--only:只显示暂存区和工作区差异文件名
    • git diff --stat:显示文件级别简要统计信息

2.4 分支操作

  • git branch:分支管理
    • git branch -v:查看所有分支,并显示最后一次提交信息
    • git branch -r:查看远程分支
    • git branch -a:查看所有分支(包括本地和远程)
    • git branch --merged:查看已合并分支
    • git branch --contains <commit-id>:查看包含指定提交的分支
    • git branch -d <branch-name>:删除分支
    • git branch -f <branch-name> <commit-id>:强制移动分支指针

      git branch -f master HEAD:找回master分支

    • git branch -m <old-name> <new-name>:重命名分支
    • git branch --set-upstream-to=<remote>/<branch>:设置跟踪分支
    • git branch --unset-upstream:取消跟踪分支
    • git branch --track <branch-name> <remote>/<branch>:创建远程分支并跟踪
  • git switch:切换分支
    • git switch -c:创建并切换分支
    • git switch --detach|-d <commit-id>:分离头指针,工作区不受影响
  • git merge:合并分支
    • git merge <branch-name>:合并指定分支到当前分支
    • git merge --no-ff <branch-name>:禁用Fast-Forward合并,保留分支历史
    • git merge --abort:取消合并
    • git cherry-pick <commit-id>:选择性合并提交
  • git rebase:变基操作
    • git rebase -i <commit-id>:交互式变基

      pick:保留该提交(默认)
      squash:将当前提交与前一个提交合并,但保留两个提交的日志信息(需要手动合并日志)
      fixup:类似于 squash,但会自动丢弃当前提交的日志信息,只保留前一个提交的日志
      drop:删除该提交

    • git rebase --onto <new-base> <branch-name>:变基指定分支到新基
  • git tag:标签管理
    • git tag -a <tag-name> -m "tag message":创建标签
    • git tag -d <tag-name>:删除标签
    • git tag -l "v1.0.*":列出所有v1.0版本标签
    • git tag -a <tag-name> -m "tag message":创建标签
    • git tag -d <tag-name>:删除标签
    • git tag -l "v1.0.*":列出所有v1.0版本标签

2.5 远端操作

  • git remote:远端管理
    • git remote -v:查看所有远程仓库
    • git remote add <name> <url>:添加远程仓库
    • git remote remove <name>:删除远程仓库
    • git remote rename <old-name> <new-name>:重命名远程仓库
    • git remote show <name>:显示远程仓库信息
    • git remote update:更新远程仓库信息
    • git remote -v:查看所有远程仓库
    • git remote add <name> <url>:添加远程仓库
    • git remote remove <name>:删除远程仓库
    • git remote rename <old-name> <new-name>:重命名远程仓库
    • git remote show <name>:显示远程仓库信息
    • git remote update:更新远程仓库信息
  • git clone:克隆远端仓库
    • git clone -b <branch-name> <url>:克隆指定分支
    • git clone --recurse <url>:克隆含子模块仓库
  • git fetch:收取远端变化
    • git fetch <name>:拉取远程仓库变化
    • git fetch <name> <branch-name>:拉取指定分支变化
    • git fetch --all:拉取所有远程仓库变化
  • git push:推送本地变化到远端
    • git push <name> <branch-name>:推送指定分支到远程仓库
    • git push <name> --all:推送所有分支到远程仓库
    • git push <name> --tags:推送所有标签到远程仓库
    • git push -u <name> <branch-name>:推送指定分支到远程仓库并设置默认分支
    • git fetch <name>:拉取远程仓库变化
    • git fetch <name> <branch-name>:拉取指定分支变化
    • git fetch --all:拉取所有远程仓库变化
  • git push:推送本地变化到远端
    • git push <name> <branch-name>:推送指定分支到远程仓库
    • git push <name> --all:推送所有分支到远程仓库
    • git push <name> --tags:推送所有标签到远程仓库
    • git push -u <name> <branch-name>:推送指定分支到远程仓库并设置默认分支
  • git pullgit fetch + git merge(或git rebase
    • git pull <name> <branch-name>:拉取指定分支并合并到当前分支
    • git pull --rebase <name> <branch-name>:拉取指定分支并变基到当前分支
    • git pull --all:拉取所有分支并合并到当前分支
    • git pull --rebase --all:拉取所有分支并变基到当前分支
  • git stash:暂存区操作
    • git stash list:查看暂存区列表
    • git stash pop:恢复暂存区文件
    • git stash apply <stash-id>:恢复指定暂存区文件
    • git stash drop <stash-id>:删除指定暂存区文件
    • git stash clear:清空暂存区
  • git submodule:子模块管理
    • git submodule add <url> <path>:添加子模块
    • git submodule init:初始化子模块
    • git submodule update:更新子模块
    • git submodule foreach git <command>:在子模块中执行命令
    • git submodule status:查看子模块状态
    • git submodule add <url> <path>:添加子模块
    • git submodule init:初始化子模块
    • git submodule update:更新子模块
    • git submodule foreach git <command>:在子模块中执行命令
    • git submodule status:查看子模块状态

2.6 其他命令

  • git log:展示历史,可与git grep配合使用
    • git log -p -2 显示每次提交所引入的差异,最近两次提交
    • git log --oneline
    • git log -S function_name
    • git log --since=2024-8-4
    • git log --since="2.weeks":查看最近两周提交记录
    • git log --until="2021-01-01":查看2021年1月1日之前提交记录
    • git log --graph:查看所有提交记录,图形化显示
    • git log --decorate:查看所有提交记录,显示分支信息
    • git log --all:查看所有分支提交记录
    • git log --grep="keyword":查看包含指定关键字的提交记录
    • git log --pretty=format:"%h - %an, %ar : %s":自定义日志格式
    • git log --stat:查看提交统计信息
    • git log --patch:查看每个提交的具体修改内容
  • git show:显示提交内容
    • git show <commit-id>:显示指定提交内容
    • git show HEAD:显示最新提交内容
    • git show --name-only <commit-id>:显示指定提交修改的文件名
    • git show --name-status <commit-id>:显示指定提交修改的文件名和状态
    • git show --stat <commit-id>:显示指定提交统计信息
    • git show --patch <commit-id>:显示指定提交具体修改内容
    • git show <commit-id>:显示指定提交内容
    • git show HEAD:显示最新提交内容
    • git show --name-only <commit-id>:显示指定提交修改的文件名
    • git show --name-status <commit-id>:显示指定提交修改的文件名和状态
    • git show --stat <commit-id>:显示指定提交统计信息
    • git show --patch <commit-id>:显示指定提交具体修改内容
  • git blame:查看贡献者
    • git blame <file>:查看指定文件每行最后一次修改的提交记录
    • git blame -L <start>,<end> <file>:查看指定文件指定行范围的最后一次修改的提交记录
    • git blame -C <file>:查看指定文件每行最后一次修改的提交记录,并显示代码上下文
  • git grep:搜索提交内容
    • git grep -n "keyword":搜索所有提交内容,并显示行号
    • git grep -e "keyword1" -e "keyword2":搜索多个关键字
    • git grep -i "keyword":搜索不区分大小写
    • git grep -w "keyword":只搜索全词匹配
    • git grep -l "keyword":只搜索文件名
    • git grep -c "keyword":只搜索提交次数
    • git grep -B <num> "keyword":显示指定行之前的内容
    • git grep -A <num> "keyword":显示指定行之后的内容
    • git grep -C <num> "keyword":显示指定行之前和之后的内容
    • git grep --all-files "keyword":搜索所有文件
    • git grep --ignore-case "keyword":搜索不区分大小写
    • git grep --max-depth <depth>:搜索指定目录深度
    • git grep --diff-filter=<filter>:搜索指定文件状态的提交
    • git grep --break-at-eol:在匹配到关键字时,显示完整行
    • git grep --extended-regexp:支持正则表达式
    • git grep --text:搜索二进制文件内容
    • git grep --line-number:显示匹配行号
    • git grep --null:显示匹配行号,以0结尾
    • git grep --pickaxe-regex:支持正则表达式搜索
    • git blame <file>:查看指定文件每行最后一次修改的提交记录
    • git blame -L <start>,<end> <file>:查看指定文件指定行范围的最后一次修改的提交记录
    • git blame -C <file>:查看指定文件每行最后一次修改的提交记录,并显示代码上下文
  • git grep:搜索提交内容
    • git grep -n "keyword":搜索所有提交内容,并显示行号
    • git grep -e "keyword1" -e "keyword2":搜索多个关键字
    • git grep -i "keyword":搜索不区分大小写
    • git grep -w "keyword":只搜索全词匹配
    • git grep -l "keyword":只搜索文件名
    • git grep -c "keyword":只搜索提交次数
    • git grep -B <num> "keyword":显示指定行之前的内容
    • git grep -A <num> "keyword":显示指定行之后的内容
    • git grep -C <num> "keyword":显示指定行之前和之后的内容
    • git grep --all-files "keyword":搜索所有文件
    • git grep --ignore-case "keyword":搜索不区分大小写
    • git grep --max-depth <depth>:搜索指定目录深度
    • git grep --diff-filter=<filter>:搜索指定文件状态的提交
    • git grep --break-at-eol:在匹配到关键字时,显示完整行
    • git grep --extended-regexp:支持正则表达式
    • git grep --text:搜索二进制文件内容
    • git grep --line-number:显示匹配行号
    • git grep --null:显示匹配行号,以0结尾
    • git grep --pickaxe-regex:支持正则表达式搜索
  • git shortlog:统计贡献
    • git shortlog -sne:统计提交者、邮箱、贡献数量
  • git archive:创建归档文件
    • git archive --format=tar.gz --output=project.tar.gz <commit-id>:创建指定提交的.tar.gz文件
    • git archive --format=zip --output=project.zip <commit-id>:创建指定提交的.zip文件
    • git shortlog -sne:统计提交者、邮箱、贡献数量
  • git archive:创建归档文件
    • git archive --format=tar.gz --output=project.tar.gz <commit-id>:创建指定提交的.tar.gz文件
    • git archive --format=zip --output=project.zip <commit-id>:创建指定提交的.zip文件
  • git bisect:在版本树上二分查找定位bug
  • git gc/prune/fsck:系统检查和垃圾清理

2.7 Git 别名

  • 配置别名:使用git config --global alias.<alias-name> "<command>"

  • 示例

    lg st ll last cm rv ddv gl se

    1. git config --global alias.lg "log --color --graph --pretty=format:'%Cred%h%Creset -%C(yellow)%d%Creset %s %Cgreen(%cr) %C(bold blue)<%an>%Creset' --abbrev-commit":查看分支历史,并以颜色、图形化、自定义格式显示
    2. git config --global alias.st 'status -s':查看状态简化输出
    3. git config --global alias.ll 'log --oneline':显示简短的提交记录
    4. git config --global alias.last 'log -1 HEAD --stat':显示最新提交信息和统计信息
    5. git config --global alias.cm 'commit -m':快速提交
    6. git config --global alias.rv 'remote -v':查看远程仓库信息
    7. git config --global alias.d 'diff':快速查看差异
    8. git config --global alias.dv 'difftool -t vimdiff -y':使用vimdiff工具查看差异

      示例:git dv 33559c5 ca1494d file1

    9. git config --global alias.gl 'config --global -l':查看全局配置信息
    10. git config --global alias.se '!git rev-list --all | xargs git grep -F':搜索所有提交内容
  • 编辑别名: 使用git config --global --edit

  • 删除别名:使用git config --global --unset alias.<alias-name>

2.8 gitignore

  • 创建.gitignore文件:在仓库中创建.gitignore文件,定义不需要Git跟踪的文件和目录
  • 规则示例
    • 忽略所有.cpp文件:*.cpp
    • 忽略特定目录:folder/*
    • 不忽略特定文件:!special.cpp

2.9 服务器连接

  • SSH方式连接:在ssh连接github后,就可以使用git clone git@hostname:/path/to/repository/.git
  • 配置远端仓库:在本地仓库中配置git remote add <name> user@hostname:/path/to/repository/.git

2.10 其他技巧

  • Git LFS:用于管理大文件
  • 提交签名:防止提交被伪造
  • GitHub Actions:CI/CD自动化工具