如何修改较早的Git提交?
如何修改较早的Git提交?
我已经做了3个git提交,但还没有推送。
我如何修改旧的提交(ddc6859af44)和(47175e84c),它们不是最新的提交?
$git log commit f4074f289b8a49250b15a4f25ca4b46017454781 Date: Tue Jan 10 10:57:27 2012 -0800 commit ddc6859af448b8fd2e86dd0437c47b6014380a7f Date: Mon Jan 9 16:29:30 2012 -0800 commit 47175e84c2cb7e47520f7dde824718eae3624550 Date: Mon Jan 9 13:13:22 2012 -0800
在使用rebase-i命令时,我想要将我准备好的提交和一个较旧的提交合并,但是我惊讶地发现rebase-i提示我有未提交的更改。但是我不想再次进行更改,也不想在较旧的提交中指定edit选项。所以解决方案非常简单和直接:
1. 准备好要更新的较旧提交,添加并提交它
2. 运行git rebase -i <要修改的提交>^
命令-注意^
,这样你就可以在文本编辑器中看到该提交
3. 你会得到类似于以下的内容:
pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
pick e23d23a fix indentation of jgroups.xml
4. 现在要将e23d23a与8c83e24合并,你可以更改行的顺序并使用squash命令,例如:
pick 8c83e24 use substitution instead of separate subsystems file to avoid jgroups.xml and jgroups-e2.xml going out of sync
squash e23d23a fix indentation of jgroups.xml
pick 799ce28 generate ec2 configuration out of subsystems-ha.xml and subsystems-full-ha.xml to avoid discrepancies
5. 编辑并保存文件,然后会进入一个编辑器以合并提交消息。进行合并后保存/退出文本文档
6. 完成,你的提交已经被修改了。
感谢http://git-scm.com/book/en/Git-Tools-Rewriting-History提供的方法。还有其他有用的演示git技巧。
我之前没有意识到可以在rebase文件中重新排序行。这是一个很棒的提示!
如果有人不熟悉在终端中编辑文件的vi命令,这个页面是一个非常好的参考cs.colostate.edu/helpdocs/vi.html
在重新排序行时要小心:如果你不小心剪切并忘记粘贴:那个提交就会消失!
如何修改旧的Git提交?
出现的原因:
有时候我们在提交代码之后会发现有一些错误或者需要做一些调整。在Git中,一旦提交代码就无法直接修改。因此,我们需要找到一种方法来修改旧的Git提交。
解决方法:
一种方法是使用git rebase -i
命令,这是一种手动的方法,非常有用,特别是当你想要重新排列多个提交,包括合并或拆分其中一些提交时。它的主要优点是你不必一次决定每个提交的命运。在整个过程中,你还可以使用所有Git的功能,而不像在rebase过程中那样受限。例如,你可以随时显示原始和重写历史的日志,甚至可以进行另一次rebase!
具体步骤如下:
1. 首先,我们假设你的历史记录如下:
x - A - B - C
| |
| master
|
origin/master
2. 然后,我们将重新创建它,变为:
x - A - B*- C'
| |
| master
|
origin/master
3. 执行以下命令:
git checkout B # 将工作树切换到提交B的状态 git reset --soft A # 告诉Git我们正在处理B提交之前的工作 git checkout -b rewrite-history # 切换到一个新的分支以备份历史记录
4. 现在,可以使用git add
(git add -i
,git stash
等)来改进旧的提交。甚至可以将旧的提交拆分成两个或更多个。
5. 执行以下命令:
git commit # 重新创建提交B(结果为B*) git cherry-pick C # 将C复制到新的分支(结果为C')
6. 最后的结果如下:
x - A - B - C
| \ |
| \ master
| \
| B*- C'
| |
| rewrite-history
|
origin/master
7. 最后,可以使用以下命令完成操作:
git checkout master git reset --hard rewrite-history # 将此分支设置为master
或者只使用一个命令:
git branch -f master # 将此位置设置为master分支的新末端
8. 最后一步是删除临时分支:
git branch -d rewrite-history
到此为止,你现在可以push
你的进度了。
如何修改较早的Git提交?
在使用Git进行版本控制时,有时我们可能需要修改之前的提交。这可能是由于错误的提交信息、遗漏的文件或不完整的更改等原因。在这种情况下,我们可以使用Git的rebase命令来修改较早的提交。
下面是修改较早的Git提交的步骤:
1. 打开终端或命令行工具,并导航到项目目录。
2. 运行以下命令来打开交互式rebase界面:
git rebase -i HEAD^^^
3. 在rebase界面中,将需要修改的提交标记为"edit"或"e"(替换"pick")。然后保存并退出编辑器。
4. 现在进行必要的更改,可以添加、删除或修改文件。
5. 运行以下命令来添加更改到暂存区:
git add .
6. 运行以下命令继续rebase过程:
git rebase --continue
7. 如果需要删除某些选项,可以在提交命令中省略它们。如果需要调整提交信息,可以省略"--no-edit"选项。
8. 在rebase过程中,可以使用git stash命令或git stash -p(交互式)命令方便地应用更改到较早的提交。
9. 注意,不需要在git add后再执行git commit命令,只需要运行git rebase --continue即可保留更改。
10. 如果您使用的是像zsh这样的shell,可能会将"^"解析为模式。在这种情况下,可以使用"~"代替。
11. 如果要向后回退到最后N个提交,可以使用以下命令代替:
git rebase -i HEAD~N
通过以上步骤,我们可以修改较早的Git提交。这对于纠正错误或完善项目的历史记录非常有用。