如何将更改后的文件添加到Git中较旧的(而非最后一个)提交中

我在过去的一个小时里改了几件事,一步一步地做了。 但我只是意识到我忘了添加一些更改前的文件。

日志看起来像这样:

GIT TidyUpRequests u:1 d:0> git log commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce Author: David Klein <> Date: Tue Apr 27 09:43:55 2010 +0200 The Main program now tests both Webservices at once commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463 Author: David Klein <> Date: Tue Apr 27 09:43:27 2010 +0200 ISBNDBQueryHandler now uses the XPath functions from XPath.fs too commit 06a504e277fd98d97eed4dad22dfa5933d81451f Author: David Klein <> Date: Tue Apr 27 09:30:34 2010 +0200 AmazonQueryHandler now uses the XPath Helper functions defined in XPath.fs commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- changed file should go here Author: David Klein <> Date: Tue Apr 27 09:29:53 2010 +0200 Factored out some common XPath Operations 

有任何想法吗? 🙂

使用git rebase 。 特别:

  1. 使用git rebase -i HEAD~10 (或者任何你需要看的足够远的东西)。
  2. 将有问题的提交( a0865... )标记为编辑,方法是将行开头的单词改为edit 。 不要删除其他行,因为这会删除提交
  3. 保存rebase文件,git将退回到shell并等待您修复该提交。
  4. git add添加你的文件。
  5. 修改提交git commit --amend
  6. 做一个git rebase --continue它将改写其余的提交对新的一个。 如果您标记了多个提交进行编辑,请执行步骤2到6。

用一个小小的改变来“修复”一个旧的提交,而不用改变旧提交的提交信息,其中OLDCOMMIT就像091b73a

 git add <my fixed files> git commit --fixup=OLDCOMMIT git rebase --interactive --autosquash OLDCOMMIT^ 

您也可以使用git commit --squash=OLDCOMMITgit commit --squash=OLDCOMMIT时编辑旧的提交消息。


  • git rebase --interactive会popup一个文本编辑器( 可以configuration )来确认(或编辑) 重build步骤 。 在这个文件中有自定义重设变更的信息,只需保存并退出编辑器就可以继续重build。
  • --autosquash会自动将所有--fixup=OLDCOMMIT提交到所需的顺序。 请注意,– --autosquash仅在使用--interactive选项时才有效。
  • OLDCOMMIT^意味着它是在OLDCOMMIT之前提交的提交。

请参阅git commit和git rebase 。 与往常一样,当重写git历史logging时 ,您应该只修正或挤压您尚未发布给任何人(包括随机互联网用户和构build服务器)的提交。

用git 1.7,使用git rebase真的很简单:

阶段您的文件:

 git add $files 

创build一个新的提交并重新使用你的“破坏”提交的提交信息

 git commit -c master~4 

预先fixup! 在主题行(或squash!如果你想编辑提交(消息)):

 fixup! Factored out some common XPath Operations 

使用git rebase -i --autosquash你的提交

你可以尝试一个rebase --interactive会话来修改你的旧提交(假设你还没有将这些提交推送到另一个repo)。

有时在b.2中固定的东西。 不能修改为不完美的提交它修复, 因为这个提交被深埋在一个补丁系列
这就是交互式底图的作用:在大量的“a”和“b”之后使用它,重新安排和编辑提交,并将多个提交压缩成一个。

从最后一次提交起,按原样保留:

 git rebase -i <after-this-commit> 

一个编辑器将会触发当前分支中的所有提交(忽略合并提交),这是在给定提交之后发生的。
您可以将此列表中的提交重新sorting,以便将其删除。 列表看起来或多或less像这样:

 pick deadbee The oneline of this commit pick fa1afe1 The oneline of the next commit ... 

在线描述纯粹是为了您的乐趣; git rebase不会查看它们,而是以提交名称(在本例中为“deadbee”和“fa1afe1”),所以不要删除或编辑名称。

通过用命令“edit”replace命令“pick”,可以告诉git rebase在应用该提交后停止,以便可以编辑文件和/或提交消息,修改提交并继续重新绑定