Git:将新提交合并回 master,针对非常旧的提交

Git: Merging a new commit back to master, made against a very old commit

我在 git 有一个项目,所有的事情都直接在 master 分支上完成,标签被用来标记代码的发布版本。 我知道这并不理想,并且一直在研究 git 流程,例如这个流程:http://nvie.com/posts/a-successful-git-branching-model/ - 然而,即使使用更好的设置,我也无法轻易地看到 [= =35=] 可以应用于项目的先前版本并提交回 master 分支...

我正在使用的 git 存储库有一个远程源,目前只有我自己和其他开发人员有它的克隆。 主分支日志现在看起来像这样:

master: A--B--(C)--...--F--G

提交 C 被标记为发布点,例如"v0.2" 并且我想更改该代码库。 我可以将 refs/tags/v0.2 检出到一个新的本地分支并提交对文件的更改(例如 Main.java 在这种情况下),甚至标记该提交(提交 H 标记为 'v0.3')

master: A--B--(C)--D--...--F--G
v0.2  :        C--(H)

但实际上,我不想让每个版本都有一个分支——我只想要主分支上的相关标签。将提交 H 标记为 'v0.3',如果我尝试删除分支 'v0.2',我会得到:

'error: The branch 'v2' is not fully merged. If you are sure you want to delete it, run 'git branch -D v2'

好的,所以它没有合并回 master,但是 Main.java 的编辑部分在最新版本中甚至不再存在,所以这是一个问题吗?

我想我仍然可以用'-D'删除分支而不丢失提交,因为提交仍然被标记引用。

在临时存储库上执行此操作,然后从 master 分支 运行 'git log --graph --all' 向我显示:

* Commit I
|
* Commit G
...
|
* Commit D
|
|  * Commit H
|/
* Commit C
...
|
* Commit A

如上留下历史会遇到什么问题? 如果没有,有人可以建议处理这种情况的最佳实践方法吗?

我希望我没有想太多 :-) 非常感谢任何建议。

问题是你有两个版本,I 和 H。H 的变化不会出现在最新的版本中,或者,如果你在 H 中构建代码,你将没有D..G和I的变化

如果您想同时进行这两项更改,您必须 合并它们。

当然,如果你把H的改动应用到master上,那么这不是问题。您基本上是手动完成合并本来可以完成的操作。您可以继续构建新版本。但是,拥有这个悬垂的分支仍然看起来很奇怪和令人困惑,如果我是你,我会无论如何合并它来解决这个问题。

所以你没有删除或合并它,但我会,而且我认为这是常见的做法。

您想对 Commit H 做什么?这就是问题。它应该在 Commit C 和 Commit D 之间吗?然后你可以尝试 git rebase -i HEAD~7git rebase -i <VersionC> 并向上移动你的提交。但如果其他人使用同一个 master 分支,你将被禁止或解雇。它应该在 Commit I 之后吗?然后你可以(有点脏)做git rebase <CommitI>,解决冲突并把它作为最新版本。

所以,弄清楚:谁在什么情况下需要 CommitH?它是否应该对 CommitI 或 G 产生影响?其他人是否阅读存储库?

Okay, so it's not merged back to master but the edited part of Main.java doesn't even exist any more in the latest version, so is this a problem?

没有。

I think I can still delete the branch with '-D' and not lose the commit because the commit is still referenced by a tag.

没错。完全正确。

What problems might I encounter if I leave the history as above?

如果您需要从叶提交中进行的更改已经存在于主线中,或者不再相关,则根本 none。

此外,如果您出于某种原因可能想要恢复的每个提交都可以从某个存储库中的引用访问,您可以在需要时访问它,那么什么都不会丢失。没有人说每个 repo 都必须有每个提交(你不会推送你所有的分支,对吧?没有人需要看到你的 wip 东西或你的实验或者只是简单地放屁)。

不过,请检查商店规则。除了未来的发展需要,行政程序可能还有其他问题。

I can't easily see a way that a 'hotfix' could be applied to an previous release of the project and committed back to the master branch...

永远有效(例如,总是留下完全正确的历史记录)选项是,分支最早引入错误的合并提交,在那里修复它,将其合并到每个有错误提交的分支提示。对这些内容的后续更改可能会与修复冲突,如果对受影响的文件进行了大量工作,您可能想要检查即使是明显成功的合并,没有基于文本的 vcs 可以免疫。