在 pull/push 之后清理 git 历史记录并在没有冲突的情况下进行分支
Cleaning up git history after pull/push and branch without conflicts
如何在进行更改后恢复线性历史然后拉(无冲突)然后 commit/push(创建人工分支和合并)。
几个人在同一个分支工作,但在不同的 files/folders。在提交之前,git 有时会指示必须在提交完成之前从存储库中提取某些更改。在没有冲突的情况下成功拉取后,提交并推送新代码。但是,git 历史现在看起来像这样:
我希望历史是线性的,因为合并中没有冲突。读了一些书后,我明白如果没有冲突,我应该做一个 fetch 然后 rebase 以获得线性历史。但事情已经完成了。如何恢复线性历史?
A merge
(pull
不按配置或参数等于fetch
+merge
,可以让pull
等于fetch
+rebase
但如果你想要或手动执行这些命令)将 只有 如果合并是快进的,则保持线性历史,这意味着没有唯一的提交您要合并到的分支。您还可以告诉 merge
仅在快进合并时才进行合并,或者告诉它从不保留线性历史记录,但始终创建合并提交。
A rebase
将始终 保持线性历史记录。
是否存在冲突不会以任何方式影响历史线性度。
如果您想要尽可能线性的历史,决定是使用 merge
还是 rebase
相对简单。
如果您操作的目标分支是本地分支,这意味着 none 的唯一提交尚未被推送,您可以安全地执行 rebase
,因为它只会影响您的当地历史。
如果你操作的目标分支已经被推送,我。 e.有独特的提交已经被推送,因此最终已经被其他人获取,你应该使用 merge
并接受非线性历史,因为你所有的同事都会讨厌你,因为每个人都必须构建一个不明显的变基,如果他们已经拉进了你变基的那些提交。
你目前的情况也是如此,据我了解你已经推送了你的合并更改,这意味着如果你将它更改为线性历史,你将更改已发布的历史并且你所有的同事都必须在之后重新设置他们的工作你强推了你改变的历史。
如果你还没有推或者不在乎仇恨的浪潮会袭击你,你可以通过变基轻松做到这一点。如果你G。可以在所有天鹅绒提交之上从底部开始第 5 次绿色提交,您可以简单地检查您的绿色分支并执行 git rebase pink
,您将得到一个线性历史记录。
git rebase
可以工作。假设当前分支是 master
,并且您的第一个图中的提交是从底部到顶部标记的。前4个绿色是A B C D,后5个紫色是E F G H I,左边2个绿色是J K,右边2个紫色是L M,最上面的绿色是N.
git rebase --onto J D master
我们得到一个线性历史 A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。 E'
和 E
是具有不同 sha1 的等效提交。
还有一个办法
git rebase --onto I D master
并且我们得到一个线性历史 A-B-C-D-E-F-G-H-I-J'-L'-M'
。
如果git rebase
不太清楚,也可以通过git reset
和git cherry-pick
来实现,前者裁剪后者移植
由于 K 和 N 是合并提交,它们不应该存在于线性历史中。我们可以忽略它们。
git reset J --hard
git cherry-pick E F G H I L M
#or one by one: git cherry-pick E;git cherry-pick F;...
最后我们得到了线性历史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。
或者换一种方式
git reset I --hard
git cherry-pick J L M
我们得到了线性历史A-B-C-D-E-F-G-H-I-J'-L'-M'
。如果没有冲突,两棵树的内容是一样的
如何在进行更改后恢复线性历史然后拉(无冲突)然后 commit/push(创建人工分支和合并)。
几个人在同一个分支工作,但在不同的 files/folders。在提交之前,git 有时会指示必须在提交完成之前从存储库中提取某些更改。在没有冲突的情况下成功拉取后,提交并推送新代码。但是,git 历史现在看起来像这样:
我希望历史是线性的,因为合并中没有冲突。读了一些书后,我明白如果没有冲突,我应该做一个 fetch 然后 rebase 以获得线性历史。但事情已经完成了。如何恢复线性历史?
A merge
(pull
不按配置或参数等于fetch
+merge
,可以让pull
等于fetch
+rebase
但如果你想要或手动执行这些命令)将 只有 如果合并是快进的,则保持线性历史,这意味着没有唯一的提交您要合并到的分支。您还可以告诉 merge
仅在快进合并时才进行合并,或者告诉它从不保留线性历史记录,但始终创建合并提交。
A rebase
将始终 保持线性历史记录。
是否存在冲突不会以任何方式影响历史线性度。
如果您想要尽可能线性的历史,决定是使用 merge
还是 rebase
相对简单。
如果您操作的目标分支是本地分支,这意味着 none 的唯一提交尚未被推送,您可以安全地执行 rebase
,因为它只会影响您的当地历史。
如果你操作的目标分支已经被推送,我。 e.有独特的提交已经被推送,因此最终已经被其他人获取,你应该使用 merge
并接受非线性历史,因为你所有的同事都会讨厌你,因为每个人都必须构建一个不明显的变基,如果他们已经拉进了你变基的那些提交。
你目前的情况也是如此,据我了解你已经推送了你的合并更改,这意味着如果你将它更改为线性历史,你将更改已发布的历史并且你所有的同事都必须在之后重新设置他们的工作你强推了你改变的历史。
如果你还没有推或者不在乎仇恨的浪潮会袭击你,你可以通过变基轻松做到这一点。如果你G。可以在所有天鹅绒提交之上从底部开始第 5 次绿色提交,您可以简单地检查您的绿色分支并执行 git rebase pink
,您将得到一个线性历史记录。
git rebase
可以工作。假设当前分支是 master
,并且您的第一个图中的提交是从底部到顶部标记的。前4个绿色是A B C D,后5个紫色是E F G H I,左边2个绿色是J K,右边2个紫色是L M,最上面的绿色是N.
git rebase --onto J D master
我们得到一个线性历史 A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。 E'
和 E
是具有不同 sha1 的等效提交。
还有一个办法
git rebase --onto I D master
并且我们得到一个线性历史 A-B-C-D-E-F-G-H-I-J'-L'-M'
。
如果git rebase
不太清楚,也可以通过git reset
和git cherry-pick
来实现,前者裁剪后者移植
由于 K 和 N 是合并提交,它们不应该存在于线性历史中。我们可以忽略它们。
git reset J --hard
git cherry-pick E F G H I L M
#or one by one: git cherry-pick E;git cherry-pick F;...
最后我们得到了线性历史A-B-C-D-J-E'-F'-G'-H'-I'-L'-M'
。
或者换一种方式
git reset I --hard
git cherry-pick J L M
我们得到了线性历史A-B-C-D-E-F-G-H-I-J'-L'-M'
。如果没有冲突,两棵树的内容是一样的