目前在公司实习,两周了, 很多东西要学,博客更新慢,敬请见谅!
上一篇博客中提到了未 push 的 commit 都可以修改, 这一篇就来演示一下。
修改上次提交的 commit
git 直接提供了修改上次提交的 commit 的选项。
-
继续 Hello-World 项目,上次 README 经过两次提交, 变成了这个样子:
-
现在我想修改第2个commit,把 new line 变成 add new line:
-
我就直接把 new line 改成 add new line 然后点击保存; 接着我打开 Git Gui,选中"修正上次提交", 然后 缓存、提交:
-
最后,看一下版本历史图,master 分支依旧是两个 commit:
可以看到,修改上次提交的 commit 除了选中"修改上次提交", 别的步骤跟提交一个新的 commit 是一样的, 而且既可以修改一个 commit 的变更, 也可以修改它的提交描述。
修改任意一个 commit
修改任意一个 commit, git 没有直接提供这样的功能(如果你发现了, 一定要告诉我喔^_^),我是通过 rebase 和 修改上次提交 来实现的。
-
假设目标还是把 new line 修改为 add new line, 但是,我已经做了一次新的提交(第3个commit):
-
我想在不丢弃第3个 commit 的同时修改第2个 commit, 下面我就开始一步步操作了,首先, 我 checkout 一个新分支 fix:
-
然后将 fix 分支 reset 到要修改的第2个分支:
-
然后修改上次提交的 commit, 将 new line 改成 add new line:
-
虽然修改了第2个commit,但这只是 fix 分支的改动, master 的第2个commit并没有被修改(别急,还没完呢):
-
这一步先切换到 master 分支, 然后 rebase 合并 fix 分支:
请注意:这一次合并并不顺利, 发生了合并冲突。冲突是怎么发生的呢?
master 的第2个 commit 在第2行添加了一句"new line", 而 fix 的第2个 commit 却在第2行添加了一句"add new line", 要将这两个 commit 合并起来有多种可行方案:-
方案一:两者都保留,fix 在前
Hello World! add new line new line
-
方案二:两者都保留,fix 在后
Hello World! new line add new line
-
方案三:保留 fix
Hello World! add new line
-
方案四:保留 master
Hello World! new line
git 不知道我们到底想要哪种方案, 它也不敢擅自做主(否则会留下隐患), 所以它就告诉我们 Merge conflict, 在此时的 README 中,我们能看到 git 正在纠结的地方:
-
-
冲突并不可怕,事实上这次冲突正是我所期待的, 因为我需要 git 解决冲突的一种方式——skip 来丢弃 旧的 test commit(也就是 master 的第2个 commit):
-
这样,master 分支的第2个 commit 就像是被修改了一样 (实际上是用上了新的抛弃了旧的):
fix 分支现在就可以删掉了, 虽然在这一过程中它功不可没O(∩_∩)O~。
关于解决冲突的更全面的介绍后续文章再给出。