有没有办法在不进行存储的情况下将更改提交到多个分支?

时间:2013-11-12 16:34:25

标签: git

我的工作副本中经常会有一堆更改,我想提交给不同的新分支,例如:

    o   third
  o |   second
o | |   first
| | |
\ | /
  o     base

我当时做的是:

  • (在“基地”分支上)
  • 创建第一个分支
  • 阶段并提交部分更改
  • 隐藏其余的更改
  • 查看基本分支
  • 应用藏匿处
  • 创建第二个分支
  • 阶段并提交下一部分更改
  • 隐藏其余的更改
  • ...

Git不会让我检查基本分支而不会隐藏其余的更改,即使它不会(我认为不能)创建冲突。

有更简单的方法吗?

2 个答案:

答案 0 :(得分:3)

如果你写:

$ git checkout -b new_branch base

git将从基础开始创建一个新分支,并保留您的本地更改。它相当于

$ git stash
$ git branch new_branch base
$ git checkout new_branch 
$ git stash apply

因此,您的工作流程现在变为:

$ git checkout -b first master
$ git add -p; git commit         # commit changes for first branch
$ git checkout -b second master
$ git add -p; git commit         # commit changes for second branch
# etc

答案 1 :(得分:1)

在你的问题中,你写道你不希望合并冲突。使用git checkout的测试更为保守:当前和目标分支中的本地修改文件的原始(即已提交)是否完全不同?

运行以下内容后,创建first分支

$ git checkout -b first

$ edit ..

$ git add -p .

$ git commit -m first
 1 files changed, 1 insertions(+), 0 deletions(-)

您可能会看到与

类似的错误
$ git checkout base
error: Your local changes to the following files would be overwritten by
checkout:
        [files ..]
Please, commit your changes or stash them before you can switch branches.
Aborting

尝试切换回base

--merge的{​​{1}}选项适用于此类情况。

  

git checkout
  -m

     

切换分支时,如果对当前分支和要切换到的分支之间的一个或多个文件进行本地修改,则该命令拒绝切换分支以保留上下文中的修改。但是,使用此选项,当前分支,工作树内容和新分支之间的三向合并已完成,您将进入新分支。

     

当发生合并冲突时,冲突路径的索引条目将保持未合并状态,您需要解决冲突并使用--merge标记已解析的路径(如果合并应导致git add删除路径)。

运行git rm会让你回到你开始的地方 - 但可能比你想要的更远。您将在git checkout -m base分支上进行所有修改,而不仅仅是针对basesecond的更改。对于每次提交,您需要放弃其他两个分支的更改,而不是逐步减少更改。