所以你就像一个优秀的小开发者一样工作:你提交了一组更改,让我们称之为foundation
。然后你完成下一个段并提交,让我们称之为framework
。当你意识到:哦不,你即将进入cleanup
的下一步!我忘了在foundation
提交中添加一个重要的更改! (我们称之为patch
)
但不要害怕。 Git允许我们编辑历史 *。没有人会看到我们的错误......
审核这是我们的提交历史记录
patch
|
framework
|
foundation
|
everything that came before
...
据我所知,有两种基本方法可以解决这个问题。第一种方法,提交patch
的更改,然后使用git rebase -i
将提交顺序和压缩/修正patch
更改为foundation
。第二种方法,隐藏patch
中的更改,然后使用git rebase -i
使用foundation
编辑git commit --amend
提交。那就是:
git commit -am 'patch'
git rebase -i
# Originally
# pick foundation
# pick framework
# pick patch
# Now
pick foundation
fixup patch
pick framework
git stash
git rebase -i
# Originally
# pick foundation
# pick framework
# Now
edit foundation
pick framework
git stash apply
git commit --amend
git rebase --continue
在这两种方法结束时,我们将拥有
的提交历史记录framework
|
foundation+patch
|
everything that came before
...
我们应该选择一个流程而不是另一个流程吗如果是这样,为什么?一个或另一个涉及哪些好处/风险?
*免责声明:时间旅行很危险。编辑您的历史记录可以销毁您的回购,特别是如果已与多人共享。明智地使用这种力量......
答案 0 :(得分:1)
我没有理由偏爱这两种方法中的任何一种。
最常见的是,特别是对于棘手的情况,我使用第三种方法! : - )
关键步骤是重命名当前的实验分支,并创建一个新的实验分支:
git branch -m experiment experiment.0 # increment number over time
git checkout -b experiment # and add an upstream if desired
现在您可以提交补丁,包括使用git commit --fixup
,然后运行交互式rebase(可能使用--autosquash
)并重新启动基础和框架。
因此,每次“放弃的”先前尝试仍然是可见的,编号的先前尝试。当一切都很好的时候,我会用git branch -D
删除那些旧的,现在他们真的被抛弃了。
答案 1 :(得分:1)
您列出的两种方法之间的主要区别应该是对fixup
命令使用edit
还是git rebase -i
。
这两种方法都可以。但第二种方法可以使提交历史记录更清晰,特别是如果您与其他人共同使用同一个回购/分支,则不建议使用压缩提交。如果你想让历史记录缩短,你可以压缩作为第一种方法。
对于第二种方法,您还可以先提交patch
,然后重写提交foundation
:
git commit -am 'patch'
git rebase -i
在rebase交互式窗口中,将其更改为:
edit foundation
pick framework
pick patch