将本地提交移动到非主本地分支

时间:2016-03-08 06:19:44

标签: git version-control git-commit

我处境很复杂,因为我不熟悉git;

我在远程进行了一次主提交,我在本地调用了一个名为fix-bug-online-offline-support的分支。 在我的工作期间,另一名团队成员更换了远程主人,我把它拉了。

但我需要将我的分支fix-bug-online-offline-support拆分为两个分支;

  • 名称为fix-bug-online-support
  • 的名字
  • 另一个名称为fix-bug-offline-support
  • 的人

我已将分支fix-bug-online-offline-support的名称更改为fix-bug-online-offline-support

并且需要将一些提交从fix-bug-online-support移到fix-bug-offline-support

注意:这两个分支都是本地分支,我有提交的哈希字符串

2 个答案:

答案 0 :(得分:3)

简短回答:您可以使用cherry-pick进行提交并将其放入fix-bug-offline-supportrebase -i,然后从原始分支中删除提交。< / p>

答案很长:据我了解,你有类似的东西

A - B - C - D - E
                L fix-bug-offline-support

你希望最终得到像这样的东西

A - C' - E'
 \       L fix-bug-offline-support
  \
    - B' - D'
           L fix-bug-online-support

你可以这样做:

git checkout A # replace A with the sha1 of this commit for instance
git checkout -b fix-bug-online-support
git cherry-pick B
git cherry-pick D

此时我们已经

A - B - C - D - E
 \              L fix-bug-offline-support
  \
    - B' - D'
           L fix-bug-online-support

所以我们仍然需要从fix-bug-offline-support删除这些提交,我们使用

git checkout fix-bug-offline-support
git rebase -i A

并从rebase -i命令后显示的文本编辑器中删除与BD对应的行

最后的微妙:请注意,我们实际上并没有“移动”提交。我们宁愿创建新的提交。这可能听起来像是一种迂腐的细微差别,但实际上当我们对这些细微差别没有给予足够的重视时,Git很难理解。所以,澄清一下:

  • 提交是我们项目的快照,并且是不可变的(例如:它有一个唯一且永远不会改变的sha1)
  • 当我们cherry-pick时,我们实际上在其他地方重新应用了补丁,git最终创建了一个带有新sha1的新提交(例如:这就是为什么在提交B上方的图中转为提交B':它们不是同一个对象)
  • 当我们删除提交时也是如此:实际上git将重新应用没有这些补丁的历史记录,因此最终会创建新的提交C'E'

一个实际的推论是,在我们的操作结束时,初始提交E仍然存在。我们不在乎,因为我们不需要它,无论如何它不再可以从分支机构访问,所以它不会阻止我们。但这是一个好消息,因为如果我们注意到我们搞砸了,我们仍然可以检索它

答案 1 :(得分:0)

首先尝试将origin master合并到本地分支fix-bug-online-offline-support(反向合并)。您的本地分支现在与原始主数据库保持同步。现在,您可以继续在此分支中工作。 您还可以将本地分支拆分为两个在线离线分支。