如何修改git中的指定提交?
我通常会提交一个提交列表供审查。 如果我有:
HEAD
Commit3
Commit2
Commit1
我知道我可以使用git commit --amend
修改头部提交,但是如何修改Commit1
,因为它不是HEAD
提交?
例如,你可以使用git rebase,如果你想修改回提交bbc643cd
,运行
$ git rebase --interactive 'bbc643cd^'
在默认编辑器中,在要修改其提交的行中修改pick
以edit
。 进行更改,然后用与之前相同的消息进行提交:
$ git commit --all --amend --no-edit
修改提交,并在此之后
$ git rebase --continue
返回到前面的头提交。
警告 :请注意,这将改变该提交的SHA-1 以及所有的孩子 - 换句话说,这将重写这一点的历史。 如果您使用命令git push --force
推送,则可以打破回收站的做法
使用真棒互动式底座:
git rebase -i @~9 # Show the last 9 commits in a text editor
找到你想要的提交,将pick
改为e
( edit
),然后保存并关闭文件。 Git会回退到该提交,让您可以:
git commit --amend
来进行更改或 git reset @~
放弃最后一次提交,而不是对文件的更改(即将您带到您编辑文件但尚未提交时的位置)。 后者对于做更复杂的事情很有用,如分裂为多个提交。
然后,运行git rebase --continue
,然后Git将在修改的提交之上重播后续更改。 您可能会被要求解决一些合并冲突。
注: @
是HEAD
缩写, ~
是指定提交之前的提交。
阅读更多关于在Git文档中重写历史记录的信息。
不要害怕改变基础
ProTip™:不要害怕尝试重写历史记录的“危险”命令* - 默认情况下,Git不会在90天内删除您的提交; 你可以在reflog中找到它们:
$ git reset @~3 # go back 3 commits
$ git reflog
c4f708b HEAD@{0}: reset: moving to @~3
2c52489 HEAD@{1}: commit: more changes
4a5246d HEAD@{2}: commit: make important changes
e8571e4 HEAD@{3}: commit: make some changes
... earlier commits ...
$ git reset 2c52489
... and you're back where you started
*注意像--hard
和--force
这样的选项 - 他们可以丢弃数据。
*另外,不要在你正在合作的分支上重写历史记录。
在很多系统上, git rebase -i
会默认打开Vim。 Vim不能像大多数现代文本编辑器一样工作,所以请看看如何使用Vim进行rebase。 如果你更愿意使用不同的编辑器,可以使用git config --global core.editor your-favorite-text-editor
。
使用--autosquash
交互式--autosquash
是我经常使用的,当我需要在历史中更深入地--autosquash
以前的提交时。 它基本上加速了ZelluX的答案所展示的过程,并且在您需要编辑多个提交时特别方便。
从文档:
--autosquash
当提交日志消息以“squash!...”(或“fixup!...”)开始,并且存在一个标题以相同的开头的提交时,自动修改rebase -i的待办事项列表,以便提交标记为压扁之后立即进行修改
假设你有一个如下所示的历史记录:
$ git log --graph --oneline
* b42d293 Commit3
* e8adec4 Commit2
* faaf19f Commit1
并且您有要更改为Commit2的更改,然后使用提交更改
$ git commit -m "fixup! Commit2"
或者,您可以使用commit-sha而不是提交消息,所以"fixup! e8adec4
或甚至只是提交消息的前缀。
然后在之前的提交上启动交互式底图
$ git rebase e8adec4^ -i --autosquash
你的编辑器将打开已经正确命令的提交
pick e8adec4 Commit2
fixup 54e1a99 fixup! Commit2
pick b42d293 Commit3
所有你需要做的就是保存并退出
链接地址: http://www.djcxy.com/p/547.html上一篇: How to modify a specified commit in git?
下一篇: Ignore files that have already been committed to a Git repository