一、git服务器客户端结构
如下图,git属于分布式版本控制工具。每个client(即我们所说的开发人员)在clone服务器端的项目(例如git@xxxx.com:name/xxx.git)后会拷贝服务端的整个仓库(repository )到client端。所以即使服务端的仓库混乱了也可以用可用的client端的复原
二、基本命令
参考git命令,非常详细
这里主要说下git reset、git revert、git checkout的区别
git checkout是用暂存区的内容覆盖工作区的内容,不能复原 谨慎使用
git reset 撤销git add 或者git commit 的操作,不可复原git commit的操作
git revert 功能同git reset 但是会生成新的commit记录该次操作,之前的commit可以复原,建议用该操作
三、工作流程
首先看一下上图的基本的提交(红线),撤销(黄线),拉取(绿线)的基本流程。客户端的工作分为三个部分,工作空间、缓存空间、本地仓库。平时我们天天打交道的就是工作空间(即是写代码的地方)。
3.1 撤销流程——撤销add操作
先看下服务器上的master分支现状,目前只有一个TEST.txt文件
1.git status查看当前工作区域状态,当前有三个文件被修改。
2.分三次用git add 增加file1.txt、file2.txt、file3.txt
3.用git reset撤销对文件file1的添加
4.使用git commit 和 git push将file2.txt file3.txt提交到远程仓库
5.远程仓库已有
3.2 撤销流程——撤销commit操作
1.用git add和git commit分三次提交file1.txt file4.txt file5.txt文件,模拟三次提交
2.用git log命令查看刚刚提交的三次记录 有三次commit的记录
3.用reset撤销HEAD前两次commit操作,可以看见add file5和add file4的commit被撤销了,并且file4.txt file5.txt回到add之前的状态
4.继续分两次添加提交file4.txt和放file5.txt
5.用git revert撤销HEAD倒数第三次commit操作并且生成一次新的commit记录该操作
可以看见git log所示内容,git revert将add file1的commit记录撤销并且生成一次新的commit记录
6.用git push将本地仓库推送到远程仓库,这时提交的只有add file4和add file5的commit。可以看到服务器上的git仓库中增加了file4.txt和file5.txt
3.3 提交代码流程——解决冲突
1.将远程服务器和本地client端的file2.txt文件都修改制造冲突
2.将本地file2.txt文件push到远程服务器,发现冲突
3.用git pull拉取服务端仓库最新代码
git status 可以看到什么文件是有冲突的 both modified
<<<<< HEAD 到 =========代表的是本地最新的代码
========= 到 b76e5aab5746a05873a5167d3760a6415756ddaf代表的是远程仓库的版本
4.手动合并代码再次提交
3.4 比较安全的提交流程
git status #查看当前状态
git stash save "message" #将工作区域备份到缓存
git pull #拉取远程仓库到本地
git stash pop #将最新的一次工作区缓存复原到工作区
git status #查看是否有冲突
#手动解决冲突
git add
git commit
git push
1.同时修改远程仓库和本地的file3.txt制造冲突,本地同时修改file4.txt
2.git status 查看状态,发现有file3.txt和file4.txt被修改
3.git stash save保存当前工作空间到缓存,并且用git stash list查看当前被缓存的工作空间
4.git pull 拉取远程仓库代码
5.git stash pop还原缓存到工作环境,发现file3.txt需要 merge
6.git status 查看当前状态,可以发现file3.txt有冲突,file4.txt没有冲突
7.手动解决file3.txt的冲突
<<<<<<<<<<< Updated upstream 到 ======== 为远程仓库版本
========== 到 >>>>>>>>>>> Stashed changes为本地版本
8.git add、git commit、 git push提交到远程仓库
9.远程仓库文件被修改