如何在Xcode中恢复先前的代码版本

17

我正在Xcode中开发一个Objective C项目,需要将其还原到之前在源代码控制中提交的某个版本。该如何操作?我可以找到有关提交和推送的信息,但没有关于恢复旧版本的信息。


什么源代码控制系统有什么接口? - zaph
1
我正在使用Xcode内置的git支持。我偶尔会推送到github,但我也有本地提交。如果这没有回答你的问题,那是因为我对它的工作原理了解不够。 - Victor Engel
我使用第三方应用程序:Tower,以弥补Xcode Git支持不足的情况。Tower - 提供30天免费试用。 - zaph
1
哦,天哪!我一直在拔头发,试图弄清楚为什么代码在iPhone模拟器中无法工作。我开启这个线程的目的是为了恢复到一个已知的可以运行的点,以便尝试回溯。但这也没有解决问题。事实证明,问题出在模拟器上。退出模拟器并再次运行我的项目后,问题消失了。教训是:如果模拟器中有问题,就将其删除并重试。 - Victor Engel
1
如果你愿意,你也可以看一下这篇文章"Revert to the desired commit (Xcode)"。希望它有所帮助... - angelos.p
考虑到您可能已经学习了源代码控制的最基本内容,这非常值得。想象一下,有人告诉您,一个用户发现了一个在您一年前发布的版本中不存在的错误。而且在过去一年中,有人引入了该错误。您的工作是找出哪个更改引入了该错误。 - gnasher729
7个回答

30

在Xcode中无法一次性还原整个项目,但你可以通过终端来实现。只需进入项目文件夹并输入git log以查找所需的哈希值,然后输入git checkout [hash]即可。


完成后,我在哪里找到恢复的版本?抱歉,我还在学习git的使用方法。 - Ethan Fischer
1
在Git中,“checkout”将您移动到版本历史的不同位置,或者是不同的分支。当使用“checkout”时,您仍然在本地工作并处于相同的目录中。这并不会创建任何文件的新副本或从服务器上获取任何内容。这可能会引起混淆,特别是因为在Xcode(7.3)中,“Checkout”一词被用于“源代码控制”菜单,以指代在Git中的“Clone”,而实际上它确实会从服务器上拉取现有文件并将它们放入本地目录中。 - Daniel Jonce Evans
你好,我尝试了这个操作,但是出现了以下错误信息:错误:您对以下文件的本地更改将被检出覆盖: DropDown Menu 3.5 / DropDown Menu Storyboard / DropDown Menu Storyboard-Prefix.pch 请在切换分支之前提交更改或将其隐藏。 操作已中止。 - dancingbush
我将已接受的答案更改为此答案,因为1)先前接受的答案中的链接不再起作用,并且2)现在使用git已有几年了,我知道它是如何工作的。我以前寻找的东西与git的工作方式不符。我认为正确的答案应该是mu。在git环境中,恢复并不是您想要做的事情。从旧提交分支是您需要的。 - Victor Engel

13

引用自苹果的文档,链接为:https://developer.apple.com/library/ios/documentation/ToolsLanguages/Conceptual/Xcode_Overview/Save_and_Revert_Changes_to_Files/ManageChanges.html

比较文件版本以还原代码行 选择“视图” > “版本编辑器” > “显示比较视图”,可以比较储存在仓库中的文件版本。使用跳转条基于它们在仓库中的位置选择文件版本。每个跳转条控制其上方内容面板的选择。要显示一个版本,请浏览层次结构找到它,然后单击选择它。阴影区域表示不同版本之间的更改。 您可以使用版本时间轴基于其时间顺序选择文件版本。单击中间列中的时间轴查看器图标(../art/TimeLineIcon_2x.png)以显示两个编辑面板之间的时间轴。通过时间轴上下移动指针以浏览可用版本。找到所需版本后,单击左侧或右侧的指示三角形以在相应的编辑器面板中显示该版本。 您可以在版本编辑器中编辑当前的工作副本文件。如果您想还原版本之间的更改,则可以从旧版本中复制代码并粘贴到当前版本中。

