Как удалить избыточные коммиты после 'git reset --soft' и 'git commit' - PullRequest
0 голосов
/ 23 октября 2019

Скажем, у меня есть репозиторий 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

Вопросы :

  1. Как мне действительно отказаться от старых коммитов (176d6d0 add c и 495991e add b)?
  2. Что за жаргон для этих старых коммитов (176d6d0 add c и 495991e add b), например онидействительно "недостижимые коммиты", "устаревшие коммиты"?
    Что такое жаргон действия, которое их удаляет, например, это "обрезка", "сборка мусора"?
  3. Люди делают git reset или git rebase -i все время. Если они каким-либо образом не удалят эти устаревшие коммиты, получат ли они вздутый репозиторий Git, особенно для БОЛЬШИХ проектов с большим количеством соавторов (таких как Chromium)?
  4. (приятно иметь) Пожалуйста объясните почему ваш ответ на 1 работы.

сноски:

[1] Я мог бы использовать git rebase -i, но я хочу сделать это программно, а не в интерактивном режиме, чтобы это могло бытьавтоматизировано по сценарию, но это не относится к делу)

[2] этот ответ не совсем отвечает на мои вопросы

Обновление:

Это удаляет все записи, показанные git reflog show, но я не совсем понимаю, почему от чтения документов .. и другие вопросы остаются (плз см. Выше)

    git reflog expire --expire=now --all

Однако старые коммиты, хотя и не показанные в git reflog show, по-прежнему git checkout -более возможны, если вы помните SHA, это означает, что эти старые коммиты на самом деле не удалены !!

Так что это не ответ.

1 Ответ

3 голосов
/ 23 октября 2019

Вам нужно прекратить действие reflogs и , а затем обрезать эти коммиты:

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

Как вы уже поняли, выполнение любой из вышеперечисленных команд не работает. Вам нужно запустить оба по порядку .

Но обычно вам не нужно делать это вручную - git отлично справляется с ведением этих записей и их очисткой вручную не добавляет особых преимуществ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...