如何重写 git 历史以匹配流行的 git 工作流程

Posted

技术标签:

【中文标题】如何重写 git 历史以匹配流行的 git 工作流程【英文标题】:How to rewrite git history to match a popular git workflow 【发布时间】:2014-02-10 08:34:48 【问题描述】:

我的大部分主分支看起来像一个链表而不是一棵树。也就是说,我所做的大多数合并都是快进合并。我想我会遵循"A successful Git branching model" 工作流程,它指示我避免快进合并,而是留下我的特征和特征分支连接的轨迹。假设这是个好主意。

如何最轻松地重做我的树?

即说我有这种日志:

* hash1 great feature #1 - almost done
* hash2 side work
* hash3 side work
* hash4 great feature #1 - added y
* hash5 great feature #1 - added x
* hash6 documentation - added more docs
* hash7 documentation - removed stuff
* hash8 project-wide:  added deployment descriptors....

我想要这种日志(或任何类似的版本):

* merged side work into branch develop
|\
* * hash2 (feature branch) side work
* * hash3 (feature branch) side work
|/
*  merged great feature into branch develop
|\ 
* * hash1 (feature branch) great feature #1 - almost done
* * hash4 (feature branch) great feature #1 - added y
* * hash5 (feature branch) great feature #1 - added x
|/ 
* merged documentation into branch develop
|\
| * hash6 (feature branch) documentation - added more docs
| * hash7 (feature branch) documentation - removed stuff
|/
* hash8 project-wide (develop branch):  added deployment descriptors....

我有超过 40 次提交,我的树比我在这里展示的要混乱得多,所以从 init 创建一个新分支并挑选单个提交是最痛苦的。我想 rebase --interactive 可能会有所帮助,但我不确定它是否会。 rebase 使树变平,我需要将其放大。我已经展示了将feature 分支合并到develop,但我也可能在某些时候将develop 分支合并到master。怎么样?

【问题讨论】:

【参考方案1】:

正如你所说,首先你没有那么多的提交,所以你可以做的是重写你的历史,问题是你必须在最后推动 --force。

git rebase HEAD~40 -i

然后您可以在此处通过将 pick 更改为 ssquash(将 2 个提交合并在一起)并通过更改 来编辑您的提交消息选择e

正如您再次所说的其他解决方案,历史记录只是您可以跟踪以前的“工作流程”并随时开始新的“工作流程”的历史记录。即使它不完美,您也会保留它是真实的历史。

IMO,尽你所能,编辑一点你的历史,然后开始你的新工作流程。

【讨论】:

我仍然无法看到它是如何工作的。我不一定想压缩提交,但我确实想从 master 分支中创建新的分支以获得功能,我将合并回 master 分支。在 rebase 期间创建一个新分支似乎并没有做太多。我只是有点困惑。我想我确实需要跳过某些分支的一些提交,然后将它们合并。 rebase 似乎适用于单个分支,或者我使用错误。 在我看来,也许我需要启动几个变基,每个分支一个,然后在它们之间处理提交,以创建这个工作流?如果是这样,也许我应该继续前进并保留我的 git 历史记录 您肯定需要定期重新调整您的分支,具体取决于您从其他分支对您的 master 所做的合并。您还可以 git merge feature/branchA --no-commit --no-ff 查看您的合并,进行一些更改或解决冲突,然后执行您的 git commit

以上是关于如何重写 git 历史以匹配流行的 git 工作流程的主要内容,如果未能解决你的问题,请参考以下文章

重写 Git 历史的实际后果是啥?

可能破坏/重写历史的 Git 命令

Git 重写历史

Git 重写历史

git revert和git reset的区别

Git修改提交历史