如何将更改后的文件添加到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
。 特别:
- 使用
git rebase -i HEAD~10
(或者任何你需要看的足够远的东西)。 - 将有问题的提交(
a0865...
)标记为编辑,方法是将行开头的单词改为edit
。 不要删除其他行,因为这会删除提交 - 保存rebase文件,git将退回到shell并等待您修复该提交。
- 用
git add
添加你的文件。 - 修改提交
git commit --amend
。 - 做一个
git rebase --continue
它将改写其余的提交对新的一个。 如果您标记了多个提交进行编辑,请执行步骤2到6。
用一个小小的改变来“修复”一个旧的提交,而不用改变旧提交的提交信息,其中OLDCOMMIT
就像091b73a
:
git add <my fixed files> git commit --fixup=OLDCOMMIT git rebase --interactive --autosquash OLDCOMMIT^
您也可以使用git commit --squash=OLDCOMMIT
在git 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在应用该提交后停止,以便可以编辑文件和/或提交消息,修改提交并继续重新绑定 。