git撤銷操作分析

2021-10-11 10:33:29 字數 2231 閱讀 7460

假設現在的 git 提交記錄有4次,在第二次的時候發生了bug,也就是introduced a bug注釋的地方。這個時候我們該如何處理呢?

417e4a9 commit 4

427d76b commit 3

1642475 introduced a bug

71d3ef7 commit 1

很重要的一點,revert 是對一次單一的 commit 的撤銷,並不是真正意義上的回滾。它不是通過移除專案中一次 commit 後面的所有提交來「回滾」之前的狀態。實際上那樣的操作在 git 上被叫做 reset,而不是 revert。

它解決的是如何撤銷已提交的被引入的改動,並生成內容來追加乙個新的提交,而不是從專案的歷史中移除這個提交,這避免了丟失歷史記錄,這對於專案的每一次修改的歷史記錄的完整性來說非常重要,並這是服務於可靠的多人協作開發的。

git revert 1642475
這句命令會撤銷這次 1642475 introduced a bug 所有被引入的改動,生成乙個新的commit,並應用在當前分支上。

428e4a2 revert introduced a bug

417e4a9 commit 4

427d76b commit 3

1642475 introduced a bug

71d3ef7 commit 1

如果 git revert 是以乙個"安全""的方式來撤銷改動,那你可以認為 git reset 是一種 危險 的方式。當你使用 git reset 後,將沒有辦法恢復原樣,它是乙個永恆的撤銷,因為那些 commits 不再被任何 ref 或 reflog 引用。在使用這個工具時請務必謹慎,因為它是 git 命令中唯一乙個潛在的使你的努力付諸東流的命令。

git reset 1642475
這句命令會撤銷 1642475 introduced a bug 之後所有被引入的改動,也就是撤銷 commit 3 和 commit 4 的提交。

執行之後 commit 4 和 commit 3 提交改動的**會從版本庫回到工作區,你可以執行 add 或者 commit 再次提交即可。注意:如果此時 commit 4 和 commit 3 在其他分支還有記錄,那麼將無法再次合併了,因為 commit 4 和 commit 3 已經永遠消失了。

切換分支是 git checkout 最常見的功能,不做介紹,這裡主要介紹下它在撤銷檔案改動上的應用。

git checkout 1642475
如果通過 checkout 指定到 commit 的時候,我們可以把 commit 號當作乙個零時分支,這個分支沒有1642475 introduced a bug 之後的提交記錄。在這裡可以進行任意的修改,因為所有的改動與本地倉庫的任一分支都無關,不會影響到其他的分支的狀態。

相當於建立了只有 commit1 和 commit2 的零時分支。

1642475 introduced a bug

71d3ef7 commit 1

如果基於這個零時的分支去開發新的功能,那麼需要通過下面的命令去建立乙個屬於我們自己的新分支。

git switch -c
新的分支可以提交到遠端倉庫中和其他分支合併,合併的時候如果遠端倉庫有 commit3 和 commit4 那麼這個是不會被刪除的。因為 checkout 命令不會影響到其他的分支的狀態。

假設你正在進行一次瘋狂的重構,但現在你不確定是否要繼續下去。這時你想要看一下開始這次重構之前專案原來的樣子。通過 checkout 切換到之前的版本id上。你可以檢視檔案、編譯專案、執行測試用例,甚至編輯檔案,完全不用擔心丟失專案「當前」的狀態,你在這裡做的所有修改都不會被儲存到專案中。當你想要繼續那次瘋狂的重構時,你需要回到專案的「當前」狀態。

git撤銷操作

當改動還沒有被提交之前,它們仍然被稱之為 本地 改動。這些在你的工作目錄的修改還仍然在本地,它們屬於未被提交的改動。有時候你對 進行了一些修改,但是發現這些改動帶來的問題比之前還要多。在這種情況下,你可能想要放棄你剛剛的改動,讓 恢復到你改動之前的版本,也就是上次提交之後的狀態。恢復乙個檔案到上次提...

Git撤銷操作

在使用git的過程中,我們可能想要撤銷某些操作,在不同的階段撤銷的命令有所區別。撤銷暫存的檔案 當我們使用git add命令將檔案新增到暫存區域後,想要取消新增的檔案,操作的命令如下 git reset head 檔名 撤銷對檔案的修改 當我們對檔案進行修改後 還沒有提交到暫存區 不想保留對它的修改...

Git撤銷操作

撤銷已經修改,但是還沒有新增到暫存區的操作 解決方案 有兩種情形 第一種情形 如果乙個檔案是新建的檔案,沒有untrack,說明這個檔案在庫里就沒有版本,所以用git rm 命令是匹配不到的。所以這種檔案是沒有跟蹤版本的,也就不能知道,到底修改了什麼。如果要跟蹤,就要add到tracking檔案列表...