总结
总结1:回滚
查看对应版本的commit_id:
git log
或git reflog
进行回退,commit_id可以是当前版本之后的id:
git reset --hard commit_id
远程同步,远程回退
git push -f
总结2:分布式协作
分以下两类
1,git pull —- working…. —– git add — git commit —- git pull —-git push 直接合并
2. 或者将git pull换成“git fetch —– git diff master origin/master—-git merge ”验证并合并
实践探索过程
场景1:灵活回滚
条件:
提交三个版本,第二个版本在第一版本之上新建函数
第三个版本在第二个版本之上新建文件
目标:
1.是否可以随意切换版本?
2.切换到版本二后新建了一个版本四,是否可以回到版本三?
过程:
1.进行三次提交后,git log显示如下
git顺序提交,git reflog显示如下
2.git回退到version 1
git reset –hard HEAD^ 回到上个版本,HEAD~100表示回退到前一百个版本。最好将HEAD换成特定版本的ID
回退原理是HEAD指针的变化,改变指针指向即可
git reset --hard 420f
此时git reflog显示如下:
可以查看到本地文件已经成功回退。
3.但是如何让远程也成功呢?
git push -f
4.编辑第四个版本
git diff a.py
红色表示之前的版本,绿色表示新版本。可以这样理解,将本地(旧版)的-行删掉,新增+指示的行
结果:仍然可以回退到版本三
场景2:分布式协作
条件:
两个人都往版本库中提交代码,比如A提交之后继续研发,此刻B提交了。A研发好之后,又进行提交,此刻发生了什么?
过程:
1. B clone仓库
git clone git@github.com:windycon/rollback.git
不需要新建文件夹,它会以git上项目名建立目录,进入目录后,会有.git文件,同之前,完全可用
2. 然后编辑b.py新增函数work_info,正常提交,备注信息为“rollback—add function work_info”
3. 此时回到A,新增文件c.py,进行提交,备注信息为”myproject—new file c.py“
执行git push时显示如下:
按照提示执行git pull
git pull 弹出编辑框,提示如下,可使用vim编辑命令,编辑信息为“after I new file c.py , then I find it can’t be pushed”
4. 保存后,git log显示如下
此时A的本地文件也变化了,接着git push可正常进行
这里应该先确认本地和远程的差异,然后进行merge。回去重复实验
5. A回退到version3—4a32 , 不使用git push -f
让远程仓库同B一致,以进行实验:A在git pull前查看变化,以确认是否merge。
B执行git push -f
6. 在A上新建文件c.py ,执行add和commit,不然diff无法显示差异
git fetch origin 必须执行,不然没有差异
7. git diff master origin/master
diff显示的结果是对第一个文件进行操作
以上说明本地b.py文件删除红色部分,新增绿色部分可一致。
删掉c.py文件,c.py文件的内容为红色部分。
git log master origin/master 查看提交差异
8.执行git merge master origin/master 也会弹出vim编辑框
此后查看git diff master origin/master如下
最后git push即可完成