Git撤销提交和修改相关操作
团队开发中经常遇到错误删除文件,错误提交等情况,那么使用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》
相关文章
- 【技术种草】cdn+轻量服务器+hugo=让博客“云原生”一下
- CLB运维&运营最佳实践 ---访问日志大洞察
- vnc方式登陆服务器
- 轻松学排序算法:眼睛直观感受几种常用排序算法
- 十二个经典的大数据项目
- 为什么使用 CDN 内容分发网络?
- 大数据——大数据默认端口号列表
- Weld 1.1.5.Final,JSR-299 的框架
- JavaFX 2012:彻底开源
- 提升as3程序性能的十大要点
- 通过凸面几何学进行独立于边际的在线多类学习
- 利用行动影响的规律性和部分已知的模型进行离线强化学习
- ModelLight:基于模型的交通信号控制的元强化学习
- 浅谈Visual Source Safe项目分支
- 基于先验知识的递归卡尔曼滤波的代理人联合状态和输入估计
- 结合网络结构和非线性恢复来提高声誉评估的性能
- 最佳实践丨云开发CloudBase多环境管理实践
- TimeVAE:用于生成多变量时间序列的变异自动编码器
- 具有线性阈值激活的神经网络:结构和算法
- 内网渗透之横向移动 -- 从域外向域内进行密码喷洒攻击