我有三个git分支:master,A和B.A基于master而B基于A.是否可以将B合并到master而不需要更改A?
答案 0 :(得分:2)
是的,您可以但不能重写git历史记录,这可能导致共享分支上的问题。因此,在此之前,请确保您不会阻止任何人工作,或最糟糕的删除它。要做到这一点,你必须使用git rebase
。
让我们说你的历史看起来像是
-- D branch-b
/
-- B -- C branch-a
/
A -- master
A,B,C和D代表您的提交。
你必须要做
git checkout branch-b #go on branch-b
git rebase -i HEAD~3
第二行有点解释:
git rebase
用于执行压缩,删除和重写提交等操作,以便在另一个目标提交时重新应用它们。
git rebase -i HEAD~3
将允许您将branch-b
的 HEAD 中的最后3次提交重写为之前的提交。您还可以使用目标提交的id哈希。
它将打开您配置的文本编辑器,它应该看起来像
pick aaaa111 Commit B message
pick aaaa222 Commit C message
pick aaaa333 Commit D message
将pick
字改为drop
或注释要删除的提交行,两者的工作方式相同。
#pick aaaa111 Commit B message # Comment the line will make rebase drop the commit
drop aaaa222 Commit C message # Replacing the pick by drop will also
pick aaaa333 Commit D message
保存并退出编辑器。您可能会遇到冲突以解决将文件置于所需状态的问题。您可以随时使用git rebase --abort
中止rebase操作。一旦解决了冲突,请执行
git add .
git rebase --continue
直到rebase完成。你的历史看起来像
----- D' branch-b
/
-- B -- C branch-a
/
A -- master
并非branch-b
上的提交被命名为D',因为rebase将使用更改而重新创建新提交而不使用第一个提交。
不要忘记,变基会使您的本地历史记录与远程记录不同步,并且当您必须共享该分支时可能会导致问题。
答案 1 :(得分:1)
" git rebase -i"使用手动提交删除工作,但有更简单的命令:
git rebase --onto <newbase> <upstream> <branch>
在您的情况下,您想要更改&#34; B&#34;,因此<branch>
= B,截止点<upstream>
= A,您的目标<newbase>
=掌握,所以你运行:
git rebase --onto master A B
之后,你的B分支只有在从A分叉后才会添加提交。
最后,您可以像往常一样将B合并到主人。
这是破坏性的,所以首先进行B备份是明智的:
git branch B-backup B
答案 2 :(得分:-1)
不,这是不可能的,因为当你从A中删除一个分支B时,它将拥有B中的所有提交和更改。