【问题标题】:What is the equivalent of TFVC "Rollback" in Git?Git中TFVC“回滚”的等价物是什么?
【发布时间】:2019-04-10 20:25:20
【问题描述】:

如果我使用 Team Foundation Source C控制,我可以轻松回滚到旧的变更集。

假设我有一个包含 4 个版本的文件,每个版本都有一个变更集:

  • 变更集 a126 - 版本 1。
  • 变更集 b347 - 版本 2。
  • 变更集 c560 - 版本 3。
  • 变更集 d912 - 版本 4。

现在我在第 3 版和第 4 版中发现了很多错误,我想尽快回到第 2 版。

在 Visual Studio 中,我可以单击文件上的“查看历史记录”,单击 Changeset b347(“版本 2”),然后单击“回滚”。

现在我有一个新的变更集,其中包含版本 2 中的文件,我可以签入它(我的历史记录中仍然有版本 3/4,所以我也可以在某个时候返回它们)。

在 Git 中,我知道有 revertreset(硬、软),但我不知道我需要做什么才能达到相同的结果。

那么在 Git 中回滚到旧版本的最佳方法是什么(最好通过 Visual Studio)?

【问题讨论】:

    标签: git visual-studio tfvc


    【解决方案1】:

    假设你有4个提交A-B-C-D,文件foo.txt在每一个都被修改,CD的代码有foo.txt引入的bug。

    1.其他文件可能在C和D中改变。如果只想将foo.txt回滚到B的版本:

    git checkout B -- foo.txt
    

    如果你想提交回滚,

    git commit
    

    历史记录将是A-B-C-D-R1

    2.如果要回滚C和D的所有更改(包括其他文件的更改,如果有的话),并且CD已被推送到远程存储库:

    git revert D C
    

    历史记录将是A-B-C-D-R2-R3

    3.如果你想回滚C和D的所有更改,并且CD还没有被推送到远程仓库:

    git reset B --hard
    

    历史记录将是A-B。您也可以将此解决方案用于案例 2,但您需要强制推送分支以覆盖远程存储库中的分支。如果其他贡献者获取了旧历史记录,您需要告诉他们获取新历史记录。

    【讨论】:

    • 很好的答案!谢谢你!我不认为我可以在一次还原中还原 VS 中的 2 个提交,但我可以在命令行中进行:)
    • @ShaykiAbramczyk 这里git revert B..D 也有效。 B..D 表示CD,Git 会以相反的顺序正确还原它们。当您想要恢复一组连续提交时,这很方便。此外,如果您不想编辑默认恢复消息,选项--no-edit 会使过程更加顺畅。
    【解决方案2】:
    git reset --hard b347
    git push -f origin master
    

    这将完全删除c560d912,但之后您需要强制推送。

    What's the difference between Git Revert, Checkout and Reset?

    要撤消创建新提交的更改:

    git revert d912 c560
    

    【讨论】:

    • 但它会删除版本 3/4 提交,我不想要它。在 TFVC 中,回滚不是删除 chengesets,而是在版本 2 中添加一个新的变更集。
    • 谢谢!我接受了@ElpieKay 的回答,因为它更详细。
    【解决方案3】:

    不知道TFVC里面是什么check-in,但是如果你只是想查看v2文件,可以git checkout b347 -- thefilenameyouwant

    【讨论】:

    • 签入 = 提交和推送。我不想只查看我想查看 v2 文件,他们提交并推送,以将我的 repo 更新回 v2。
    • 您是否希望您对 v2 所做的更改也包含在 v3 和 v4 中?
    • 没有。我希望我的仓库返回 v2(但不从提交历史记录中删除 v3 和 v4)。
    • 您还想要 v2 的其他文件还是应该保留 v4?
    • 我希望所有文件都回到 v2
    【解决方案4】:

    要继续处理工作副本中存储库的 v2 状态,您可以这样做

    # get uncommitted changes out of the way
    git stash
    
    # recreate v2 in the working copy
    git checkout commit-hash-or-tag-of-v2 
    
    # create new branch based on v2
    git checkout -b branchname-for-new-branch
    

    【讨论】:

      【解决方案5】:

      (1) 如何回滚和“丢失”版本 3 和 4:

      很简单:

      git reset --hard b347
      

      说明:

      • 回到版本 2。
      • 您将“丢失”版本 3 和 4。
      • 如果您仍想获得版本 3 和 4,那么这些提交在您的 reflog 中仍然可用一段时间,具体取决于您的设置(默认时间段为 90 天,从内存中算起)。

      或 (2) 创建一个新分支(保留版本 3 和 4):

      • 您可以简单地在版本 2 中创建一个新分支。

        git checkout b347

        git checkout -b redo-work-from-version-2

      说明:

      • 您将回到 b347,处于无头状态。暂时忽略这一点。
      • 我们创建了一个名为redo-work-from-version-2 的新分支。
      • 版本 3 和版本 4 仍将存在并可用,但它们将位于不同的分支上。

      【讨论】:

        猜你喜欢
        • 2017-01-30
        • 1970-01-01
        • 2021-08-26
        • 1970-01-01
        • 2017-05-30
        • 1970-01-01
        • 1970-01-01
        • 2017-11-13
        • 2020-05-16
        相关资源
        最近更新 更多