繁体   English   中英

如何排除从master到另一个分支的提交

[英]How to exclude commits from master to another branch

我们的一些开发人员已对母版提交了不起作用的提交。 我想清理它,以便对主服务器的每次提交都是有效的版本。

假设我们有以下提交:

A - B - C - D - E - F

如何将一个或多个提交提取到另一个分支:

A - B           E - F
      \       /
        C - D

编辑:

  • 提交C和D应该被删除。

执行:

git rebase -i B

然后,您可以从B以来引入的提交中进行选择。

-i标志代表交互式 ,这意味着编辑器将显示(每行中都有一个提交列表)(默认情况下是vi ,就像编辑提交消息时一样)。 您可以删除一行以跳过提交,替换提交的顺序,甚至将两个或多个提交合并为一个提交。

可以在官方git文档的重写历史一章中找到更多信息。

尽管您似乎可以容忍重写master分支的历史,尽管它是公开的(并且可能被许多开发人员使用),所以可以考虑以下策略:

  • git cherry-pick CD按此顺序提交到新分支
  • git rebase --interactive master分支以删除CD提交

首先樱桃选择CD提交到一个新分支:

git checkout new_branch
git cherry-pick dk8cnj2
git cherry-pick dn52bd6

在这里,经过cherry-pick的看上去很有趣的字符串实际上是CD提交的SHA-1哈希,如下所示。 这就是您告诉Git引用实际提交的方式。

现在,您已经挽救了CD提交,您可以启动一个交互式基础,以将它们从master分支中删除:

git rebase -i HEAD~4

这应该调出一个编辑器,按照最旧到最新的顺序向您显示最近的4次提交(参见HEAD~4 )列表,如下所示:

pick dk8cnj2 Commit C
pick dn52bd6 Commit D
pick 9m38b2f Commit E
pick ldkj093 Commit F

删除 (即删除)提交CD ,从而在编辑器中留下以下内容:

pick 9m38b2f Commit E
pick ldkj093 Commit F

然后保存文件,将其关闭,然后继续进行变基。 之后,您将有效地从master分支中剪接出CD提交。 现在,由于您是在本地执行此操作的,而且还重写了master的历史记录,因此您将不得不将其强制推送到存储库中:

git push --force origin 

请记住,这将重写 master分支的历史记录,这可能会给使用该分支的其他任何人造成混乱。 解决此问题的一种方法是告诉所有人在一天结束时冻结master上的工作,然后完成交互式变基。 第二天早上,每个人都删除其本地master并签出新副本。

TMG提供的交互式基础的另一种解决方案是在主服务器上创建一个临时分支,将主服务器重置为提交B,然后选择所有需要保留的提交。

它给您这些命令。 警告:请确保没有当前更改,或将其保存。

// Starting point
git checkout master
// Create a new branch to avoid loosing some commit
git branch tmp
// Change master HEAD
git reset --hard master commit_B
// Get the commits you want
git cherry-pick commit_E
git cherry-pick commit_F
// DONE, you can clean up tmp branch if you don't need commit C and D (you will loose them)
git branch -D tmp

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM