Git - 修改历史提交

时间:2017-11-14 18:54:00

标签: git github version-control

所以你就像一个优秀的小开发者一样工作:你提交了一组更改,让我们称之为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
...

所以我的问题是

我们应该选择一个流程而不是另一个流程吗如果是这样,为什么?一个或另一个涉及哪些好处/风险?

*免责声明:时间旅行很危险。编辑您的历史记录可以销毁您的回购,特别是如果已与多人共享。明智地使用这种力量......

2 个答案:

答案 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