git:复制一个版本进行游戏

use*_*428 5 git production-environment git-clone

在开发应用程序的过程中,我希望在某个方面能够单独复制我的工作,以便进行多项更改.这些变化并不意味着承诺!它只是在玩耍,尝试各种可能性.

这样做的" 最佳 "方式是什么?我找到了以下可能性,但是想得到那些对我有更多git经验的人的建议:

  1. 我可以使用git clone将存储库的副本放到不同的目录中,并使用它来玩.
  2. 我可以cp -r把我当前的git工作目录改为新的.

在情况(1)中,git知道克隆,rebase如果我真的想要,我可以稍后,但我不太可能做到这一点.

在这种情况下,有什么我应该知道的,这使解决方案(1)或(2)更好吗?或者有更好的方法吗?

jub*_*0bs 3

长话短说

使用克隆/副本

  • 优点:主存储库及其克隆/副本是完整的孤岛
  • 缺点:空间效率低下

使用分支

  • 优点:空间效率(Git 分支很便宜)
  • 缺点:如果需要大量存储,工作流程相对笨重

细节

你写

我想在某一时刻拥有一份我的作品的单独副本,以便尝试一些更改。[...] 做这个的最好方式是什么?

您还在评论中写道,您可能会在原始作品及其“副本”之间来回切换,而不会对后者进行任何更改。

在这里,您有不同的可能方法;让我们先回顾一下您的两个建议,然后探讨第三种可能性。为了修正想法,我假设您的存储库位于名为 的目录中main

1 - 用于git clone将存储库的副本复制到不同的目录中,并使用它来进行操作。

正如您所建议的,您可以将 的克隆生成main到名为 的目录中exp

git clone <path-to-main> <path-to-exp>
Run Code Online (Sandbox Code Playgroud)

并进行你的疯狂实验exp。该main存储库将是exp“上游”,即在名称exp下列main为其遥控器之一origin。因此,如果您在 中进行了更多提交main并希望了解exp最新情况main,则可以从 获取mainexp然后在后者中合并或变基。

这种方法的主要问题是空间效率低下:因为克隆携带了原始存储库的整个历史记录,所以您将在磁盘上获得大量重复文件。这可能是也可能不是问题,具体取决于原始存储库的大小,但这是需要考虑的事情。

2 - 只是cp -r我当前的 git 工作目录到新的工作目录

这本质上就像克隆main,但是,除非您手动添加main为 的远程exp,否则您将无法从main到获取exp。与第一种方法相比,我认为这种方法没有任何优势(也许,它不涉及意外将东西从expto推送的风险main)。

3 - 直接在原始存储库中创建一个新分支并在其中进行实验

exp第三种方法是直接您的存储库中创建一个新分支(我们称之为) main

git branch exp
Run Code Online (Sandbox Code Playgroud)

一探究竟,

git checkout exp
Run Code Online (Sandbox Code Playgroud)

并在那里进行你的实验。与其他两种方法相比,这种方法的主要优点是空间效率:Git 分支很便宜,因为创建新分支不涉及任何文件复制。

但是,如果您在签出时进行更改exp但没有提交它们,Git 会认为您的工作目录“不干净”,并且不允许您切换回master分支,直到您纠正这种情况。清理存储库的一种可能性是通过运行来存储未提交的更改

# while on exp, if there are uncommitted changes
git stash save
Run Code Online (Sandbox Code Playgroud)

然后,您可以切换回master,进行一些更改,提交它们,切换回exp,并通过运行检索隐藏的更改

git stash pop
Run Code Online (Sandbox Code Playgroud)

但是,如果涉及大量存储(save和),您可能会发现此工作流程过于乏味且难以操作......pop