目前在公司實習,兩週了, 很多東西要學,博客更新慢,敬請見諒!
上一篇博客中提到了未 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~。
關於解決衝突的更全面的介紹後續文章再給出。