保存我的工作以备后用并恢复为 HEAD 修订版

Save my work for later and revert to HEAD revision

我知道这可能是一个关于 SVN 的非常基本的问题,但是很难用很少的单词搜索它。

假设我正在处理一张工单 #2015,我必须在其中对文件 index.htmlapp.js 进行更改,但由于某种原因,这张工单现在受到阻碍并且我在等待一些东西,这样我就可以继续工作了。

所以为了不闲着,现在我将开始处理工单 #2047 比方说,这将包括对文件 blue-theme.cssindex.html.[=19= 的更改]

假设我正在使用 Subversion,这是我可以使用的最合适的操作,不会丢失我在票证 #2015 上的工作,但也不会将这些更改提交到文件 index.html如果他们属于票 #2047?

最简单的选择:创建一个新的工作副本。只需 svn checkout 将您的项目移至新位置,完整保留所有未提交工作的旧工作副本,并在新工作副本中执行新工作单。

您可以通过使用普通文件系统命令(不是 svn copy)将您的工作副本复制到新位置,然后在新位置使用 svn revert 放弃正在进行的工作来完成同样的事情新的工作副本。

高级选项:如果您不需要两个工作副本,您可以使用svn diff (or in TortoiseSVN, "view unified diff") to export a textual diff of all your modifications. Save that to a file, then revert all your changes. Later, when you are done with your second ticket and want to restore your changes from the first ticket, use the svn patch命令重新应用差异文件中的更改。

Subversion 的方式是为每个工单创建一个分支。一旦您确信您的工单已关闭,您将进行从 trunk 到工单分支的最终合并,对其进行测试,然后将分支合并回 trunk.

例子

假设您的存储库中有以下设置:

^/trunk
^/branches

trunk 成为您的 "stable" 存储库,同时您在分支中修复错误(使用 Subversion 的常见工作流模式)。那么,你题中的情况可以这样处理:

  1. 为 2015 年的工单创建分支:svn cp path/to/repo/trunk path/to/repo/branches/ticket-2015
  2. 查看售票处:svn co path/to/repo/branches/ticket-2015
  3. 在你的工作副本中处理 issue 2015 ticket-2015 并按你的意愿提交。
  4. 通过为它创建一个新分支来开始处理工单 2047:svn cp path/to/repo/trunk path/to/repo/branches/ticket-2047; svn co path/to/repo/branches/ticket-2047
  5. 在某些时候,您对 2047 年的工作感到满意,并决定重新融入:
    • 您从 trunk 进行最终合并:cd ticket-2047; svn merge ^/trunk; svn commit
    • 您检查是否一切正常
    • 您通过签出 trunk 的工作副本、合并您的分支并提交它来重新集成:svn co path/to/repo/trunk; cd trunk; svn merge ^/branches/ticket-2047; svn commit
  6. 一旦你的分支被重新整合,你可以将它从 repo 中删除(别担心,历史当然会被保留,什么都不会 真的 从 svn 中删除) : svn rm path/to/repo/branches/ticket-2047
  7. 您继续对 2015 年票证使用相同的方法

采用这种方法你有一些优势:

  • 在一个问题上与多人一起工作很容易
  • 自动测试很容易(如果你有一个系统设置的话)
  • none 您对任一票的更改丢失,并且
  • 两张门票之间不会有任何混淆