git rebase -i 用于特定提交?

git rebase -i for specific commits?

我有一个分支,其中包含一些我想交互变基的提交。但是,在拉取和合并之后,现在有其他提交与我的交错,所以我不能只做 git rebase -i HEAD~3

之类的事情

是否可以在选择单个提交时进行交互式变基?像 git rebase -i 23duirs 3eujsfe ...

另一种可能性——如果我只是 运行 git rebase -i 我相信可以将我的提交行剪切并粘贴为连续的,然后从那里压缩,对吗?是否有这样做的最佳实践,以尽量减少与那里不相关的提交发生冲突的可能性?

鉴于此

pick <unrelated a>
pick A
pick <unrelated b>
pick B
pick <unrelated c>

你绝对可以做到

pick <unrelated a>
pick <unrelated b>
pick <unrelated c>
pick A
squash B

如果您的提交 确实 与其他更改无关,这将正常工作。

git.

合并后变基很痛苦

我通常会尝试通过不合并其他人的工作来避免这个问题,而是获取和变基

git fetch upstream
git rebase upstream/master

(您也可以使用 git pull --rebase upstream master,但这有一个缺点,即不会更新您的 remotes/upstream/master 跟踪分支,而 git fetch 会更新;因此我更喜欢 fetch && rebase pull --rebase).

这样,我的提交总是在 master 中的所有内容之上,直到我的开发准备就绪,然后我打开一个没有合并的干净历史的拉取请求 IE。在任何时间点,我正在处理的分支中的最后 n 个提交是我的提交,我可以轻松地改写、压缩它们等

修改一些旧提交的最简单方法是 git rebase -i,您传递给 git rebase -i 的参数是单个提交; 所有比提供的提交更新的提交将显示在交互式变基屏幕中。我不知道这个屏幕有什么方法可以只显示 some commits newer than the param.

更改旧提交的替代方法是 git filter-branch,但使用起来要复杂得多。

有点老套的解决方案。

从原点创建一个新的本地分支(LOCAL_B)。 cherry-pick 从 LOCAL_A 到 LOCAL_B 的提交并使用 git rebase -i HEAD~3.

压缩它们

现在,为安全起见备份LOCAL_A。

删除LOCAL_A。从远程创建新的本地分支 LOCAL_A。 Cherry-pick 从 LOCAL_B 到 LOCAL_A 的压缩提交。

大功告成。