【问题标题】:GIT: Undoing Changes to a File or Folder by a Solo Developer? [duplicate]GIT:撤消单个开发人员对文件或文件夹的更改? [复制]
【发布时间】:2011-12-23 01:50:10
【问题描述】:

可能重复:
git undo changes in some files

我是一名独立开发人员(实际上是学生),我发现自己经常希望将文件回滚到之前的状态并撤消给程序带来错误的更改。大多数时候我希望对单个文件执行此操作,但在其他时间可能希望对整个文件夹执行此操作。从理论上讲,这可以扩展到恢复我已删除的文件。假设我有先前提交保存的文件和文件夹的先前状态。我不是想抹去之前的提交,只是为了回滚并记录我所做的事情。我是唯一处理这些文件的人,这不是从托管站点克隆的项目。

我知道如何在 Mercurial 中做最基础的事情,并发现 hg reverthg update # 在 mercurial 世界中做了我想做的事情,但还没有理解 git 是如何做到的。我可能希望最终在 Github 上主持一个项目,并且也有兴趣了解 git,因为它正在成为版本控制领域的主导者。我没有颠覆的背景,也不需要参考资料与颠覆有何不同。

我可能希望学习如何将我自己的项目分叉为几个版本,然后将它们合并,但我稍后会对此进行探索。我目前的问题适用于回滚对我自己硬盘上文件和文件夹的唯一副本的更改。

关于 git 的新手友好介绍有什么建议吗?无论是在线形式还是书籍形式都可以。请不要引导我使用 Scott Chacon 编写的任何资源;我发现他的风格和书籍/Peepcode PDF 非常令人困惑。我也有 Swicegood 的 Git 实用指南,但没有发现它很有帮助。弄清楚如何撤消 git 中的更改应该不难。到目前为止,我已经花了几个小时搜索。

请注意,我是一个有版本控制的新手,所以请温柔。

谢谢。

【问题讨论】:

    标签: git version-control


    【解决方案1】:

    您说不喜欢 Scott Chacon 的任何资源,但可能会有所帮助。

    我发现他关于“重置”命令的文章非常有用且易于理解。只有在它之后我才了解它的用法。链接:http://progit.org/2011/07/11/reset.html

    至少它对阅读此问题的其他人有用。

    【讨论】:

      【解决方案2】:

      如果您想恢复提交,请使用git revert hash_of_the_commit。这是被跟踪的 - 恢复本身就是一个新的提交。

      如果您只想恢复提交的一部分,您可以使用git diff

      $ git diff HEAD~3 file.txt
      # will display a diff of file.txt between the current head and three
      # revisions prior to that
      $ git diff HEAD~3 file.txt | patch -R
      $ git add file.txt
      $ git commit -m "super commit message"
      # will revert that file to what it was in HEAD~3
      

      【讨论】:

      • git reverse 不存在,是 git revert。
      【解决方案3】:

      您需要git checkout。它可以从指定的提交中检出单个文件或路径:

      git checkout commit_SHA1 -- your_file_name.here
      

      这可能会造成混淆,因为在大多数情况下git checkout 用于切换分支。

      你可以在这里使用任何方法来识别提交,我建议你做git log 或者使用一些 gui 并找到你的提交的 SHA1 id。

      【讨论】:

        【解决方案4】:

        首先执行git log 以查看您的历史记录,以便您可以决定要“回滚”到哪个版本。我们称之为A。现在,你有几个选择。

        1. 您可以从A 中剪下一个分支并在那里工作。这通常是正确的做法,因为通常情况下您不想完全恢复但只想尝试其他事情。这可以使用git checkout -b retry A 来完成(从提交A 开始创建并切换到一个名为retry 的分支)。现在您可以在那里工作,就好像自 A 以来的其余更改不存在一样。

        2. 假设您在master 分支上,您可以执行git reset --hard A 来丢弃自A 以来的所有提交并返回到该状态。这通常不是一个好主意,因为从那时起很难跟踪所有更改(如果您需要它们)。

        3. 一个更脑残的版本,简单地将单个文件的内容(比如foo.c)替换为提交时的内容A 就是说git cat-file -p A:foo.c > foo.c。然后你可以提交这个文件的“新版本”。这真的不是一个好主意,因为 git 不知道您正在回滚。它只是认为这是一个新的提交。

        我不确定您是否清楚所有这些,但如果没有,请询​​问,我会尽力澄清。

        【讨论】:

          猜你喜欢
          • 2013-03-11
          • 2013-08-27
          • 2016-02-16
          • 1970-01-01
          • 2012-05-11
          • 2010-10-30
          • 2015-08-12
          • 2015-08-30
          • 2020-05-17
          相关资源
          最近更新 更多