有没有更好的方法来完成组合重置、结帐、挑选、结帐、变基?

Is there a better way to accomplish the combination reset, checkout, cherry-pick, checkout, rebase?

假设我有以下历史:

A ─▶ B  -- master
      ╲
       ◀
        C ─▶ D ─▶ E  -- feature

E 点,我偶然发现了代码中的一个小错误,严格来说与 feature 无关,但在这一点上恰好很重要,尽管它以前没有被注意到.然后我会首先将其修复到位:

A ─▶ B  -- master
      ╲
       ◀
        C ─▶ D ─▶ E ─▶ F  -- feature
                       ⋮
                       fix bug

但是,因为它毕竟是一个与 feature 没有太大关系的错误,所以这并不是我想要的历史 – 这个修复应该在 master (如果不在专门的错误修复分支中)。

git checkout master
git cherry-pick F

A ─▶ B ─▶ F'  -- master
      ╲
       ◀
        C ─▶ D ─▶ E ─▶ F  -- feature

好的,很好,但我真的不能就此打住(或者我可以吗?)– F 现在在我还想合并的活动分支中出现两次。我可以

git checkout feature
git reset --hard HEAD^

A ─▶ B ─▶ F'  -- master
      ╲
       ◀
        C ─▶ D ─▶ E  -- feature

并在将 feature 合并回 master 时等待 F',但这行不通,因为我没有在我需要的地方提供错误修复 – 因为关于 feature 的工作。所以我将用

结束它
git rebase master

A ─▶ B ─▶ F'  -- master
           ╲
            ◀
             C' ─▶ D' ─▶ E'  -- feature

这感觉是实现目标的一种复杂且有点容易出错的方法,本质上只是将历史记录中的单个提交上移。

有没有更直接的方法来完成这个任务?

您可能会对 gitl project 在 github 下感兴趣,它提供 git cherry-copygit cherry-move 命令。使用 git 核心命令无法更快地完成此操作。

来自 lennartcl on this other post 的原始答案。

总结

在我看来,最简单的方法是直接在 master 上修复错误(或在基于 master 的错误修复分支中)。 master 包含错误修复后,您可以将功能分支重新设置为 master。完成。

详细流程(带有错误修复分支)

修正分支:

git checkout master && git checkout -b bugfix

* 98f2c4f (HEAD -> bugfix) bugfix commit
| * efe77fd (feature1) test2
|/
* 3c3a2ee (master) test

bugfix合并到master并删除bugfix:

git checkout master && git merge bugfix && git branch -d bugfix

* 98f2c4f (HEAD -> master) bugfix commit
| * efe77fd (feature1) test2
|/
* 3c3a2ee test

将功能分支重新定位到 master:

git checkout feature1 && git rebase master

* e3a55ed (HEAD -> feature1) test2
* 98f2c4f (master) bugfix commit
* 3c3a2ee test