我的工作副本中经常会有一堆更改,我想提交给不同的新分支,例如:
o third
o | second
o | | first
| | |
\ | /
o base
我当时做的是:
Git不会让我检查基本分支而不会隐藏其余的更改,即使它不会(我认为不能)创建冲突。
有更简单的方法吗?
答案 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
分支上进行所有修改,而不仅仅是针对base
和second
的更改。对于每次提交,您需要放弃其他两个分支的更改,而不是逐步减少更改。