初始化
初始化设置用户名和邮箱
git config --global user.name "zjq" #设置用户名
git config --global user.email [email protected] #设置邮箱
git config --global credential.helper store #存储,后续无需再设置
创建仓库
git init <project-name> #创建一个新的本地仓库(省略project-name则在当前目录创建)
git clone <url> #下载一个远程仓库
三个工作区域
工作区(Working Directory):.git所在的目录,实际操作的目录
暂存区(Staging Area/Index):中间区域,用于临时存放即将提交的修改内容
本地仓库(Local Repository):git存储代码和版本信息的主要位置
四种文件状态
未跟踪(Untrack):新创建的,尚未被git管理起来的文件
未修改(Unmodified):被git管理起来,但文件内容没有发生变化
已修改(Modified):已修改的文件,但未添加到暂存区里面
已暂存(Staged):修改后且添加到暂存区的文件
添加和提交文件
git status # 查看仓库的状态
git add <filename> # 添加到暂存区
可以使用通配符,如git add *.txt
也可以使用目录,如git add .
git commit # 提交到本地仓库,注意:只会提交暂存区的文件
git log # 查看仓库提交历史记录,可以用--oneline查看简洁提交
reset回退版本 三种模式
soft:保留工作区和暂存区内容
hard:不保留工作区和暂存区内容
mixed:保留工作区内容,不保留暂存区内容
git diff查看差异
git rm删除文件
方式1:rm删除工作区文件,再删除暂存区内容
rm file #删除本地工作区文件
git add --all file #更新暂存区
方式2:使用git命令直接删除工作区和暂存区
git rm <file> #把文件从工作区和暂存区同时删除,
#要删除的文件是没有修改过的,就是说和当前版本库文件的内容相同。
git rm --cached <file> #把文件从暂存区删除,但保留在当前工作区中
git rm -r * #递归删除某个子目录下的所有子目录和文件
git ls-files 查看仓库中的文件
删除后切记要commit
.gitignore文件
应该忽略哪些文件
ignore文件匹配规则
示例
# 忽略所有的.a文件
*.a
# 但跟踪所有的lib.a文件
!lib.a
# 只忽略当前目录下的TODO文件,而不忽略subdir/TODO
/TODO
# 忽略任何目录下名为build的文件
build/
# 忽略doc/notes.txt,但不忽略doc/server/arch.txt
doc/*.txt
# 忽略doc/目录及其子目录下的.pdf文件
doc/**/*.pdf
提示:GitHub上提供了各种语言的gitignore的文件模板,可以修改后使用
远程仓库 Github/Gitee
配置远程仓库
生成ssh密钥
cd
cd .ssh
# 生成ssh密钥
ssh-keygen -t rsa -b 4096
# 将.pub公钥文件内容复制到远程仓库账户的密钥配置中
克隆仓库
git clone <repo-address>
向远程仓库提交内容
git push <remote> <branch>
从远程仓库拉取更新内容
git pull <remote>
关联本地仓库和远程仓库
# step1.添加远程仓库
git remote add <远程仓库名> <远程仓库地址>
# step2.提交到远程仓库
git push -u <远程仓库名> <分支名>
# 查看远程仓库
git remote -v
# 拉取远程仓库内容
git pull <远程仓库名> <远程分支名>:<本地分支名>
# 远程与本地分支名相同可省略
分支
# 查看分支列表
git branch
# 创建分支
git branch branch-name
# 切换分支
git switch branch-name
# 合并分支
git merge branch-name
# 删除分支
git branch -d branch-name # 删除已合并的分支
git branch -D branch-name # 删除未合并的分支
合并分支时的冲突处理
merge
两个分支未修改同一个文件的同一处位置:Git自动合并
两个分支修改了同一个文件的同一处位置:产生冲突
# step1.手工修改冲突文件,合并冲突内容
# step2.添加暂存区
git add file
# step3.提交修改
git commit -m "message"
# 中止合并:当不想继续执行合并操作时可以使用下面的命令来中止合并过程
git merge --abort
Rebase
每个分支都有一个HEAD指针指向最新的提交,Rebase操作会找到两个分支的最近公共祖先结点,将git当前所在分支从最近公共祖先结点到HEAD指针嫁接到另一个分支的HEAD指针之后
二者对比
Merge不会破坏原分支的提交记录,方便回溯和查看;但会产生额外的提交结点,分支图较为复杂。
Rebase不会新增额外的提交记录,形成线性历史,比较直观和干净;但会改变提交历史,改变了当前分支branch out的节点,避免在共享分支时使用
分支管理和工作流模型
GitFlow模型
主线/基线分支 主要分支
包含了项目最新稳定版本的代码,应随时保证主线分支代码是可发布的,会被部署到生产环境中,不允许直接修改,只能通过合并分支
问题修复分支
从主线分支分离出来,用于解决线上bug问题,修复完成后合并回main分支
命名规则:hotfix-#issueid-desc
开发分支 主要分支
从主线分支分离出来,包含项目最新开发版本的代码,用于开发和测试
功能分支
从开发分支分离出来,包含项目最近开发的新功能,用于开发新功能