最后一行揭示了关键:复制和粘贴。


我不再需要这个了,但是因为我相信它回答了我的问题,所以我正在检查它。谢谢。 - Victor Engel
感谢您回应这个看似无望的问题。我自己也在为版本控制问题苦苦挣扎,发现您的问题是最相关的。-Xin - Hackless
3
哇。苹果肯定应该使这更直观易懂。如果 Xcode 可以在某个地方保存您的代码,那么您期望能够取回它,对吧?或者只有我这样想?干得好,苹果。我将提交一个功能请求。 - erdekhayser
3
我不认为这是一个解决方案,因为你不能以合理的方式对所有文件都这样做。那 storyboard 和其他没有代码的文件怎么办呢?我认为更明智的做法是说:不,你不能那样做,终端是唯一可以访问所有 git 命���的地方,但是你可以回到单个文件中复制并粘贴更改。 - 3366784
1
@Hackless,链接已经失效了...但是感谢您提供的信息 :) - bearacuda13
显示剩余2条评论

11

在 Xcode 9 中,您可以检出任何先前的版本。

  1. 点击左侧导航栏中的源代码控制图标,或转到视图->导航器->显示源代码控制导航器。
  2. 将显示所选分支的所有提交的列表。
  3. 右键单击所需提交并选择“检出“commitID””

在某些情况下,直接从那里创建一个分支可能更有用。


以上解决方案完美运行 - 只需先保存/放弃更改。谢谢 Andy。 - Jeremy Andrews
这将使我们处于分离的HEAD状态。您只能通过控制台上的“git checkout master”、“git merge commitID”来修复它。 - Ikem Krueger

4

这里有一种在Xcode 8中的可视化方法:

enter image description here


丢弃所有更改会毁掉你的项目吗? - bearacuda13
@bearacuda13 不,它会将其还原到上一个提交。如果这是您的第一个提交,则会成为一个新项目。 - MiladiuM
这只是丢弃自上次提交以来所做的所有更改并永久删除它们。您不能像这样跳回历史记录中的任意提交。 - Andy

2
如果您想要在单独的文件夹中获取任何已提交版本的整个项目提取,可以尝试使用此shell脚本:
#!/bin/sh
#
#  restores an old version of xcodeproject from git repository
#  into folder  $HOME/gitcopy
#  current directory must be the rootdir of the project
#  Xcode should not access the same project at this time
#
set -x
PROJECT_ROOT=.
COPY_DEST=$HOME/gitcopy
if [ -e *.xcodeproj ]
then
    git log
    echo "Which version ?"
    read x
    git checkout $x
    git checkout -b copyVersion
    cp -R $PROJECT_ROOT $COPY_DEST
    git stash
    git checkout master;
else
    echo "No xcode project root folder";
fi 

1
我正在处理一个Xcode 9.2项目,其中包含几个依赖项和其他文件。在清理项目时,我不小心将其删除,无法弄清如何使其运行,直到我找到了这个解决方案。 首先在顶部菜单栏中转到源代码管理并放弃所有更改。然后进入源代码控制管理器(位于项目导航器右侧的第二个),选择所需的提交,右键单击并选择已输入所需提交编号的Checkout选项,就可以完美地解决问题。 步骤1 - 放弃所有更改 步骤2 - 选择要返回的提交 步骤3 - 右键单击并选择Checkout

0

我来晚了,但我有这个问题,幸运的是,我的以前版本处于"被隐藏的更改"状态。

在文件否定的左侧,选择第二个选项,你应该会看到一个名为"被隐藏的更改"的文件夹,在它下面将显示所有可用的以前版本。只需右键单击它,然后点击"应用被隐藏的更改"

showcase image


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接