一、核心概念梳理
(一)四个关键区域
Git的工作流程围绕四个核心区域展开,清晰理解它们的关系是掌握Git的基础:
工作区:就是我们本地电脑中实际存放项目文件的目录,日常的代码编写、文件修改都在这里进行。
暂存区:作为工作区和本地仓库之间的过渡区域,用于临时保存我们的修改。通过
git add命令可以将工作区中修改的文件添加到暂存区,相当于为提交做准备。本地仓库:存储着项目完整的版本历史和元数据,通过
git commit命令可以将暂存区的修改提交到本地仓库,形成一个新的版本记录。远程仓库:通常搭建在远程服务器上,比如GitHub、GitLab等,用于团队成员之间共享代码。我们可以通过
git push将本地仓库的代码推送到远程仓库,也可以通过git pull或git clone将远程仓库的代码拉取到本地。
(二)三个重要对象
Git中所有的数据都以对象的形式存储,主要包括三种类型:
Blob对象:用于存储文件的内容,每个Blob对象对应一个文件的快照,但不包含文件名等元数据。
Tree对象:相当于目录,它记录了Blob对象和其他Tree对象的引用,从而构建出项目的目录结构。
Commit对象:代表一次提交操作,它包含了指向Tree对象的指针、提交者信息、提交时间、提交消息以及父Commit对象的指针(除了第一次提交),通过Commit对象可以追溯项目的完整历史。
(三)分支的本质
分支在Git中本质上是一个指向Commit对象的轻量级指针。创建分支仅仅是创建一个新的指针,并不会复制文件,因此创建和切换分支的操作非常高效。切换分支实际上就是移动HEAD指针,让它指向不同的分支指针,从而切换到对应的项目版本。
二、基础命令汇总
(一)配置命令
在使用Git之前,首先需要进行基本的配置,包括设置用户名和邮箱,这些信息会出现在提交记录中:
git config --global user.name "你的名字"
git config --global user.email "你的邮箱"
git config --global core.editor "vim" # 设置默认编辑器
git config --list # 查看所有配置信息
(二)仓库初始化与克隆
初始化本地仓库:在本地项目目录中执行以下命令,将当前目录初始化为Git仓库:
git init
克隆远程仓库:将远程仓库的完整代码复制到本地,可以使用以下命令:
git clone <远程仓库URL> # 克隆整个仓库
git clone -b <分支名> <远程仓库URL> # 克隆指定分支
(三)基本操作流程
查看状态:随时了解工作区和暂存区的文件状态,这是Git使用过程中最常用的命令之一:
git status
添加到暂存区:将工作区中修改的文件添加到暂存区:
git add <文件名> # 添加指定文件
git add . # 添加所有修改的文件
提交到本地仓库:将暂存区的修改提交到本地仓库,并添加提交消息:
git commit -m "提交消息" # 常规提交
git commit -am "提交消息" # 跳过add步骤,直接提交已跟踪的文件
(四)查看差异
查看不同区域之间的文件差异,帮助我们了解修改的内容:
git diff # 比较工作区和暂存区的差异
git diff --cached # 比较暂存区和本地仓库的差异
git diff HEAD # 比较工作区和本地仓库的差异
git diff branch1..branch2 # 比较两个分支之间的差异
(五)查看历史记录
查看项目的提交历史,了解项目的演进过程:
git log # 查看完整的提交历史
git log --oneline # 以简洁的一行形式显示提交历史
git log --oneline --graph # 以图形化的方式显示提交历史,更直观地展示分支关系
git log -5 # 查看最近5条提交记录
git log --grep="关键词" # 根据提交消息中的关键词搜索提交记录
git log --author="名字" # 根据作者名字搜索提交记录
三、分支管理命令
(一)基础分支操作
查看分支:
git branch # 查看本地分支,当前分支前会有*标记
git branch -a # 查看所有分支,包括本地和远程分支
git branch -r # 只查看远程分支
git branch -vv # 查看本地分支与远程分支的跟踪关系
创建分支:
git branch <分支名> # 创建新分支,但不切换到该分支
git checkout -b <分支名> # 创建新分支并切换到该分支
git switch -c <分支名> # 新语法,创建新分支并切换到该分支
切换分支:
git checkout <分支名> # 切换到指定分支
git switch <分支名> # 新语法,切换到指定分支
删除分支:
git branch -d <分支名> # 删除已合并的分支
git branch -D <分支名> # 强制删除未合并的分支
(二)分支合并
将一个分支的修改合并到另一个分支是团队协作中常见的操作,以将feature分支合并到main分支为例:
git checkout main # 切换到main分支
git merge feature # 将feature分支的修改合并到main分支
git branch -d feature # 合并完成后,可选删除feature分支
(三)基于特定提交创建分支
有时候我们需要基于某个历史提交创建新的分支,用于修复旧版本的问题或进行版本回溯:
git checkout -b <新分支名> <提交哈希值>
四、远程仓库操作命令
(一)管理远程仓库
查看远程仓库:查看当前本地仓库关联的远程仓库信息:
git remote -v
添加远程仓库:将本地仓库与远程仓库关联:
git remote add <远程仓库别名> <远程仓库URL>
删除远程仓库:解除本地仓库与远程仓库的关联:
git remote remove <远程仓库别名>
重命名远程仓库:修改远程仓库的别名:
git remote rename <旧别名> <新别名>
修改远程仓库URL:当远程仓库的URL发生变化时,可以使用以下命令修改:
git remote set-url <远程仓库别名> <新URL>
(二)推送代码
将本地仓库的代码推送到远程仓库:
git push <远程仓库别名> <本地分支名> # 将本地分支推送到远程仓库对应的分支
git push <远程仓库别名> <本地分支名>:<远程分支名> # 将本地分支推送到远程仓库的指定分支
(三)拉取和获取代码
拉取代码:将远程仓库的代码拉取到本地,并自动合并到当前分支,相当于
git fetch和git merge的组合:
git pull <远程仓库别名> <远程分支名>
获取代码:将远程仓库的代码拉取到本地,但不会自动合并到当前分支,需要手动执行合并操作:
git fetch <远程仓库别名> <远程分支名>
五、撤销和恢复命令
(一)工作区撤销
如果在工作区中对文件进行了修改,但还没有添加到暂存区,可以使用以下命令撤销修改:
git restore <文件名> # 新语法
git checkout -- <文件名> # 旧语法
(二)暂存区撤销
如果已经将文件添加到暂存区,但还没有提交到本地仓库,可以使用以下命令将文件从暂存区撤销到工作区:
git restore --staged <文件名> # 新语法
git reset HEAD <文件名> # 旧语法
(三)提交撤销
如果已经提交到本地仓库,但想要撤销最近的一次提交,可以使用以下命令:
git commit --amend # 修改最近一次的提交消息,或者补充提交文件
git reset --soft HEAD^ # 撤销提交,将修改保留在暂存区
git reset --mixed HEAD^ # 撤销提交,将修改保留在工作区(默认选项)
git reset --hard HEAD^ # 撤销提交,同时丢弃工作区和暂存区的修改,谨慎使用
(四)恢复丢失的提交
如果不小心删除了分支或执行了错误的重置操作导致提交丢失,可以使用git reflog命令查看所有的操作记录,然后恢复对应的提交:
git reflog # 查看操作记录
git checkout <提交哈希值> # 恢复到指定的提交
六、提交历史操作命令
(一)修改最后一次提交
如果发现最近一次提交的消息有误或者遗漏了文件,可以使用以下命令修改:
git commit --amend
执行该命令后,会进入编辑器修改提交消息,如果需要补充文件,只需先将文件添加到暂存区,然后执行该命令即可。
(二)交互式变基
交互式变基可以用于整理提交历史,比如合并多个提交、修改提交消息、删除提交等:
git rebase -i HEAD~n # 对最近n条提交进行交互式变基
执行该命令后,会进入编辑器,在编辑器中可以对提交进行操作,常用的操作指令包括:
pick:保留该提交reword:修改该提交的消息edit:修改该提交的内容squash:将该提交合并到前一个提交fixup:将该提交合并到前一个提交,但丢弃该提交的消息drop:删除该提交
七、使用经验总结
(一)提交规范
每次提交都应该保持提交的原子性,即一个提交只完成一个功能或修复一个问题,并且提交消息要清晰、准确地描述提交的内容,方便后续查看历史记录。
(二)分支策略
在团队协作中,建议采用合理的分支策略,比如Git Flow或GitHub Flow。Git Flow适合大型项目,包含主分支、开发分支、功能分支、发布分支和修复分支等;GitHub Flow则更加简洁,以主分支为核心,所有功能开发都在特性分支上进行,完成后通过Pull Request合并到主分支。
(三)定期同步
在团队协作中,要定期与远程仓库同步代码,避免出现大量的冲突。建议每天开始工作前先执行git pull拉取最新的代码,提交代码前也要先拉取最新代码,确保本地代码是最新的。
(四)谨慎使用强制命令
像git reset --hard、git push --force等强制命令会覆盖历史记录或远程仓库的代码,使用时一定要谨慎,确保自己清楚操作的后果。
八、常用别名设置
为了提高操作效率,可以为常用的Git命令设置别名:
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status
git config --global alias.lg "log --oneline --graph --decorate --all"
设置完成后,就可以使用git co代替git checkout,git lg查看美观的提交历史等。