创建新分支,以保留Master中未进行的更改

时间:2018-10-14 18:23:32

标签: git branch git-branch

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

现在我在master分支上,并且有8个未分级的更改。我想做的是使用上一次提交创建一个新分支(即不进行8个未暂存的更改),但是我想保留未暂存的更改,以便以后可以重新访问它们。

我该怎么做?

3 个答案:

答案 0 :(得分:1)

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

$ git branch newbranch

或更明确地说:

$ git branch newbranch master

答案 1 :(得分:1)

您只需完成

git checkout -b newbranch

这将从master创建一个新分支,将您签到newbranch,您将按原样进行未登台/未提交的更改。

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

答案 2 :(得分:0)

正如其他人在答案和评论中提到的那样,至少有三个选择。它们之间有很多重叠,并且各有利弊:

  1. 创建新分支 es (多个)
  2. 隐藏更改
  3. 添加工作树(工作树)

创建新分支

分支几乎不花费任何费用,因此最简单的选择是创建新分支,而对您现有的工作流程没有真正的改变。如果您不确定是否有朝一日想要某样东西,通常将其提交到“进行中的”或“实验性”分支通常不会有任何伤害。

在您的特定情况下,我建议创建一个新分支以保存您的8个未分级的更改(我们称它们为实验性的),并从master另一个新分支中保存您想要做的其他工作(我们称之为新功能):< / p>

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。它比较聪明(而且可以说更明确),但我想保持简单,总是在从中创建新分支之前先签出一个分支

注释2 “ experimental /”和“ feature /”命名空间是可选的,但我发现它们对将来帮助我了解过去的想法很有帮助。并写一个good commit message,将来您会感谢过去的您:)

隐藏更改

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

在您的情况下,我将存储更改(带有描述性消息),创建新的功能分支,然后稍后,您可以返回并将隐藏的更改应用于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中使用的一样),但这也会隐藏被忽略的文件。

注释2 以上内容假设您在此期间未隐藏任何其他内容。使用git stash list检查自此以来您没有进行其他隐藏。完成此存储后,您可以使用git stash drop删除它。 git stash pop让您应用并添加一个命令。

注释3 如果您想了解更多信息,Atlassian有pretty useful tutorial on how to use git stash

添加工作树(工作树)

另一个(稍微)更复杂但灵活的选项是添加一个working tree(从现在开始,我将只使用“ worktree”来反映命令的名称)。您的工作树中存在未分级的更改,在您结帐并在分支之间移动时会与您一起移动。默认情况下,只有一个“主”工作树,但是您可以添加一个或多个“链接”工作树,以使您可以同时签出多个分支,并且每个工作树中都有不同的未暂存更改。

在上述情况下,我可能会基于master创建一个新的工作树(和分支),然后切换到新的工作树目录。您未分阶段进行的更改将保留在主工作树中,您只需简单地回到该目录即可回到工作状态:

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

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

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

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

注释3 上面的命令将在与当前存储库相同的级别上创建一个新的文件夹“ app-name-bar”。因此,假设您的应用程序名为“ todos”,您最终会在文件系统中得到另一个“ todos”副本,称为“ todos-bar”(尽管您可以随意命名)。为了使事情井井有条,我更喜欢为所有工作树文件夹创建一个包含文件夹。以下步骤显示了如何将当前存储库从todo移到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/
#     └─ ...