git代码库回滚

by Web全栈工程师 on 2016 年 06 月 07 日

git代码库回滚: 指的是将代码库某分支退回到以前的某个commit id

【本地代码库回滚】:

git reset –hard commit-id :回滚到commit-id,讲commit-id之后提交的commit都去除

git reset –hard HEAD~3:将最近3次的提交回滚

【远程代码库回滚】:

这个是重点要说的内容,过程比本地回滚要复杂

应用场景:自动部署系统发布后发现问题,需要回滚到某一个commit,再重新发布

原理:先将本地分支退回到某个commit,删除远程分支,再重新push本地分支

操作步骤:

1、git checkout the_branch

2、git pull

3、git branch the_branch_backup //备份一下这个分支当前的情况

4、git reset –hard the_commit_id //把the_branch本地回滚到the_commit_id

5、git push origin :the_branch //删除远程 the_branch

6、git push origin the_branch //用回滚后的本地分支重新建立远程分支

7、git push origin :the_branch_backup //如果前面都成功了,删除这个备份分支

如果使用了gerrit做远程代码中心库和code review平台,需要确保操作git的用户具备分支的push权限,并且选择了 Force Push选项(在push权限设置里有这个选项)

另外,gerrit中心库是个bare库,将HEAD默认指向了master,因此master分支是不能进行删除操作的,最好不要选择删除master分支的策略,换用其他分支。如果一定要这样做,可以考虑到gerrit服务器上修改HEAD指针。。。不建议这样搞

参考资料:https://review.typo3.org/Documentation/access-control.html#category_push

git reset –hard,是根据HEAD内容,将工作区重置,也就是将所有的修改而没有commit的内容舍弃。

1、–hard参数将重置index和workspace,
2、HEAD是一个指针,指向最近的提交,git reset –hard就相当于git reset –hard HEAD,表示用最近的提交重置index和workspace。
3、因为HEAD本来就指向最近的commit,所以执行git reset –hard后HEAD内容并没有变化。
4、它所差生的影响就包括引用
根据HEAD内容,将工作区重置,也就是将所有的修改而没有commit的内容舍弃。

高级用法:git reset –hard 之后的回滚

# 显示之前所有git操作记录
git reflog
git reset --hard 

# 合并指定commit
git cherry-pick 

改写提交

  1. 修改最近提交,指定git commit –amend选项执行提交的话,可以修改同一个分支最近的提交内容和注解。
  2. 取消过去的提交:git revert可以取消指定的提交内容。使用后面要提到的rebase -i或reset也可以删除提交。但是,不能随便删除已经发布的提交,这时需要通过revert创建要否定的提交。
  3. 遗弃提交:reset可以遗弃不再使用的提交。执行遗弃时,需要根据影响的范围而指定不同的模式,可以指定是否复原索引或工作树的内容。
  4. 提取提交:git cherry-pick,您可以从其他分支复制指定的提交,然后导入到现在的分支
  5. 改写提交的历史记录: git rebase指定i选项,您可以改写、替换、删除或合并提交。
  6. 汇合分支上的提交,然后一同合并到分支:merge的特殊选项:squash,用这个选项指定分支的合并,就可以把所有汇合的提交添加到分支上。

扩展阅读练习:
https://backlog.com/git-tutorial/cn/stepup/stepup7_1.html

原创文章,转载请注明:转载自Web开发笔记 | git代码库回滚

本文链接地址:https://www.magentonotes.com/git-reset-code-workplace.html

Comments on this entry are closed.

Previous post:

Next post: