代码之家  ›  专栏  ›  技术社区  ›  Simon

创建新的分支,在主控形状中保留未暂存的更改

  •  2
  • Simon  · 技术社区  · 6 年前

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

    现在我在主分支上,我有8个未暂存的更改。我想做的是用最后一次提交创建一个新分支(即没有8个未暂存的更改),但是我想保存未暂存的更改,以便以后可以重新访问它们。

    3 回复  |  直到 6 年前
        1
  •  1
  •   alfunx Kevin Islas    6 年前

    如果您尚未提交这些新更改,则它们对分支是不可见的,您可以直接从master分支:

    $ git branch newbranch
    

    $ git branch newbranch master
    
        2
  •  1
  •   Dhirendra    6 年前

    你可以简单的做

    git checkout -b newbranch
    

    这将从中创建一个新分支 master newbranch &您将拥有未暂存/未限制的更改。

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

        3
  •  0
  •   Matthew    6 年前

    正如其他人在答复和评论中提到的那样,至少有三种选择。它们之间有相当一部分的重叠,每个都有优点和缺点:

    1. (复数)
    2. 把零钱藏起来
    3. 添加工作树(worktree)

    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 . 它更聪明(而且可以说更明确),但我喜欢保持简单,总是先签出一个分支,然后再从中创建一个新分支

    “实验/”和“特性/”名称空间是可选的,但我发现它们有助于未来的我了解过去的我在想什么。写一个 good commit message ,未来你会感谢过去的你:)

    另一个选择是“暂时” stash “更改,然后将隐藏的更改重新应用到主分支(甚至其他分支)。

    在您的情况下,我将保存更改(带有描述性消息),创建新的功能分支,然后稍后您可以回来将保存的更改应用于主功能:

    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 但这也会隐藏被忽略的文件。

    以上假设你在此期间没有藏其他东西。使用 git stash list git stash drop 删除它。 git stash pop 让我们应用一个命令。

    大西洋有一个 pretty useful tutorial on how to use git stash 如果你想了解更多。

    另一个(稍微)复杂但灵活的选择是添加 working tree

    在上面的场景中,我可能会基于master创建一个新的worktree(和分支),然后切换到新的worktree目录。您的未暂存更改将保留在主工作树中,您只需更改回该目录即可继续使用这些更改:

    git worktree add -b feature/bar ../app-name-bar
    cd ../app-name-bar
    

    因为这允许您一次签出多个分支,所以它启用了一些非常好的工作流。例如,可以打开两个不同的终端和/或编辑器窗口/选项卡,并排查看两个分支。这是解决方案,我会选择任何除了非常短期的需要,我可能会使用藏。

    使用此选项还可以创建一个新分支。这基本上是选项1的特例。

    附注2 不能在两个不同的工作树中激活同一个分支。如果出于某种原因需要,则需要复制分支或运行与分离的第二个分支 --detach (见 this article 更多信息)

    以上命令将在当前存储库的同一级别创建一个新文件夹“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/
    #     └─ ...