zoukankan      html  css  js  c++  java
  • 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》

  • 相关阅读:
    Openstack API 开发 快速入门
    virtualBox虚拟机到vmware虚拟机转换
    使用Blogilo 发布博客到cnblogs
    Openstack Troubleshooting
    hdoj 1051 Wooden Sticks(上升子序列个数问题)
    sdut 2430 pillars (dp)
    hdoj 1058 Humble Numbers(dp)
    uva 10815 Andy's First Dictionary(快排、字符串)
    sdut 2317 Homogeneous squares
    hdoj 1025 Constructing Roads In JGShining's Kingdom(最长上升子序列+二分)
  • 原文地址:https://www.cnblogs.com/binyue/p/5148928.html
Copyright © 2011-2022 走看看