文章目录
Git基本操作命令
- 放两张图便于理解
- 第一张图,是只有本地仓库的相关操作,对文件的增删改、提交、撤销等
- 第二张图,是将远程仓库包含进来
创建仓库命令
# 初始化一个仓库
git init
# 从远程服务器上克隆一个仓库,其实也相当于下载一个仓库
git clone 远程仓库的地址
提交与修改
# 将文件添加到暂存区
# 可以使用通配符,例如:git add *.txt
# 可以使用目录,例如:git add . # 表示添加当前目录下已经修改的文件
git add
# 查看当前仓库的状态,是否有文件更改
git status
# git diff 比较文件的不同,即暂存区和工作区的差异
git diff:比较工作区和暂存区中的文件差异
git diff --cache:比较暂存区和本地仓库的文件差异
git diff HEAD(本地仓库的历史提交ID,此处使用HEAD作为事例):比较工作区和本地仓库的文件差异
git diff ID1 ID2:比较本地仓库的两个版本之间的差异
# 使用外部差异工具查看和比较文件的更改
git difftool
# 比较两个提交范围之间的差异
git range-diff
# 提交暂存区中的文件到本地仓库
# 只提交暂存区中的内容,不会提交工作区中的内容
git commit -m "commit message"
提交日志
# 查看仓库提交历史记录
# 可以在该命令后添加 --oneline 参数来查看简洁的提交记录
# 更高级的图形化显示参数 --all --graph --oneline --decorate
git log
# 列表形式查看指定文件的历史修改记录
git blame <file>
# 简洁日志摘要
git shortlog
# 生成一个可读的字符串
git describe
版本回退
git reset
- 三种不同的参数模式
- –soft:表示回退到某一个版本,并且保留工作区和暂存区中所有修改的内容
- –hard:表示回退到某一个版本,并且丢弃工作区和暂存区中所有修改的内容
- –mixed:介于soft和hard之间,表示保留工作区,但是丢弃暂存区中的内容
分支切换
# 使用场景:多人协作开发
# 查看分支列表
git branch
# 创建分支
git branch branch-name
# 切换分支
git checkout branch-name
# 更加推荐使用
git switch branch-name
# 合并分支
git merge branch-name
# 删除分支
git branch -d branch-name # 已合并
git branch -D branch-name # 未合并
删除文件
# 先从工作区删除文件,然后再将删除的内容添加到暂存区
rm file
git add file
# 把文件从工作区和暂存区同时删除
git rm file
# 把文件从暂存区删除,但保留在当前工作区中
git rm --cached file
# 递归删除某个目录下的所有子目录和文件
git rm -r *
# 以上操作都需要进行commit提交
.gitignore文件
- 作用:自动忽略掉不需要被提交到版本库中的文件
- 日志文件、文件夹
- .class文件
- .o文件
- .env文件
- .zip和tar文件
- .pem文件
- 等等
- 匹配规则
- 空行或者亿#开头的行会被Git忽略。一般空行用于可读性的分割,#一般用作注释
- 使用标准的blob模式匹配,例如:
- 星号**通配任意个自负
- 问号?匹配单个自负
- 中括号[]表示匹配列表中的单个字符,比如:[abc]表示a/b/c
- 两个星号**表示匹配任意的中间目录
- 中括号可以使用短中线连接,比如:
- [0-9]表示任意一位数字,[a-z]表示任意一位小写字母
- 感叹号 ! 表示取反
# 忽略所有的.a文件
*.a
# 但跟踪所有的lib.a,即便你在前面忽略了.a文件
!lib.a
# 忽略任何目录下名位build的文件夹
build/
# 忽略doc/notes.txt,但不忽略/doc/server/arch.txt
doc/*.txt
# 忽略doc/目录及其所有子目录下的.pdf文件
doc/**/*.pdf
远程操作
# 远程仓库操作
git remote
# 从远程获取代码库
git fetch
# 下载远程代码并合并
git pull
# 上传远程代码并合并
git push
# 管理子仓库
git submodule
Git分支管理
关于git分支功能是Git强大的功能之一,可以让多个开发人员协作并行工作,开发新功能、修改bug,并最终汇集到主分支上。每一个分支都代表着一条独立的开发线路。关于git分支管理,有两个工作流模式,一个叫做Gitflow工作流
,一个叫做Github工作流
- Gitflow工作流(比较复杂,不适合持续集成,适合团队人数较多的情况)
- 功能分支(Feature):开发人员以功能名称命名一个分支,独立于其他分支进行开发工作,完成开发后合并入共享开发分支。
- 共享开发分支(Develop):用于集成多个功能分支,一个版本全部功能开发完成后,可以拉出发布分支进行发布,而共享开发分支可以继续进行下一个版本的开发工作。
- 发布分支(Release):用于保存发布过程中产生的代码修改,发布后会将代码合并到共享开发分支和主分支。
- 热修复分支(Hotfix):当某个正式版本出现紧急 bug 需要修复时,从主分支的对应版本拉出 Hotfix 分支,进行紧急修复,发布后,合并回主分支。
- 主分支(Master):用于保存所有发布的版本。
- Github工作流(相对Gitflow工作流简单,适合团队人数较少的情况)
除了以上两种工作流模式外,还有GitLab Flow工作流。关于工作流模式此处不再详细介绍。
创建分支
# 创建新分支并切换到该分支
git checkout -b branch-name
# 切换分支
git checkout branch-name
查看分支
# 查看所有分支
git branch
# 查看远程分支
git branch -r
# 查看所有本地分支和远程分支
git branch -a
合并分支
# 将其他分支合并到当前分支
git merge branch-name(其他分支名)
# 在合并的时候,出现合并冲突的文件,需要手动解决冲突,在解决完冲突后,需要重新提交该冲突文件
git add <confict-file>
git commit
删除分支
# 删除本地分支
git branch -d branch-name
# 强制删除未合并的分支
git branch -D branch-name
# 删除远程分支
git push origin --delete branch-name
保存当前文件未提交更改并切换分支
# 保存当前工作目录中的未提交更改,并将其恢复到干净的工作区
git stash
# 恢复最近保存的更改
git stash pop
# 列出所有保存的更改
git stash list
Git提交历史
- git log
- 查看历史提交记录
- git blame
- 以列表形式查看指定文件的历史修改记录
命令:git log [选项] [分支名/提交哈希]
常用的选项包括:
-p
:显示提交的补丁(具体更改内容)。--oneline
:以简洁的一行格式显示提交信息。--graph
:以图形化方式显示分支和合并历史。--decorate
:显示分支和标签指向的提交。--author=<作者>
:只显示特定作者的提交。--since=<时间>
:只显示指定时间之后的提交。--until=<时间>
:只显示指定时间之前的提交。--grep=<模式>
:只显示包含指定模式的提交消息。--no-merges
:不显示合并提交。--stat
:显示简略统计信息,包括修改的文件和行数。--abbrev-commit
:使用短提交哈希值。--pretty=<格式>
:使用自定义的提交信息显示格式。
命令:git blame [选项] <文件路径>
常用的选项包括:
-L <起始行号>,<结束行号>
:只显示指定行号范围内的代码注释。-C
:对于重命名或拷贝的代码行,也进行代码行溯源。-M
:对于移动的代码行,也进行代码行溯源。-C -C
或-M -M
:对于较多改动的代码行,进行更进一步的溯源。--show-stats
:显示包含每个作者的行数统计信息。
恢复和回退
Git提供了多种方法来恢复和回退到之前的版本,不同的命令适用于不同的场景和需求
以下是几种常见的方法
git checkout
:切换分支或恢复文件到指定提交。git reset
:重置当前分支到指定提交(软重置、混合重置、硬重置)。git revert
:创建一个新的提交以撤销指定提交,不改变提交历史。git reflog
:查看历史操作记录,找回丢失的提交。
1、git checkout:检查出特定版本的文件
git checkout 命令用于切换分支或恢复工作目录中的文件到指定的提交
恢复工作目录中的文件到某个提交
# 将filename恢复到commit-id提交时的版本
git checkout <commit-id> -- <filename>
切换到特定提交
git checkout <commit-id>
2、git reset重置当前分支到特定提交
git reset命令可以更改当前分支的提交历史,它有三种主要模式:--soft
、--mixed
、--hard
- –soft:只重置HEAD到指定的提交,暂存区和工作目录保持不变
git reset --soft <commit>
- –hard:重置HEAD到指定的提交,暂存区和工作目录都重置
git reset --hard <commit>
- –mixed:重置HEAD到指定的提交,暂存区重置,但工作目录保持不变
git reset --mixed <commit>
3、git revert:撤销某次提交
git revert命令创建一个新的提交,用来撤销指定的提交,它不会改变提交历史,适用于已经推送到远程仓库的提交
git revert <commit>
4、git reflog:查看历史操作记录
git reflog:命令记录了所有HEAD的移动。即使提交被删除或重置,也可以通过reflog找回
git reflog
Git标签
Git标签(Tag)用于给定仓库中的特定提交点加上标记,通常用于发布版本。比如你手里有一个项目完成了第一个阶段的功能,可以标记为v1.0版本,可以使用git tag -a v1.0
命令给最新的一次提交打上v1.0
的标签
- -a 选项意思为创建一个带注解的标签
标签语法格式如下
git tag tag-name
标签推送
默认情况下,git push不会推送标签,需要显式推送标签
git push origin tag-name
# 推送所有标签
git push origin --tags
删除标签
# 本地删除
git tag -d tag-name
# 远程删除
git push origin --delete tag-name
附注标签
附注标签存储了创建的名字、Email等信息,附注更为正式,适用于需要额外元数据的场景
附注标签语法如下
git tag -a tag-name -m "message"
# PGP签名标签命令
git tag -s tag-name -m "message"
查看标签信息
git show tag-name
删除标签
# 本地删除
git tag -d v1.0
# 远程删除
git push origin --delete v1.0