gpt4 book ai didi

git - 与上游 merge 时如何在git中实现 "floats"的私有(private)分支?

转载 作者:太空狗 更新时间:2023-10-29 14:48:59 26 4
gpt4 key购买 nike

我有另一个组织的存储库的复刻。我在 repo 协议(protocol)中的最新标签,它不是头,我已经从该标签创建了一个永远不会被推到上游的分支。这就是为什么我认为该分支机构是私有(private)的。

我已经提交到我的私有(private)分支并在我的生产环境中使用该代码。当对上游存储库创建新标签时,我希望能够 pull 他们的更改。

但是,我希望始终将我的提交整齐地堆叠在最后一个标签之上。那时我不想 merge ,因为我的提交最终会保留在历史中很久以前,我想在最上面看到它们,这样当我在我的存储库中使用某些工具时,我可以轻松地使用它们。

真的,我想要一个“ float ”分支,当我将上游更改带到我的存储库时,我可以将其移植到任意点。

[编辑]然而,我不相信我可以使用 rebase ,因为这是一个历史重写操作。你看,我在两台机器上使用我的存储库,我的开发和生产。我在开发机器上提交,推送到 github,然后 pull 到生产环境。所有这些都与我最初从中 fork 的上游存储库的更改无关。

我不太清楚移植、 cherry-pick 或任何其他可能适合的工具。不管是哪种工具,我认为它不应该重写历史。从我的阅读中,我看到重写 repo 历史是推送时的禁忌。所以我不确定我应该使用什么命令来移植分支而不重写历史。

如果我使用的是 mercurial,我可能会考虑类似版本控制的 mq。我不知道 git 的类似解决方案,如果有,或者是否有另一个更适合 git 的工具。

[编辑]

在评估了我在这里得到的回复后,我最终确定 cherry-pick 是正确的答案。在所有情况下,rebase 都会删除历史记录,并且由于这是一个共享存储库,因此删除历史记录是 Not Acceptable ,至少根据我读过的每个来源都是如此。

然而,Cherry-picking 将提交复制到我的工作树,而不是将其从其原始位置删除。因此,我可以在最新标签之上放置我所做更改的副本,并将它们整齐地堆在一起。

郑重声明,我还尝试使用 Mercurial 来实现这一点,方法是使用 hg-git 扩展,它允许您使用 hg 克隆 git 存储库。这有利有弊。最大的缺点是当我用完它时,它无法 push 。 hg-git 在此之前工作得很愉快,然后告诉你它不会用 hg 1.9 推送。至少可以说是假的。另一个缺点是克隆和 pull 大量更改非常缓慢。然而,mq 和 TortoiseHg 的 merge 冲突解决工具是对 git cherry-pick 和 Smartgit 的 merge 冲突解决工具的巨大改进。我希望 hg-git 可以工作。

我想最后,“ float ”对于我的更改分支来说并不是一个很好的描述,因为结果是复制它而不是移动它。抱歉我的描述可能很糟糕,我仍在弄清楚选项是什么。感谢您的帮助。

最佳答案

git fetch
git rebase --onto latesttag previoustag yourbranch

必须处理冲突,这完全取决于您对可能已从一个标签更改为下一个标签的文件所做的操作。特别是,如果有人删除了您更改的某些代码,您将必须解决这个问题并确保您更改的代码现在可以应用于其他地方。对此没有 Elixir 。一旦你解决了你的冲突并且一切正常,

git add -A
git rebase --continue

冲洗重复。

补充一点,如果您这样做只是为了能够部署,“ float 分支”可能不是处理此问题的最佳方法。考虑这些替代方案:

  1. 部署操纵文件的脚本以确保部署正常进行。
  2. 在填充工作目录时修改文件的涂抹/清理脚本。 ( https://git-scm.com/book/en/v2/Customizing-Git-Git-Attributes#_keyword_expansion )

您的 float 分支似乎只是为了您自己的环境而存在,因此不应成为项目的一部分。

关于git - 与上游 merge 时如何在git中实现 "floats"的私有(private)分支?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8660883/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com