如何将更改的文件添加到Git中较旧的(非最新)提交中
如何将更改的文件添加到Git中较旧的(非最新)提交中
在过去的一个小时里,我已经逐步地进行了几项更改并提交了它们,但我刚刚意识到我几个提交之前忘记添加了一个更改的文件。
日志看起来是这样的:
GIT TidyUpRequests u:1 d:0> git log
commit fc6734b6351f6c36a587dba6dbd9d5efa30c09ce
作者:David Klein <>
日期:2010年4月27日 09:43:55 +0200
主程序现在同时测试两个网络服务
commit 8a2c6014c2b035e37aebd310a6393a1ecb39f463
作者:David Klein <>
日期:2010年4月27日 09:43:27 +0200
ISBNDBQueryHandler现在也使用了XPath.fs中的XPath函数
commit 06a504e277fd98d97eed4dad22dfa5933d81451f
作者:David Klein <>
日期:2010年4月27日 09:30:34 +0200
AmazonQueryHandler现在使用了在XPath.fs中定义的XPath Helper函数
commit a0865e28be35a3011d0b6091819ec32922dd2dd8 <--- 更改的文件应该放在这里
作者:David Klein <>
日期:2010年4月27日 09:29:53 +0200
分解出一些常见的XPath操作
有什么想法吗?
如何将更改后的文件添加到旧的(不是最后一个)提交中(How to add a changed file to an older (not last) commit in Git)
问题的原因:
有时候我们想要将一个更改后的文件添加到旧的提交中,而不改变旧提交的提交信息。这种情况下,我们可以使用git的一些命令来实现这个目标。
解决方法:
一种解决方法是使用以下命令:
git addgit commit --fixup=OLDCOMMIT git rebase --interactive --autosquash OLDCOMMIT^
其中,OLDCOMMIT是旧的提交的commit id。这个方法会将改动后的文件添加到指定的旧提交中,并保持旧提交的提交信息不变。
另一种解决方法是使用`git commit --squash=OLDCOMMIT`命令,在rebase过程中编辑旧提交的提交信息。
在使用这些命令时,需要注意的是在修改已经发布给其他人的提交之前,应该小心使用这些命令来重写git的历史记录。
以上是关于如何将更改后的文件添加到旧的提交中的详细解释。
为了自动化这个过程,我们还可以进行一些可选的配置:
- 设置GIT_SEQUENCE_EDITOR为一个脚本,以跳过交互式rebase的文本编辑器。
- 创建一个git别名,用于自动执行所有队列中的fixup操作。
- 创建一个git别名,用于自动执行单个提交的fixup操作。
以上是关于如何将更改后的文件添加到旧的提交中的解决方法。这些方法可以帮助我们在不改变旧提交的提交信息的情况下,将改动后的文件添加到旧提交中。但是,在使用这些命令时,需要小心操作,以避免对已经发布给其他人的提交造成影响。
如何将已更改的文件添加到Git中的较旧(非最后)提交?
有时候我们会遇到这样的情况:我们已经对一个文件进行了修改,但是这个修改并不是在最后一次提交中进行的。在这种情况下,我们需要将这个修改后的文件添加到一个较旧的提交中。
解决这个问题的方法是使用git rebase。具体步骤如下:
1. 使用git stash将要添加的更改存储起来。
2. 使用git rebase -i HEAD~10(或者你想要查看多少个提交之前的提交)。
3. 将涉及的提交(如a0865...)标记为编辑,即将行首的pick改为edit。不要删除其他行,因为那样会删除这些提交。
4. 保存rebase文件,git会退回到shell并等待你修复那个提交。
5. 使用git stash pop恢复之前存储的更改。
6. 使用git add
7. 使用git commit --amend --no-edit修改提交。
8. 使用git rebase --continue将剩下的提交重新写入新的提交。
9. 如果你标记了多个提交进行编辑,则重复从第2步开始的操作。
10. 如果你之前将修改的提交推送到其他地方,则需要再次使用--force选项来更新远程提交。然而,使用--force选项需要谨慎,如果你不小心并且没有与他人进行协调,很容易丢失其他人的工作。
如果你使用vim编辑器,你需要按下Insert键进行编辑,然后按下Esc键并输入:wq保存文件,退出编辑器并应用更改。或者,你可以使用git config --global core.editor "nano"命令配置一个用户友好的git提交编辑器。
如果你有未暂存的更改想要添加到编辑中,你可以在涉及的提交上恢复这些更改,这样就可以正常工作了。
注意:在将提交标记为编辑时,不要删除文件中列出的其他提交。如果删除了这些提交,你需要按照这些步骤来恢复它们。
另外,如果你已经将分支推送到远程仓库,那么在推送时你需要使用--force选项(注意使用--force选项可能会有风险,可能会丢失其他人的工作)。具体细节可以参考这里。
这个逐步指南非常有帮助!补充一下,第10步是执行git push -f命令将其推送到远程仓库。记住,在这种情况下需要使用-f选项来强制推送。此外,在上述步骤之后,所有N个提交的日期时间都将被重置。
我认为这是最清晰的解决方案,而无需修复提交!
虽然这个方法需要更多的命令,但我发现这是最清晰和易于理解的解决方案。谢谢!
很好的逐步指南。只需要注意,在第8步中,如果你没有将所有修改的文件添加到修改后的提交中,你可能需要再次执行git stash。
需要注意的是,如果你已经将这个分支推送到远程仓库,你将会编辑所有已经获取你的分支的人的历史记录。了解这个影响很重要。另外,如果你担心这些影响,了解--force-with-lease选项也是值得的。
以上就是如何将已更改的文件添加到较旧的提交中的解决方法。希望对你有所帮助!
如何将更改过的文件添加到旧的(不是最后一个)提交中的原因是,用户想要将一个更改过的文件添加到一个早期的提交中。解决方法是使用git rebase命令。
使用git 1.7版本,可以使用git rebase命令的一个简单方法:
1. 添加要提交的文件:git add $files
2. 创建一个新的提交,并重新使用"broken"提交的提交消息:git commit -c master~4
3. 在主题行中添加fixup!(如果要编辑提交消息,请使用squash!):fixup! Factored out some common XPath Operations
4. 使用git rebase -i --autosquash命令来修复提交:git rebase -i --autosquash
5. 如果出现错误提示“You asked me to rebase without telling me which branch you want to rebase against, and 'branch.master.merge'”,需要提供要rebase的提交:git rebase -i --autosquash HEAD~10
要自动添加fixup!或squash!用于--autosquash,请使用--fixup=
需要注意的是,创建一个新的提交时,可以使用master~4或HEAD~4或任何n-number,n是要更改的先前提交的数量。