[英]How can I to do `git reset --soft <some-commit>` bypassing commits with merge?
[英]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 c
和495991e 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 show
和git 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
問題:
176d6d0 add c
和495991e add b
)?176d6d0 add c
和495991e add b
),例如它們真的是“無法訪問的提交”、“陳舊的提交”嗎?git reset
或git rebase -i
。 如果他們不以某種方式刪除這些陳舊的提交,他們會得到一個臃腫的 Git 回購,特別是對於有很多合作者的大型項目(如 Chromium)?腳注:
[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.