设为首页 收藏本站
查看: 1455|回复: 0

[经验分享] Git撤销提交和修改相关操作

[复制链接]

尚未签到

发表于 2018-1-16 08:52:32 | 显示全部楼层 |阅读模式
  团队开发中经常遇到错误删除文件,错误提交等情况,那么使用Git该如何正确的进行撤销和恢复呢?

一.增补提交
  git commit –C HEAD –a --amend
  -C表示复用指定提交的提交留言,这个例子中是HEAD,实际上可以指定其他有效的提交名称。
  如果参数是小写的-c,就会打开预先设置好的编辑器,以便在已有的提交留言基础上编辑修改。
  增补提交只能针对最后一个提交,如果想更正好几个提交之前的某个错误,则须使用git revert这个命令。

二.反转提交
  反转已经提交的改动,使用git revert命令,此命令通过在版本库中创建一个“反向的”新提交来抵消原来提交的改动。
  通常Git会立即提交反转结果,但是也可以通过参数-n告诉Git先不要提交,这用于反转多个提交非常有用,运行多个git revert –n命令,Git会暂存所有的变更,然后做一次性提交。
  做反转操作的时候必须提供提交名称,反转总是按照从新到旧点的倒序来操作的,即最后的提交最先反转,这样可以避免一些不必要的冲突。



三.复位
  命令git reset可以在复位版本库后,暂存工作目录树中因复位产生的与版本库的差异,以便提交。
  git reset --soft 该命令撤消上一个commit,但保留add的文件,使得Git暂存所有的因复位带来的差异,但不提交它。
  之后,用户可以修改这些内容再提交,或者干脆扔掉这些内容。
  选项--hard要小心使用,该选项会从版本库和工作目录树中同时删除提交,--hard就好像版本库中的删除键,并且不可恢复。
  git reset是以提交名称作为参数的,默认值是HEAD,可以用^和~作为提交名称的修饰符来指定某个版本。
  HEAD^是指把版本库复位到当前HEAD之前的那个节点上,把HEAD这个版本的修改扔到工作目录树中,
  540ecb7~3是指要复位到540ecb7之前的三个节点上,即把该提交和之前的两个提交(共三个提交)扔到工作目录树中。
  git reset --hard HEAD^ 强制复位前一个提交。
  git reset HEAD可以用来清除已经add到缓存区但是不想进一步提交的内容。
  另一种方式是用git rm --cached,选项--cached表明是清除缓存区,然后不动工作目录树。
  注意git checkout filename将会删除该文件中所有没有暂存和提交的改动,这个操作是不可逆的。

四.Git回复修改的场景

(1)如果不小心commit了一个不需要commit的文件,可以对其进行撤销
  先使用git log 查看 commit日志
  

commit 422bc088a7d6c5429f1d0760d008d86c505f4abe  
Author: test <test@gmail.com>
  
Date: Tue Sep 4 18:19:23 2015 +0800
  
注释-本次为错误提交
  
commit 8da0fd772c3acabd6e21e85287bdcfcfe8e74c85
  
Merge: 461ac36 0283074
  
Author: test <test@gmail.com>
  
Date: Tue Sep 4 18:16:09 2015 +0800
  

  找到需要回退的那次commit的 哈希值,使用下面的命令进行回退:
  git reset --hard commit_id
  注意--hard可以把已经add的文件也删掉,谨慎使用。

(2)git如何恢复本地删除的文件(还没执行 git commit)  
  直接从本地把文件checkout出来就可以了,用不着从远程服务器上pull下来,因为,所有的历史版本你的本地都有的。
  具体做法 git checkout file 同时恢复多个被删除的文件:
  git ls-files -d | xargs -i git checkout {}

(3)从Git仓库中恢复已删除的分支或丢失的commit
  在使用Git的过程中,有时可能会有一些误操作
  比如:执行checkout -f 或 reset -hard 或 branch -d删除一个分支
  结果造成本地(远程)的分支或某些commit丢失
  这时,我们可以通过reflog来进行恢复,前提是丢失的分支或commit信息没有被git gc清除
  一般情况下,gc对那些无用的object会保留很长时间后才清除的
  reflog是git提供的一个内部工具,用于记录对git仓库进行的各种操作
  可以使用git reflog show或git log -g命令来看到所有的操作日志
  恢复的过程很简单:
  1. 通过git log -g命令来找到我们需要恢复的信息对应的commitid,可以通过提交的时间和日期来辨别 <git reflog show>
  2. 通过git branch recover_branch commitid 来建立一个新的分支
  这样,我们就把丢失的东西给恢复到了recover_branch分支上了

参考
  《版本控制之道——使用Git》

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-435572-1-1.html 上篇帖子: git与svn对比 下篇帖子: Git版本恢复命令reset(转载)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表