【问题标题】:git remove commits in a new branch which was accidently created from branch other than mastergit remove 在一个新分支中的提交,该分支是从 master 以外的分支意外创建的
【发布时间】:2020-01-21 03:24:52
【问题描述】:
我从 master 创建了一个新分支并将其命名为“LoginFeature”。我完成了这个分支的所有工作,然后把它推回了 LoginFeature。然后我从'LoginFeature'创建了一个新的分支'Dashboard'并将Master合并到'Dashboard'中。我在“仪表板”中添加了一些代码文件并将它们推送到服务器上的“仪表板”分支。
第二天,我意识到我应该从“Master”而不是“LoginFeature”创建“Dashboard”。
我该如何解决这个问题?我可以从“仪表板”分支中删除“登录功能”分支的所有提交吗?或者我应该从本地和远程删除“仪表板”分支并从主服务器重新创建“仪表板”分支并将我的新文件复制粘贴到这个分支?
【问题讨论】:
标签:
git
git-branch
branching-and-merging
【解决方案1】:
- 删除
Dashboard 分支并从Master 分支重新创建它。再次添加所有文件并推送它们。
- 您可以更改分支
Dashboard 的父级。由于提交 SHA 涉及其父级,因此当您更改给定提交的父级时,其 SHA 将更改,并且会给其他用户造成混乱。为此,您必须使用 rebase:
git rebase --onto `new_parent` `old_parent`
【解决方案2】:
让我们从一个分支图开始:
master: A -- B -- C
\
LoginFeature: D -- E
\
Dashboard: F -- G
你想得到这个结构:
LoginFeature: D -- E
/
master: A -- B -- C
\
Dashboard: F' -- G'
我们可以在这里尝试使用git rebase --onto:
# from your Dashboard branch
git checkout Dashboard
git rebase --onto C E
这表示通过重写历史来重新设置Dashboard 分支的基址,这样父级为E(上图中为F)的提交现在位于C 的新提交/基址上。这里C 是master 分支上的最新提交。
请注意,我用破折号标记了F' 和G' 提交在 rebase 之后。这是为了表明这些提交实际上是完全 new 提交。变基提交通常意味着重写它们。
另外,您的实际Dashboard 分支有一个来自master 的合并提交。但是,默认情况下,rebase 会忽略合并提交,因此在 rebase 到进程时应该将其删除。