如何将更改的文件添加到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
有任何想法吗?
#1楼
您可以尝试使用rebase --interactive
会话来修改旧提交(前提是您尚未将这些提交推送到另一个repo)。
有时在b.2中修复了这个问题。 不能修改为它修复的不太完美的提交, 因为该提交深深埋藏在补丁系列中 。
这正是交互式rebase的用途:在大量的“a”和“b”之后使用它,通过重新排列和编辑提交,并将多个提交压缩成一个。使用您要保留的最后一次提交启动它:
git rebase -i <after-this-commit>
编辑器将被**当前分支中的所有提交(忽略合并提交),这些提交在给定的提交之后。
您可以将此列表中的提交重新排序到您的内容,然后您可以删除它们。 该列表看起来或多或少像这样:
pick deadbee The oneline of this commit
pick fa1afe1 The oneline of the next commit
...
在线描述纯粹是为了您的乐趣; git rebase不会查看它们,而是查看提交名称(本例中为“deadbee”和“fa1afe1”),因此不要删除或编辑名称。
通过使用命令“edit”替换命令“pick”,您可以告诉git rebase在应用该提交后停止,以便您可以编辑文件和/或提交消息,修改提交并继续重新定位 。
#2楼
使用git rebase
。 特别:
- 使用
git stash
存储要添加的更改。 - 使用
git rebase -i HEAD~10
(或者你要查看多少提交)。 - 通过将行开头的单词
pick
更改为edit来标记有问题的提交(a0865...
)以进行edit
。 不要删除其他行,否则会删除提交。[^ vimnote] - 保存rebase文件,git将退回到shell并等待您修复该提交。
- 使用
git stash pop
- 使用
git add <file>
。 - 使用
git commit --amend --no-edit
。 - 做一个
git rebase --continue
,它将重写你的其余提交对新的提交。 - 如果您已标记多个提交进行编辑,请从步骤2开始重复。
[^ vimnote]:如果您正在使用vim
则必须按Insert键进行编辑,然后按Esc键入:wq
以保存文件,退出编辑器并应用更改。 或者,您可以使用git config --global core.editor "nano"
配置用户友好的git commit编辑器 。
#3楼
使用git 1.7,使用git rebase
有一个非常简单的方法:
暂存你的文件:
git add $files
创建一个新的提交并重新使用“破坏”提交的提交消息
git commit -c master~4
前置fixup!
在主题行(或squash!
如果你想编辑提交(消息)):
fixup! Factored out some common XPath Operations
使用git rebase -i --autosquash
来git rebase -i --autosquash
你的提交
#4楼
要通过一个小的更改“修复”旧的提交,而不更改旧提交的提交消息,其中OLDCOMMIT
类似于091b73a
:
git add <my fixed files>
git commit --fixup=OLDCOMMIT
git rebase --interactive --autosquash OLDCOMMIT^
您还可以使用git commit --squash=OLDCOMMIT
在rebase期间编辑旧的提交消息。
-
git rebase --interactive
将打开一个文本编辑器( 可以配置 )来确认(或编辑) rebase指令序列 。 文件中有关于rebase指令更改的信息; 只保存并退出编辑器(:wq
在vim
)继续与重订。 -
--autosquash
将自动按所需顺序提交任何--fixup=OLDCOMMIT
提交。 请注意--autosquash
仅在使用--interactive
选项时有效。 - 该
^
在OLDCOMMIT^
意味着它是一个参考之前提交OLDCOMMIT
。
上述步骤适用于验证和/或修改rebase指令序列 ,但也可以通过以下方式跳过/自动化交互式rebase文本编辑器:
- 将
GIT_SEQUENCE_EDITOR
设置为脚本 。 - 创建一个git别名以自动自动排序所有排队的修正。
- 创建一个git别名来自动修复单个提交。
请参阅git commit和git rebase 。 与往常一样,当重写git历史记录时 ,您应该只修改或压缩尚未发布给其他任何人的提交(包括随机互联网用户和构建服务器)。
下一篇: 没有找到有效的 sudoers 资源