git

配置文件

  • 配置文件位置
    • 局部:.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 status:查看当前状态
    • git status -s:简化输出
  • git add:工作区 → 暂存区
    • git add . :添加所有文件到暂存区
  • git commit:暂存区 → 版本库
    • git commit -a -m "commit message":提交所有已修改文件到版本库
    • git commit --amend -m "commit message":修改上次提交(会破坏之前的提交记录)。它允许你将缓存的修改和之前的提交合并到一起,而不是提交一个全新的快照。它还可以用来简单地编辑上一次提交的信息而不改变快照。
    • git commit --amend --no-edit
  • git stash:暂存区操作
    • git stash pop:恢复暂存区文件
    • git stash apply <stash-id>:恢复指定暂存区文件
    • git stash drop <stash-id>:删除指定暂存区文件
    • git stash clear:清空暂存区
  • 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 revert 和 git clean

  • git reset:版本库 → 暂存区
    • git reset HEAD:取消所有暂存区文件
    • git reset HEAD <file>:取消暂存区文件
    • git reset --soft HEAD^:取消上一次提交,不影响工作区。适合想要修改提交信息的情况。
    • git reset --hard HEAD^:撤销上一次提交,影响工作区
  • git revert:撤销提交
    • git revert <commit-id>:撤销指定提交,会生成一个新的提交记录
    • git revert HEAD:撤销上一次提交,会生成一个新的提交记录
  • git clean:清理工作区
    • git clean -f:强制删除未跟踪文件 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:显示文件级别简要统计信息
  • git difftool:使用外部工具查看差异
    • git difftool --tool=gvimdiff <file-path>:使用gvimdiff工具查看文件差异

分支操作

  • git branch:分支管理
    • git branch -m <old-name> <new-name>:重命名分支
    • git branch -d <branch-name>:删除分支
    • git branch -f <branch-name> <commit-id>:强制移动分支指针
    • git branch --set-upstream-to=<remote>/<branch>:设置跟踪分支
    • 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:变基操作。从内容的角度来看,rebase 只不过是将分支从一个提交移到了另一个。但从内部机制来看,Git 是通过在选定的基上创建新提交来完成这件事的——它事实上重写了你的项目历史。尽管分支看上去是一样的,但它包含了全新的提交。
    • git rebase -i <commit-id>:交互式变基

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

    • git rebase --onto <new-base> <branch-name>:变基指定分支到新基
    • git rebase --continue:继续变基
    • git rebase --abort:取消变基

远端操作

  • git clone:克隆远端仓库
    • git clone -b <branch-name> <url>:克隆指定分支
    • git clone --recurse <url>:克隆含子模块仓库
    • git clone --depth <depth> <url>:克隆指定深度
    • 如果你只想下载某个仓库的某分支下的某份文件,可以curl -O https_path/branch/path/to/your/file
  • git remote:远端管理
    • git remote -vv:查看所有远程仓库
    • git remote add <name> <url>:添加远程仓库
    • git remote remove <name>:删除远程仓库
    • git remote rename <old-name> <new-name>:重命名远程仓库
  • git fetch:收取远端变化
    • git fetch --all:拉取所有远程仓库变化
  • git pullgit fetch + git merge(或git rebase
    • git pull --all:拉取所有分支并合并到当前分支
    • git pull --rebase --all:拉取所有分支并变基到当前分支
  • git push:推送本地变化到远端
    • git push <name> <branch-name>:推送指定分支到远程仓库
    • git push <name> --all:推送所有分支到远程仓库
    • git push <name> --tags:推送所有标签到远程仓库
    • git push -u <name> <branch-name>:推送指定分支到远程仓库并设置默认分支
  • git submodule:子模块管理
    • git submodule add <url> <path>:添加子模块
    • git submodule init:初始化子模块
    • git submodule update:更新子模块

      git submodule update --init --recursive:初始化所有子模块并更新所有子模块(当你克隆了仓库却发现它还有子模块时,可以使用这个命令来初始化子模块)

    • git submodule foreach git <command>:在子模块中执行命令

提交日志

  • git log:展示历史,当然这么长的参数要设置别名啦
  • git blame:查看贡献者
    • git blame <file>:查看指定文件每行最后一次修改的提交记录
    • git blame -L <start>,<end> <file>:查看指定文件指定行范围的最后一次修改的提交记录
    • git blame -C <file>:查看指定文件每行最后一次修改的提交记录,并显示代码上下文
  • git shortlog:统计贡献
    • git shortlog -sne:统计提交者、邮箱、贡献数量
  • git describe:查看标签信息
  • git reflog:显示引用日志

其他命令

  • git tag:标签管理
    • git tag -a <tag-name> -m "tag message":创建标签
    • git tag -d <tag-name>:删除标签
    • git tag -l "v1.0.*":列出所有v1.0版本标签
  • git notes: 管理备注
    • git notes add -m "note message" <commit-id>:添加备注
    • git notes show/edit/merge/remove <commit-id>:查看备注,编辑备注,合并备注,删除备注
  • git grep:搜索提交内容
  • 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:系统检查和垃圾清理

Git 别名

  • 配置别名:使用git config --global alias.<alias-name> "<command>"
  • 示例
    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工具查看差异,linux 下我用 gvimdiff

      示例: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>

gitignore

  • 规则示例
    • 忽略所有.cpp文件:*.cpp
    • 忽略特定目录:folder/*
    • 不忽略特定文件:!special.cpp
  • 取消跟踪但保留文件: git rm -r --cached <file>

    注意,如果你想用github做备份,请检查是否有将某些重要文件放在.gitignore文件中,避免文件丢失。

服务器连接

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

git flow

安装:paru gitflow-zshcompletion-avh

  1. master 分支
  • 永远保持稳定和可发布的状态。
  • 每次发布新版本时,都会从 develop 分支合并到 master 分支。
  1. develop 分支
  • 用于集成所有的开发分支。
  • 代表最新的开发进度。
  • 功能分支、发布分支和修复分支都从这里分支出去,最终合并回这里。
  1. feature 分支
  • 用于开发新功能。
  • 从 develop 分支创建,开发完成后合并回 develop 分支。
  • 命名规范feature/feature-name
  1. release 分支
  • 用于准备新版本的发布。
  • 从 develop 分支创建,进行最后的测试和修复,然后合并回 develop 和 master 分支,并打上版本标签。
  • 命名规范release/release-name
  1. hotfix 分支
  • 用于修复紧急问题。
  • 从 master 分支创建,修复完成后合并回 master 和 develop 分支,并打上版本标签。
  • 命名规范hotfix/hotfix-name
  1. support 分支
  • 用于维护长期支持版本。
  • 仅从 master 分支创建,仅限维护人员使用。
  • 命名规范support/support-name
  1. refactor 分支
  • 用于重构代码。
  • 仅从 develop 分支创建,完成后合并回 develop 分支。
  • 命名规范refactor/refactor-name

参考内容

Git 官方文档
Git 教程 - 廖雪峰的官方网站
Git 书籍 - Pro Git
学习Git底层原理 - learn-git-the-super-hard-way
Git Cheat Sheet
Git Wiki
GitGuide 这里面还有关于 Github 的美化教程。
Git recipe
Git 分支可视化
Gitflow工作流
约定式提交
Lazygit
科协 Git 入门