基本概念
Git文件的四种状态
- 未追踪(Untrack):新创建的不在版本控制之下的文件
- 未修改(Unmodified):文件自上次提交后未修改
- 已修改(Modified):文件已经被修改,但还没提交到暂存区
- 已暂存(Staged):文件已修改并提交到暂存区
常见名词
main:默认主分支origin:默认远程仓库HEAD:指向当前版本的指针HEAD^:指向上一个版本HEAD~n:指向上n个版本
忽略文件配置
创建并配置名称为.gitignore的文件可以使仓库忽略一些不必要的文件。
一般来说,以下文件往往需要忽略:
- 系统或软件自动生成的文件
- 编译产生的中间文件和结果文件
- 运行时生成日志文件、缓存文件、临时文件
- 设计身份、密码、口令、秘钥等敏感信息文件
配置的文件语法与正则表达式类似,以下是一个配置文件实例:
# 忽略所有.a文件*.a
# 跟踪所有lib.a文件,即使前面忽略了.a文件!lib.a
# 只忽略当前目录下的TODO文件,而不忽略subdir/TODO/TODO
# 忽略所有目录下名为build的文件build/
# 忽略doc/NOTEs.txt,但不忽略doc/server/arch.txtdoc/*.txt
# 忽略doc/目录及其所有子目录下的.pdf文件doc/**/*.pdf环境配置
ssh配置
创建秘钥
ssh-keygen -t rsa -C '说明'配置github公钥:在GitHub账户添加公钥,这样该账户的所有仓库均可通过公钥直接访问
测试秘钥是否正常:
ssh -T git@github.com如果拒绝访问,在ssh配置目录下的config文件中添加以下代码即可:
Host github.comHostName ssh.github.comUser gitPort 443用户名邮箱配置
初始化设置用户名和邮箱
git config --global user.name "your name"git config --global user.email email@mail.com查看全局配置的Git设置
git config --global --list练习资料
分支管理和工作流模型
- GitFlow模型
- main(主线/基线)分支
- 主要分支,长期存在
- 只接受来自hotfix和release的合并请求
- 不允许直接push修改
- hotfix(线上版本bug热修复分支)
- 辅助分支,短期存在
- 用于解决线上问题
- 从main分支分离出来,修复完成后合并回main分支
- develop(开发分支)
- 主要分支,长期存在
- 用于开发工作
- feature(功能分支)
- 辅助分支,短期存在
- 从develop分支分离出来,测试稳定后合并回develop分支
- release(预发布分支)
- 辅助分支,短期存在
- 用于发布前的测试和验证
- 从develop分支分离出来,测试稳定后合并到main分支和develop中
- main(主线/基线)分支
- 简单的GitHubFlow开发流程
- 创建组织
- 创建项目主仓库
- Clone主仓库/Fork主仓库并Clone新仓库
- 添加上游地址
- 同步最新代码
- 创建功能分支
- 提交代码
- 同步最新代码
- 合并分支
- 推送代码
- 提交Pull Request
- 讨论审核代码
- 合并与部署
- 删除功能分支
常用命令
创建仓库
在当前目录创建一个新的本地仓库
git init下载一个远程仓库
git clone <url>远程仓库
将本地仓库关联到远程仓库
git remote add <origin-name> <url>将远程仓库的所有更新下载到本地仓库,同时更新相应的远程分支指针的位置
git fetch将远程仓库的指定分支的更新信息下载到本地仓库
git fetch <origin-name> <remote-branch-name>将远程仓库的指定节点的更新信息下载到本地仓库,更新本地指定分支的位置
git fetch <origin-name> <remote-commit-id>:<local-branch-name>更新当前分支关联的远程分支,然后将远程分支merge到当前分支,会遗留两个父节点信息
git pull更新当前分支关联的远程分支,然后将当前分支rebase到远程分支,只会遗留一个父节点信息
git pull --rebase将远程仓库的指定分支拉取到本地并进行合并
git pull <origin-name> <remote-branch-name>:<local-branch-name>将当前分支的更新信息推送到远程仓库对应的分支
git push将指定分支的更新信息推送到远程仓库同名分支
git push <origin-name> <branch-name>将指定节点的更新信息推送到远程仓库指定分支
git push <origin-name> <local-commit-id>:<remote-branch-name>查看远程仓库
git remote -v添加和提交
添加一个文件到仓库
git add <file>NOTE
- 可以使用通配符,例如:
git add *.txt- 可以使用目录,例如:
git add .
提交所有暂存区的文件到仓库
git commit -m "message"[!attention] 直接使用
git commit会进入vim编辑说明文本
提交所有已修改的文件到仓库
git commit -am "message"修改当前节点的提交信息
git commit --amend为指定节点添加标签
git tag <tagname> <commit-id> # commit-id默认为HEAD撤销
回退到指定版本
git reset <commit-id>NOTE该命令可指定三个参数:
--soft:保留当前版本的工作区和暂存区,回退到指定版本号--hard:不保留当前版本的工作区和暂存区,回退到指定版本号--mixed:默认参数,保留当前版本的工作区,不保留当前版本的暂存区,回退到指定版本号
在当前位置添加新的版本以抵消指定节点的更改,也就是通过添加一个节点的方式来删除节点
git revert <commit-id>把文件从工作区和暂存区同时删除
git rm <file>NOTE常见的可添加参数有:
--cached:把文件从暂存区删除,并将文件转化为未追踪文件-r:递归删除某个目录下的所有子文件和目录
将文件从暂存区移除
git restore --staged <file>将文件尚未加入暂存区的修改全部撤销
git restore <file>查看
列出未新的或已修改的文件的状态
git status查看处理版本控制下的所有文件
git ls-files查看当前分支提交的历史版本
git logNOTE添加
--online参数可以简化输出信息
查看分支图
git log --graph --oneline --decorate --all查看HEAD指针的移动历史
git reflog比较工作区和暂存区的差异
git diff比较工作区和本地仓库的差异
git diff HEAD比较暂存区和本地仓库的差异
git diff --cached比较两个版本仓库之间的差异
git diff <commit-id> <commit-id>比较两个分支之间的差异
git diff <branch-name> <branch-name>查看所有本地分支
git branchNOTE当前分支前会有一个
*,添加-r查看远程分支,添加-a查看所有分支
创建一个新分支
git branch <branch-name> <commit-id>NOTEcommit-id默认为HEAD
强制改变分支指针的位置
git branch -f <branch-name> <commit-id>创建并切换到新分支
git checkout -b <branch-name>修改当前分支的名称
git branch -M <branch-name>将指定分支绑定到远程分支
git branch -u <remote-branch-name> <branch-name>NOTE如果此时就在指定分支上,可以省略分支名
切换到指定分支
git switch <branch-name>将指定分支合并到当前分支上
git merge <branch-name>删除一个已经合并到其他分支上的分支
git branch -d <branch-name>将当前分支变基到指定分支
git rebase <branch-name>将分支2变基(接到后面)到分支1
git rebase <branch-name-1> <branch-name-2>通过交互界面重新规划指定节点的下一个节点到本节点之间的所有节点
git rebase -i <commit-id>NOTE交互式界面可进行如下操作:
- 调整提交记录顺序
- 删除某些提交
- 合并提交
复制节点到当前位置
git cherry-pick <commit-id-1> ... <commit-id-n>部分信息可能已经过时











