Скажем, у меня есть репозиторий 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
-able:
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 работы.
сноски:
[1] Я мог бы использовать git rebase -i
, но я хочу сделать это программно, а не в интерактивном режиме, чтобы это могло бытьавтоматизировано по сценарию, но это не относится к делу)
[2] этот ответ не совсем отвечает на мои вопросы
Обновление:
Это удаляет все записи, показанные git reflog show
, но я не совсем понимаю, почему от чтения документов .. и другие вопросы остаются (плз см. Выше)
git reflog expire --expire=now --all
Однако старые коммиты, хотя и не показанные в git reflog show
, по-прежнему git checkout
-более возможны, если вы помните SHA, это означает, что эти старые коммиты на самом деле не удалены !!
Так что это не ответ.