git使用
前言:本文是作者学习git的笔记。在一番周转之后,推荐学习路径:
- 了解基础概念:
Git 教程 - 菜鸟教程- 练习分支操作:
Git 分支小游戏- 工作流管理:
Gitflow工作流- 约定式提交:
约定式提交
1. 学习资料
- 官方文档:Git 官方文档
- Git 教程:
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 pull:
git 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
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工具查看差异示例:
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>
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自动化工具
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 kingpoem的王国🏰!
评论