配置文件
- 配置文件位置:
- 局部:
.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 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 pull:
git 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>"
- 示例:
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"
:查看分支历史,并以颜色、图形化、自定义格式显示git config --global alias.st 'status -s'
:查看状态简化输出git config --global alias.ll 'log --oneline'
:显示简短的提交记录git config --global alias.last 'log -1 HEAD --stat'
:显示最新提交信息和统计信息git config --global alias.cm 'commit -m'
:快速提交git config --global alias.rv 'remote -v'
:查看远程仓库信息git config --global alias.d 'diff'
:快速查看差异git config --global alias.dv 'difftool -t vimdiff -y'
:使用vimdiff工具查看差异,linux 下我用 gvimdiff示例:
git dv 33559c5 ca1494d file1
git config --global alias.gl 'config --global -l'
:查看全局配置信息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
- master 分支
- 永远保持稳定和可发布的状态。
- 每次发布新版本时,都会从 develop 分支合并到 master 分支。
- develop 分支
- 用于集成所有的开发分支。
- 代表最新的开发进度。
- 功能分支、发布分支和修复分支都从这里分支出去,最终合并回这里。
- feature 分支
- 用于开发新功能。
- 从 develop 分支创建,开发完成后合并回 develop 分支。
- 命名规范:
feature/feature-name
- release 分支
- 用于准备新版本的发布。
- 从 develop 分支创建,进行最后的测试和修复,然后合并回 develop 和 master 分支,并打上版本标签。
- 命名规范:
release/release-name
- hotfix 分支
- 用于修复紧急问题。
- 从 master 分支创建,修复完成后合并回 master 和 develop 分支,并打上版本标签。
- 命名规范:
hotfix/hotfix-name
- support 分支
- 用于维护长期支持版本。
- 仅从 master 分支创建,仅限维护人员使用。
- 命名规范:
support/support-name
- 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 入门