1. 概念
- 分布式,有远程仓库和本地仓库的概念,因此要注意同步问题
- git是面向对象的,本质是内容寻址系统。.git目录下有个文件夹objects,存储git库中的对象,git就是根据object建立一种树形结构,将文件和通过hash的方式关联起来
2. 工作区 暂存区 本地仓库 远程仓库
关系图如下:
- workspace:工作区,平时写代码的地方
- index:暂存区,让写完后的代码变成待提交状态
- repository:本地仓库,提交暂存区的代码,记录进入代码本地管理
- remote:远程仓库,将本地仓库修改好的代码提交到远程,可供远程协作的人下载
当创建一个git项目,git会在根目录创建一个git目录,需要重点理解的是以下五个:
- HEAD:是指针的指针,用来标记当前的提交
- 新建一个分支的时候其实仅仅是改变了HEAD的指向,这也是git分支比较轻量的原因
- hooks:用来在git操作前后进行一些操作
- index:本地的暂存区
- objects是上面所提到的内容
- refs:分支的引用
简单来说,repository由git维护的三棵"树"组成:
- workspace:持有实际文件
- index:像个缓存区域,临时保存你的改动
- HEAD:指向最后一次提交的结果
3. 提交代码
开始git操作本地必须有一份代码和remote相连,要么从remote拉取(适用于代码存在remote的情况),要么自己上传本地代码连接remote(适用于repository初次上传到remote的情况)
git clone <url>
:克隆remote的版本到本地,成功后本地就有了一样的代码,并且也已经与remote连接成功
上传本地代码并连接remote操作大致如下:
1. 在项目的根目录打开Git Bash Here
2. 执行以下步骤:
git init
git add .
git commit -m "first commit"
git remote add origin 远程仓库地址
git push -u origin master
修改代码后将其提交到index:
git add .
:添加当前目录所有文件到index- 提交后没有任何提示,可以用
git status
查看文件是否有修改,是否进入index,已经提交到repository的不会展示
将index里文件提交到repository,这是个离线操作:
git commit -m "message"
:将index里文件提交到repository,message的位置填写本次提交修改的内容和一些注释
将repository提交到remote:
git push <remote> <branch>
:<remote>
位置填写remote名称,<branch>
填写需要提交的分支git push origin master
:推送到远程origin仓库的master分支
4. 关于协作
拉取remote代码到repository:
git pull <remote> <branch>
:<remote>
写remote名称,<branch>
写拉取remote的分支git pull origin master
:拉取远程origin仓库的master分支到repository
- 将代码提交到remote之前,最好先拉取一下远程的最新代码,以免产生冲突
4.1 分支
在合作中有可能会有并行开发的需求,但可能不会同时上线,不能把没有开发完成的分支上线,所以就出现了分支branch
分支的功能:从同一份稳定代码拉出有相同代码的分支,每个人在自己的分支上开发提交代码,不会互相打扰,完成后再进行代码的合并
- master是默认的分支,在其他分支上进行开发,完成后再将它们合并到主分支上
- 除非将分支推送到远程仓库,不然该分支是不为别人所见的
举个例子实践一下:
git checkout -b dev
:创建并切换到dev分支- 加上-b参数表示创建并切换
git branch dev
+git checkout dev
git branch
:查看所有本地分支,当前分支前面会标一个*号git branch -d dev
:删除dev分支
4.2 合并分支
合并之前确保要合并的两个分支都是当前分支的最新代码(pull一下),再切换到要保存合并代码的分支
git merge <branch>
:合并指定分支到当前分支git log --graph
:查看分支合并图- 合并后可能出现冲突,需要修改文件手动合并这些冲突
git add <filename>
:来标记合并成功
常见冲突管理:
git merge --abort
:撤销合并操作,回到开始合并之前的状态- 当解决完冲突后,在合并完成后发现一个错误,
git reset --hard
就可以回滚到那个合并之前的状态
git常见命令速查表:
5. 常见场景及解决方案
5.1 stash
场景:正在feature分支下开发新需求,但是线上突然出现bug要马上修复,需要切到master分支
只需要git stash
就可以把代码存起来,修复完线上问题后切回feature分支,用git stash apply
就可恢复代码
一些相关命令:
# 保存当前未commit的代码
git stash
# 保存当前未commit的代码并添加备注
git stash save "备注的内容"
# 列出stash的所有记录
git stash list
# 删除stash的所有记录
git stash clear
# 应用最近一次的stash
git stash apply
# 应用最近一次的stash,随后删除该记录
git stash pop
# 删除最近的一次stash
git stash drop
5.2 reset --soft
应用场景:有的时候不小心把不该提交的内容commit了,想改回来就只能再commit一次,但就多了一条"黑历史"
只需要`git reset --soft HEAD^,相当于后悔药,可以再次修改重新提交,保持干净的commit记录,这说的是未push的commit。
对于已经push的commit也可以使用该命令,不过再次push时,由于远程分支和本地分支有差异,需要强制推送git push -f
来覆盖被reset的commit
PS:在reset --soft
指定commit时,会将该commit到最近一次commit的所有修改内容全部恢复,而不是只针对该commit