簡體   English   中英

如何在“git reset --soft”和“git commit”之后刪除多余的提交

[英]How to remove redundant commits after 'git reset --soft' and 'git commit'

假設我有一個 Git 回購設置如下:

$ git init test && cd test
$ touch a && git add . && git commit -m "add a"
$ touch b && git add . && git commit -m "add b"
$ touch c && git add . && git commit -m "add c"
$
$ git --no-pager log --pretty="%h %s" # print short SHA and message subject
176d6d0 add c
495991e add b
1d8444a add a

現在由於某些原因,我想將最近的 2 個提交( 176d6d0 add c495991e add b )壓縮為一個 [1]:

$ git reset --soft 1d8444a # go back to the first commit ("add a")
$ git add . && git commit -m "bc"
$
$ git --no-pager log --pretty="%h %s"
c01e64a bc
1d8444a add a

是的,看起來我們已經完成了!

不完全的!

如果我們查看git reflog show ,舊的提交仍然存在:

$ git --no-pager reflog show
c01e64a (HEAD -> master) HEAD@{0}: commit: bc
1d8444a HEAD@{1}: reset: moving to 1d8444a9747bd5e4176c
176d6d0 HEAD@{2}: commit: add c                           # old commit
495991e HEAD@{3}: commit: add b                           # old commit
1d8444a HEAD@{4}: commit (initial): add a

如果我們簽出一個舊的提交,我們仍然可以恢復它。

$ git --no-pager show -s 176d6d0 # this is the "add c" commit
commit 176d6d0aa92b230f4dd1e4ed8ae028b7c5fbb2d5
Author: XXX <XXX@XXX.com>
Date:   Tue Oct 22 22:19:23 2019 -0400

    add c

$ git checkout 176d6d0
Note: checking out '176d6d0'.

You are in 'detached HEAD' state. You can look around
... # omitted

HEAD is now at 176d6d0 add c

我試圖刪除這些陳舊的舊提交,但這些都不起作用,舊提交在git reflog showgit checkout中仍然可見:

git gc
git gc --prune=all
git reflog expire --all
git reflog expire --expire=now
git reflog expire --expire-unreachable=now
git reflog expire --expire=now --all # tricky, see update below

問題

  1. 我應該如何真正丟棄舊的提交( 176d6d0 add c495991e add b )?
  2. 這些舊提交的行話是什么( 176d6d0 add c495991e add b ),例如它們真的是“無法訪問的提交”、“陳舊的提交”嗎?
    刪除它們的行為的行話是什么,例如“修剪”、“垃圾收集”?
  3. 人們一直在做git resetgit rebase -i 如果他們不以某種方式刪除這些陳舊的提交,他們會得到一個臃腫的 Git 回購,特別是對於有很多合作者的大型項目(如 Chromium)?
  4. (很高興)請解釋為什么您對 1 的回答有效。

腳注:

[1] 我可以使用git rebase -i但我想以編程方式而不是交互方式執行它,以便它可以通過腳本自動化,但這不是重點)

[2]這個答案並不能完全回答我的問題

更新:

這將刪除git reflog show顯示的所有條目,但我不太明白為什么閱讀文檔..還有其他問題(請參見上文)

 git reflog expire --expire=now --all

然而,舊的提交,雖然沒有顯示在git reflog show中,但如果你記得 SHA,仍然是git checkout -able,這意味着這些舊的提交並沒有真正被刪除!

所以這不是答案。

您需要使 reflogs 過期,然后修剪這些提交:

git reflog expire --expire=now --all
git gc --prune=now

正如您所知道的,運行上述任何一個命令都不起作用。 您需要按順序運行兩者。

但通常您不需要手動執行此操作 - git 擅長維護這些記錄,手動清理它們並不會帶來太多好處。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM