首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在大师中创建新的分支,保持未分阶段的变化

在大师中创建新的分支,保持未分阶段的变化
EN

Stack Overflow用户
提问于 2018-10-14 18:23:32
回答 3查看 1.4K关注 0票数 2

在正常的提交过程之外,我对Git相当缺乏经验。

现在我在主干道上,我有8个未分阶段的变化。我想要做的是用最后一次提交创建一个新分支(即没有8个未分阶段的更改),但是我希望保存这些未分阶段的更改,以便以后可以重新访问它们。

我该怎么做?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-10-14 18:26:17

如果您还没有提交这些新的更改,那么它们在分支中是不可见的,您可以直接从主分支中分离出来:

代码语言:javascript
复制
$ git branch newbranch

或者,更明确地说:

代码语言:javascript
复制
$ git branch newbranch master
票数 1
EN

Stack Overflow用户

发布于 2018-10-14 18:43:07

你可以简单的做

代码语言:javascript
复制
git checkout -b newbranch

这将从master创建一个新分支,将您结帐到newbranch &您将进行非阶段性/未实现的更改。

如果您想在切换分支时保留更改,但不想提交,请使用git藏物

票数 1
EN

Stack Overflow用户

发布于 2019-01-29 03:58:50

正如其他人在答复和评论中提到的,至少有三种选择。它们之间有一定的重叠之处,而且各有优缺点:

  1. 创建新的分支es(复数)
  2. 保存这些变化
  3. 添加工作树(工作树)

创建新分支

分支几乎不需要花费任何费用,所以最简单的选择就是创建新的分支,而不需要对现有工作流进行真正的更改。如果你曾经怀疑过某一天你是否会想要某件东西,那么把它交给一个“正在进行中的工作”或“实验性”分支通常是无害的。

在您的特定场景中,我建议创建一个新分支来保存您的8个未分阶段的更改(让我们称它们为实验性的),并为您想要完成的其他工作创建另一个新的分支(让我们称之为一个新特性):

代码语言:javascript
复制
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:

代码语言:javascript
复制
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“来反映命令的名称)。您的工作树是存在未分阶段的更改的地方,在签出和在分支之间移动时与您一起移动。默认情况下,只有一个“主”工作树,但可以添加一个或多个“链接”工作树,以便同时签出多个分支,并在每个工作树中进行不同的未分阶段更改。

在上面的场景中,我可能会基于主目录创建一个新的工作树(和分支),然后切换到新的工作树目录。您的未分阶段的更改将保留在您的主工作树中,您只需将其更改回该目录即可返回工作:

代码语言:javascript
复制
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,以便在主工作树旁边有一个或多个附加的链接工作树:

代码语言:javascript
复制
# 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/
#     └─ ...
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52805783

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档