在不丢失历史记录或不失败的情况下将当前分支迁移到主分支 - (硬合并)

Migrate a Current branch to Master branch without losing history or no failure - (hard merge)

我有一个典型的情况,我们都在 master 分支上工作,在我们必须执行并行流水线过程的某个时间点,我们从这个 master 上切下分支并创建一个新的分支说 feature ,现在这个 feature 分支开始有来自所有人的提交并且没有提交落在 master 中。

现在,经过将近 7 个月的时间,我们在功能分支上工作,现在我们想将其合并到 master 而不会丢失 master 的历史记录分支。我们在功能分支中有将近 2000 次提交,所以 rebase 只是一个危险的操作。

我们正在考虑的方法:

感谢准确执行此操作的步骤。我们使用 Gitlab.

没有历史一个分支。1有历史一个分支,因为分支名称标识一个特定的提交,并且该提交标识一个或多个先前的提交,每个提交还标识更早的提交等等。然后我们说这些提交是 in(包含在)那个分支中。它们也可能包含在其他分支中。

Git 存储库中的 历史记录 提交。提交 历史。如果你有提交,你就有历史。它们是同一件事,因此无需担心将它们分开。这里棘手的部分是 commits 是通过它们的哈希 ID 找到的。哈希 ID 又大又丑,人类不可能在任何长期基础上正确处理。所以我们甚至不尝试:我们使用分支名称来查找最新提交,我们从中找到所有较早的提交。

这对您来说意味着最简单的方法,即在重命名任何名称后将 feature 重命名为 master(或 main 或您喜欢的任何名称)首先,可能是要走的路。如果稍后,您希望找到一个只能通过从以前称为 master 的内容向后搜索才能找到的提交,现在称为 history-from-19272 你会 运行 git log history-from-1927git log origin/history-from-1927 找到它。

一个分支名称——或者像 origin/whatever 这样的远程跟踪名称,Git 在克隆中创建,这样克隆 3 的用户可以see what the original repository could see——允许你,作为克隆的用户,找到并查看提交,而不必记住它们的哈希 ID。 (它还保护那些提交不被垃圾收集,这是一个单独的问题。)


1这并不完全正确,因为 Git 为分支名称和其他引用保留了所谓的 reflogs .但是,这不是你的意思。 Reflogs 也特定于一个特定的存储库:此历史记录不会通过克隆传输。

2显然1927是不现实的;甚至 1972 年也早于 Git 存在。它只是意味着您使用过的任何名称,而不是建议您使用 this 名称,这是一个糟糕的名称。使用更好的。

3制作的人得到他或她的自己的分支名称in克隆,用作 he/she/they 认为合适。这就是为什么他们的 Git 重命名 origin-al (origin) 分支名称:如果他们想创建自己的 main and/or feature and/or 无论其他名称如何,它们都不会受到 origin 存储库中名称的影响。相反,他们的 origin/* 名称将受到这些名称的影响。这就是为什么我们有远程跟踪名称:它们 track branch 名称在 remote Git.我们 运行 git fetch 获得他们拥有的我们还没有的任何新提交;这会更新我们的远程跟踪名称以记住那些新提交,就像 他们 更新 他们 分支 名称一样记住那些新的提交。