代码之家  ›  专栏  ›  技术社区  ›  Pradeep

Git选择性地从文件还原本地更改

  •  136
  • Pradeep  · 技术社区  · 16 年前

    在跟踪SVN回购的Git回购中,我对单个文件进行了多次编辑。

    现在我想恢复这些更改(如SVN REVERT),但只恢复文件的一部分。

    我希望能够查看文件上的差异,放弃(还原)我不想要的更改,并保留我想要的更改。

    这个

    git add -i 
    

    指挥部似乎可以选择这样做,但我现在还不想上演这个。

    6 回复  |  直到 9 年前
        1
  •  82
  •   Community CDub    8 年前

    你可以直接用 git checkout -p . 见 Daniel Stutzbach's answer 下面。


    旧答案(之前 checkout -p 介绍:

    你可以这样做:

    git add -i
    

    (选择要保留的大块)

    git commit -m "tmp"
    

    现在,您只有一个提交,其中只有您想要保留的更改,其余的都是未分页的。

    git reset --hard HEAD
    

    此时,未提交的更改已被丢弃,因此您有一个干净的工作目录,其中包含要保持提交状态的更改。

    git reset --mixed HEAD^
    

    这会删除最后一次提交(“tmp”),但会将修改保留在工作目录中,而不分页。

    编辑:替换 --soft 具有 --mixed 清理集结区。

        2
  •  296
  •   Daniel Stutzbach Edward Leno    15 年前

    我相信你能做到最简单的方法是:

    git checkout -p <optional filename(s)>
    

    从手册页:

       −p, −−patch
           Interactively select hunks in the difference between the <tree−ish>
           (or the index, if unspecified) and the working tree. The chosen
           hunks are then applied in reverse to the working tree (and if a
           <tree−ish> was specified, the index).
    
           This means that you can use git checkout −p to selectively discard
           edits from your current working tree.
    
        3
  •  3
  •   Greg Hewgill    16 年前

    你可以跑 git diff 在文件上,保存产生的差异,编辑它以删除您所做的更改。 想要保存,然后运行它 patch -R 以撤消其余的差异。

    git diff file.txt >patch.tmp
    # edit patch.tmp to remove the hunks you want to keep
    patch -R <patch.tmp
        4
  •  2
  •   Kent Fredric    16 年前

    看起来像你想要的

     git revert --no-commit $REVSISON 
    

    然后你可以使用

     git diff --cached
    

    在提交之前查看将要做什么更改(因为还原只是一个正向的提交,它复制了过去更改的反向)

    如果您使用的是纯Git存储库,那么根据您的目标,您可能会使用交互式Rebase( git rebase -i )回到你不喜欢的提交,并追溯地编辑提交,这样你不喜欢的更改就不会发生,但通常只有当你 知道 你再也不想看到它了。

        5
  •  1
  •   CB Bailey    16 年前

    重新阅读问题,听起来您希望恢复工作树中的更改,而不是以前提交的更改,但其他一些答案使我的阅读听起来可能是错误的。你能澄清一下吗?

    如果更改只是在工作副本中,那么最简单的方法是将要保留的更改分阶段进行:

    git add -i <file>
    

    然后,通过签出索引版本,放弃不希望保留的更改:

    git checkout -- <file>
    

    然后,如果您还不希望这些更改进行阶段化,则取消对它们的设置:

    git reset -- <file>
    

    此配方仅将所选更改还原到文件(或您指定的文件),不会创建任何需要还原的临时提交。

    如果要有选择地只应用在以前提交中所做的一些更改,则可以先将文件重置为以前提交的状态:

    git reset <commit_before_first_unwanted_change> -- <file>
    

    然后你可以按照之前的食谱 git add -i <file> 准备那些你想要保留的改变, git checkout -- <file> 丢弃不需要的更改和 git reset -- <file> 去“分解”变化。

        6
  •  0
  •   Abhishek Anand    9 年前

    当文件位于通过ssh终端访问的服务器上时,这里答案中描述的命令行选项非常方便。 但是,当文件在本地计算机上时,我更喜欢以下方式:

    在NetBeans编辑器中打开该文件(附带Git支持)。Netbeans在行号处加上红色/绿色/蓝色标记,分别指示删除/添加/修改内容的位置。

    右键单击这些标记,您可以选择撤消更改。 此外,您可以右键单击红色和蓝色标记以在弹出窗口中找到旧版本。