有没有更好的方法来完成组合重置、结帐、挑选、结帐、变基?
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-copy 和 git 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
假设我有以下历史:
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-copy 和 git 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