2019年10月25日 星期五

[Git 文章收集] 【狀況題】想要刪除某幾個 Commit 或是調整 Commit 的順序

Source From Here
調整 Commit 順序
要在 Git 裡調整 Commit 的順序其實滿簡單的,假設這是目前的歷史紀錄:
# git log --oneline | head -n 8
ae130cb C3
f6d9db2 C2
406d405 C1
654be0d D4
358d8f5 D3
80458d5 D2
8813750 D1
bb134c5 Update 105M.img


# cat test_dev.txt
D4

# cat test_ot.txt
C2
C3

我想讓所有跟 C* 的 Commit 都移到 D* 相關的 Commit 的後面,一樣的 Rebase 起手式:
# git rebase -i bb134c5

這時候跳出來的編輯器的 Commit 內容是這樣:
  1. pick 8813750 D1  
  2. pick 80458d5 D2  
  3. pick 358d8f5 D3  
  4. pick 654be0d D4  
  5. pick 406d405 C1  
  6. pick f6d9db2 C2  
  7. pick ae130cb C3  
別忘了,在 Rebase 狀態看到的這個紀錄是跟我們平常看的紀錄是反過來的,越新的 Commit 在越下面。接下來我只要這樣移動一下:
  1. pick 406d405 C1  
  2. pick f6d9db2 C2  
  3. pick ae130cb C3  
  4. pick 8813750 D1  
  5. pick 80458d5 D2  
  6. pick 358d8f5 D3  
  7. pick 654be0d D4  
是的,就是只要做這樣的修改,存檔、離開後,Rebase 就會做它的工作:
# git rebase -i bb134c5
Successfully rebased and updated refs/heads/dev.

搞定!現在的歷史紀錄就變這樣了:
# cat test_dev.txt
D4

# cat test_ot.txt
C2
C3


# git log --oneline | head -n 8
a80017d D4
ab4ac41 D3
5969bd5 D2
6e75690 D1
bd2467c C3
d7e3b3a C2
9b0b797 C1
bb134c5 Update 105M.img

所有 C* 相關的 Commit 都搬到 D* 後面了。

刪除 Commit
要刪除 Commit 更簡單了,在 Rebase 的過程中,把原本的 pick 改成 drop,或甚至直接把那行刪掉也可以。例如原本的 Commit 是這樣:
# echo 'D1' > test_dev.txt
# git add test_dev.txt
# git commit -m 'D1'

# echo 'D2' >> test_dev.txt
# git add -u
# git commit -m 'D2'

# echo 'D3' >> test_dev.txt
# git add -u
# git commit -m 'D3'
# cat test_dev.txt
D1
D2
D3


// 檢視目前提交紀錄
# git log --oneline | head -n 3
cd5f9a8 D3
b946f59 D2
186342a D1

如果我想把 commit D2 刪掉,則可以如下操作:
// 從 commit 186342a 前一個 commit 進行 rebase
# git rebase -i 186342a^
// 移除 pick b946f59 D2
  1. pick 186342a D1  
  2. pick cd5f9a8 D3  
1 file changed, 1 insertion(+)
Successfully rebased and updated refs/heads/dev.


// 檢視移除 commit D2 對檔案 test_dev.txt 的影響
# cat test_dev.txt
D1
D3


// 確認 commit D2 已經被移除
# git log --oneline | head -n 2
f80c163 D3
186342a D1

Supplement
Reset、Revert 跟 Rebase 指令有什麼差別?

沒有留言:

張貼留言

[Git 常見問題] error: The following untracked working tree files would be overwritten by merge

  Source From  Here 方案1: // x -----删除忽略文件已经对 git 来说不识别的文件 // d -----删除未被添加到 git 的路径中的文件 // f -----强制运行 #   git clean -d -fx 方案2: 今天在服务器上  gi...