在正常的提交过程之外,我对Git相当缺乏经验。
现在我在主干道上,我有8个未分阶段的变化。我想要做的是用最后一次提交创建一个新分支(即没有8个未分阶段的更改),但是我希望保存这些未分阶段的更改,以便以后可以重新访问它们。
我该怎么做?
发布于 2018-10-14 18:26:17
如果您还没有提交这些新的更改,那么它们在分支中是不可见的,您可以直接从主分支中分离出来:
$ git branch newbranch或者,更明确地说:
$ git branch newbranch master发布于 2018-10-14 18:43:07
你可以简单的做
git checkout -b newbranch这将从master创建一个新分支,将您结帐到newbranch &您将进行非阶段性/未实现的更改。
如果您想在切换分支时保留更改,但不想提交,请使用git藏物
发布于 2019-01-29 03:58:50
正如其他人在答复和评论中提到的,至少有三种选择。它们之间有一定的重叠之处,而且各有优缺点:
创建新分支
分支几乎不需要花费任何费用,所以最简单的选择就是创建新的分支,而不需要对现有工作流进行真正的更改。如果你曾经怀疑过某一天你是否会想要某件东西,那么把它交给一个“正在进行中的工作”或“实验性”分支通常是无害的。
在您的特定场景中,我建议创建一个新分支来保存您的8个未分阶段的更改(让我们称它们为实验性的),并为您想要完成的其他工作创建另一个新的分支(让我们称之为一个新特性):
git checkout -b experimental/foo
git add --all
git commit -m 'Trying a new structure for Foo'
git checkout master
git checkout -b feature/bar如果您想将您的8项更改保存一段时间(或者您不确定多久会回到它们的位置),我会推荐这种方法。您甚至可以将实验分支推到您的上游存储库,以获得额外的冗余或在其上进行协作。
注释1最后两个命令可以组合成一行git checkout -b feature/bar master。它更聪明(而且可以说更明确),但我喜欢保持简单,在创建一个新分支之前总是先签出一个分支
Note 2“试验性/”和“特性/”名称空间是可选的,但我发现它们有助于我将来了解过去的想法。写一个良好提交消息,将来你会感谢过去的你:)
保存这些变化
另一种选择是暂时"藏物“更改,然后稍后将存储的更改重新应用到主分支(甚至其他分支)。
在您的情况下,我将保存这些更改(带有描述性消息),创建新的特性分支,然后,稍后您可以返回并将隐藏的更改应用于master:
git stash --include-untracked save 'Trying a new structure for Foo'
git checkout -b feature/bar
...
<make a few changes in feature/bar and commit or discard them>
...
git checkout master
git stash apply存储是有点复杂,但它可以相当灵活。创建分支的主要区别在于,存储仅限于本地,不能向上游推送。我只会推荐这个选项,如果你知道你需要额外的灵活性存储提供,或者如果藏将只是很短的寿命,基本上是一个快速剪切和粘贴。
默认情况下,备注1仅包括修改过的文件,如果您的更改包含任何新文件,则--include-untracked选项非常重要。您也可以使用--all (就像我们在上面git add中使用的那样),但是这也会存储被忽略的文件。
上面的Note 2假设您在此期间没有存储任何其他内容。使用git stash list来检查您从那以后就没有做过其他的藏品。一旦您完成了这个存储,您可以使用git stash drop删除它。git stash pop,让我们应用并放入一个命令。
如果您想了解更多的话,Note 3亚特兰蒂斯有一个关于如何使用git存储的非常有用的教程。
添加工作树(工作树)
另一个(稍微复杂一些)但更灵活的选项是添加一个工作树 (从现在开始,我只使用"worktree“来反映命令的名称)。您的工作树是存在未分阶段的更改的地方,在签出和在分支之间移动时与您一起移动。默认情况下,只有一个“主”工作树,但可以添加一个或多个“链接”工作树,以便同时签出多个分支,并在每个工作树中进行不同的未分阶段更改。
在上面的场景中,我可能会基于主目录创建一个新的工作树(和分支),然后切换到新的工作树目录。您的未分阶段的更改将保留在您的主工作树中,您只需将其更改回该目录即可返回工作:
git worktree add -b feature/bar ../app-name-bar
cd ../app-name-bar因为这允许您一次签出多个分支,所以它支持一些非常好的工作流。例如,您可以打开两个不同的终端和/或编辑器窗口/选项卡,并排查看两个分支。这是我会选择的任何解决方案,除了非常短期的需求,我可能会使用存储。
Note 1使用此选项,您还将创建一个新分支。这基本上是备选案文1的特例。
备注2您不能在两个不同的工作树中激活相同的分支。如果您出于某种原因需要复制分支或运行与--detach分离的第二个分支(更多信息请参见这篇文章 )
上面的命令将在与当前存储库相同的级别上创建一个新文件夹"app-name-bar“。因此,假设您的应用程序名为"todos",您将在您的文件系统中得到另一个名为"todos-bar“的"todos”副本(尽管您可以将它称为任意名称)。为了使事情组织起来,我更喜欢为我所有的工作树文件夹创建一个包含文件夹。下面的步骤显示了如何将当前存储库从todos移动到todos/main,以便在主工作树旁边有一个或多个附加的链接工作树:
# Do these steps just once
mv todos/ main/
mkdir todos
mv main todos/
cd todos/main
# Do these steps every time you want to add a worktree...
cd todos/main
git worktree add -b feature/bar ../bar
cd ../bar
# ...and you'll end up with this directory structure
# └─ todos/
# ├─ main/
# | └─ ...
# └─ bar/
# └─ ...https://stackoverflow.com/questions/52805783
复制相似问题