如何将主分支的更改合并到孤立分支,而不会添加到孤立分支的历史记录中?

3
我有一个用于我的博士论文(使用LaTeX)的git存储库。大学规定不允许我与研究顾问分享我的论文中的背景回顾章节,但我可以自由地分享和征求其他章节的意见。
为了与我的导师分享存储库,我创建了一个孤立分支(noRevBranch),删除了所需的章节,并将该分支推送并跟踪到github上的新存储库中。我可以与他分享这个,因为这里没有历史记录,他无法访问已删除的章节。
问题是,如何在将来将我对主分支所做的任何更改合并到noRevBranch中,而不会将主分支历史记录附加到新的合并提交中?
2个回答

5
您可以将当前结构保留不变。
您需要做的是使用git cherry-pick <range of commits>将所有新提交合并到“孤立”分支中。

git cherry-pick <SHA-1>...<SHA-1>

应用主分支顶部提交引入的更改,并创建具有此更改的新提交。

...的语法是一个提交范围,从起始点(不包括)到最后一个提交获取所有提交。

enter image description here


阅读完整的git cherry-pick文档,了解您可以使用的所有选项


1

我认为您的做法是反着来的。您需要将noRevBranch视为master分支,并在该分支上进行所有提交。如果不将带有背景章节的分支(revBranch)推送到Github,则可以随时对其进行变基。此分支的历史记录永远不会与您的导师共享,因为它是仅存储在您计算机上的本地分支,并且由于从未合并到noRevBranch中,您的导师也无法访问其历史记录。但关键是,您要在noRevBranch上进行提交(这些提交不会影响背景章节),因为这将使您能够通过变基轻松将它们拉入revBranch中。


编辑,回应jlanza:

如果我从头开始做这件事,我会这样做:

  • master作为您的公共分支。将到目前为止所有“公共”工作提交到此分支。不要将任何“私有”工作提交到此分支。
  • 基于主分支创建一个新的私有分支。我们将其称为privategit checkout -b private。将您不想公开分享的任何内容提交到此分支。
  • 每当您提交希望公开分享的工作时,请将该工作提交到master。您可以随时将此分支推送到您的存储库所在的位置。git push origin master:refs/heads/master
  • 每当您提交不希望公开分享的工作时,请将该工作提交到private。不要将此分支推送到任何公共存储库。
  • 您可以通过合并或重新设置使privatemaster保持最新状态。例如:git checkout private && git merge master

谢谢mkasberg。我意识到这一点,如果我现在开始的话,我会这样做。我的存储库中有三年的历史记录(我是一个git新手)。我不想现在重新组织它并冒着丢失某些东西的风险。如果没有更好的方法,我可以随时创建一个新的存储库,并将文件复制到那里,每当我需要我的顾问的输入并提交它们时。我只是在寻找与我当前工作流程无缝集成的东西。 - UditG
你可能不需要进行大量的重构。你可以只是在noRevBranch上开始提交并重新设置revBranch。Git的一个好处是你可以通过复制文件夹来轻松地复制整个存储库。我建议你复制一份存储库并尝试在noRevBranch上进行提交,然后重新设置revBranch。看看你是否满意结果。 - mkasberg
如果你不太熟悉这个,那我会建议你继续以revBranch为基础重置noRevBranch。但是不要分享整个分支,只需将文件复制到Dropbox或其他地方即可。 - mkasberg
@mkasberg,你是否应该在.gitignore中包含这个章节,这样在合并时就不会将其合并?我也遇到了类似的问题,有些代码我不想在公共分支上分享,我发现使用cherry-pick/patch更容易。你能否详细说明一下你提出的工作方法? - jlanza
@jlanza 我编辑了我的帖子,包括我将使用的工作流程的更多细节。你不需要以任何方式更改.gitignore,因为你所有的工作(公共或私人)都提交到其中一个分支。只需注意你正在提交什么和它要去哪里即可。 - mkasberg
@mkasberg 现在我明白你的意思了。我是另一种方式工作的。我在私有环境中完成所有工作,然后当提交到公共环境时,我只想要一些提交记录,所以我使用 cherry-pick 和补丁,因为公共环境中有一些文件我不希望它们被公开(无法合并)。 - jlanza

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接