Есть ли способ добавить определенную версию файла в индекс git? - PullRequest
3 голосов
/ 02 ноября 2008

Причина, по которой я спрашиваю это, заключается в том, что я случайно сделал git commit -a, который включал файл, который я еще не хотел зафиксировать. Моим решением было сделать следующее:

git reset --soft HEAD^
git reset -- file/with/changes_not_to_committed
git commit -C HEAD@{1}

Здесь я перемотал ветку одним коммитом, сохранив индекс и рабочее дерево, затем вытянул file/with/changes_not_to_committed из еще более старой ревизии в индекс, а затем зафиксировал индекс, используя сообщение коммита из предыдущей ветки руководитель коммит. Ни один из вызовов git-reset не затрагивает рабочую копию, поэтому мои изменения в file/with/changes_not_to_committed сохраняются, но больше не записываются в ревизии HEAD.

Однако было бы проще, если бы я мог вытащить file/with/changes_not_to_committed из ревизии HEAD^ прямо в индекс , не касаясь рабочей копии . Поскольку в противном случае индекс уже представляет состояние, которое я хочу, я мог бы просто изменить коммит HEAD, получив последовательность, подобную этой:

git magic-pony HEAD^ file/with/changes_not_to_committed
git commit --amend -C HEAD

Это почти , что я получу, заменив git-magic-pony на git-checkout, за исключением требования оставить рабочую копию нетронутой и обновить только индекс. Кажется, нет способа заставить git-checkout не трогать оба.

Мой вопрос: существует ли git-magic-pony, и если да, то под каким именем?

Ответы [ 3 ]

4 голосов
/ 03 ноября 2008

правый. Когда вы хотите переместить ревизии из HEAD или другую ревизию в индекс, вы используете «git reset REVISION - file» - тогда вы будете использовать «git commit --amend» для ревизии коммита. Так случилось, что в настоящее время я работаю над обзором, направленным на то, чтобы сделать более очевидным, как файлы могут быть перемещены из А в Б, вот так.

Конечно, гораздо более простой способ - запустить git-gui, нажать кнопку «Изменить последний коммит», затем щелкнуть значок рядом с файлом в разделе инвентаризации коммитов в графическом интерфейсе, а затем «зафиксировать». .

2 голосов
/ 02 ноября 2008

Итак, основываясь на ответе Грега Хьюгилла, git-magic-pony - это сценарий оболочки, который я написал бы так:

<code><del>#!/bin/sh
git ls-tree "$@" | while read mode type hash path ; do
    git update-index --cacheinfo $mode $hash "$path"
done</code></del>
2 голосов
/ 02 ноября 2008

Похоже, что вы можете сделать что-то подобное, используя git update-index:

git update-index --cacheinfo 100644 5be7e154c284fb8de8ddca0bb18b72a73089df9b filename

Вам потребуется получить режим (выше 100644) и sha1 файла, к которому вы хотите вернуться (вы можете получить эту информацию всего из git ls-tree). Тогда вы можете git commit --amend, и ваша рабочая копия не будет затронута.

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