修改任意 commit

  目前在公司實習,兩週了, 很多東西要學,博客更新慢,敬請見諒!

  上一篇博客中提到了未 push 的 commit 都可以修改, 這一篇就來演示一下。

修改上次提交的 commit

  git 直接提供了修改上次提交的 commit 的選項。

  1. 繼續 Hello-World 項目,上次 README 經過兩次提交, 變成了這個樣子:


  2. 現在我想修改第2個commit,把 new line 變成 add new line:


  3. 我就直接把 new line 改成 add new line 然後點擊保存; 接着我打開 Git Gui,選中"修正上次提交", 然後 緩存、提交:


  4. 最後,看一下版本歷史圖,master 分支依舊是兩個 commit:


  可以看到,修改上次提交的 commit 除了選中"修改上次提交", 別的步驟跟提交一個新的 commit 是一樣的, 而且既可以修改一個 commit 的變更, 也可以修改它的提交描述。

修改任意一個 commit

  修改任意一個 commit, git 沒有直接提供這樣的功能(如果你發現了, 一定要告訴我喔^_^),我是通過 rebase 和 修改上次提交 來實現的。

  1. 假設目標還是把 new line 修改爲 add new line, 但是,我已經做了一次新的提交(第3個commit):


  2. 我想在不丟棄第3個 commit 的同時修改第2個 commit, 下面我就開始一步步操作了,首先, 我 checkout 一個新分支 fix:


  3. 然後將 fix 分支 reset 到要修改的第2個分支:


  4. 然後修改上次提交的 commit, 將 new line 改成 add new line:


  5. 雖然修改了第2個commit,但這只是 fix 分支的改動, master 的第2個commit並沒有被修改(別急,還沒完呢):


  6. 這一步先切換到 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 正在糾結的地方:


  7. 衝突並不可怕,事實上這次衝突正是我所期待的, 因爲我需要 git 解決衝突的一種方式——skip 來丟棄 舊的 test commit(也就是 master 的第2個 commit):


  8. 這樣,master 分支的第2個 commit 就像是被修改了一樣 (實際上是用上了新的拋棄了舊的):


    fix 分支現在就可以刪掉了, 雖然在這一過程中它功不可沒O(∩_∩)O~。

關於解決衝突的更全面的介紹後續文章再給出。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章