Как вы скажите git только для того, чтобы скрыть индекс?
Я только что использовал "git add -p", чтобы добавить кучу изменений в индекс, и я просто понял, что пропустил изменение, которое должно было пройти в предыдущую фиксацию.
Я не могу совершить -amend сейчас, потому что я добавил все эти новые изменения в индекс, и я не хочу использовать 'git reset', чтобы удалить все из индекса, поскольку он потребуется возраст, чтобы снова добавить их обратно.
Мне нужно что-то вроде "git stash", который будет только индексировать индекс - он должен оставить рабочие файлы в покое. Затем я могу зачеркнуть индекс, добавить недостающее изменение, зафиксировать его, затем всплыть и нажать индекс назад, как он был.
Не похоже, что "git stash" может это сделать, но я что-то упускаю? Спасибо!
Ответы
Ответ 1
Самый простой способ - оставить это изменение прямо сейчас, сделать свой новый коммит, а затем создать вторую фиксацию только с тем изменением, которое вы хотите использовать для внесения изменений, а затем использовать git rebase -i
для раздачи его оригинальным HEAD.
Альтернативой было бы сделать вашу фиксацию, пометить ее, отбросить с помощью git reset HEAD^
, добавить, что одно изменение и изменить HEAD, а затем вишневое выделение вашей помеченной фиксации.
Ответ 2
Самое близкое, что я нашел, - git stash --patch
. Он проведет вас через каждое из изменений в рабочем дереве и индексе, позволяя вам выбрать, что делать.
http://www.kernel.org/pub/software/scm/git/docs/git-stash.html
Ответ 3
Решение 1:
Почему не обманывать?
git stash --keep-index
чтобы получить все оттуда, что не в индексе в настоящее время.
Тогда,
git stash
чтобы получить тайник только с тем, что было организовано.
git stash pop
первый штрих, добавьте свои изменения. Тогда,
git commit --amend ...
git reset --hard
чтобы очистить рабочее дерево, а затем
git stash pop --index
чтобы вернуть изменения индекса.
Ответ 4
Зафиксируйте свой индекс, создайте фиксацию исправления и переустановите с помощью автозапуска:
git commit
git add -p # add the change forgotten from HEAD^
git commit --fixup HEAD^ # commits with "fixup! <commit message of HEAD^>"
git rebase --autosquash -i HEAD~3
Ответ 5
git stash
действительно создает фиксацию с содержимым индекса, а затем добавляет фиксацию с содержимым всех отслеживаемых файлов поверх нее
Чтобы просмотреть это: создайте stash, а затем запустите
git log --oneline --graph [email protected]{0}
Итак, технически, когда вы запихиваете, вы можете вернуть свой индекс через [email protected]{0}^2
:
$ git show --name-only [email protected]{0}^2
$ git checkout [email protected]{0}^2 -- .
Вы также можете запрограммировать, а затем получить содержимое файлов с отслеживанием, но не добавленных:
# get the diff between what was indexed and the full stashed content :
$ git diff -p [email protected]{0}^2 [email protected]{0} > diff.patch
# apply this diff :
$ git apply diff.patch
Ответ 6
Это похоже на работу. Я не тестировал его во всех ситуациях, чтобы убедиться в его надежности:
git commit -m _stash && git stash && git reset HEAD^ && git stash save && git stash pop [email protected]{1}
Но он эффективно фиксирует индекс временно, задерживает рабочий каталог, возвращает фиксацию, чтобы вернуть индекс, сохраняет его как другой тайник, а затем снова восстанавливает исходный рабочий каталог из stash.
Это упрощается, добавляя это как псевдоним git:
[alias]
istash = "!f() { git commit -m _stash && git stash && git reset HEAD^ && git stash save $1 && git stash pop [email protected]{1}; }; f"
Это позволяет мне использовать его как:
git istash [optional stash name]
Ответ 7
magit для emacs позволяет вам сделать это командой magit-stash-index
Ответ 8
Мне пришлось это сделать, и в итоге я использовал некоторые параметры git stash, предназначенные для сценариев. git Создание stash позволяет создавать (но не применять) объект stash (который включает индекс). git stash store добавляет его в стек git stash, не делая git reset -hard, что git сохранение закладок неявно. Это позволит вам занести индекс, добавив в стек объект stash и сбросив индекс вручную:
# This will add an entry to your git stash stack, but *not* modify anything
git stash store -m "Stashed index" $(git stash create)
# This will reset the index, without touching the workspace.
git reset --mixed
Теперь вы эффективно спрятали свой индекс и можете сделать git stash pop -index, когда закончите.
Одно из предостережений заключается в том, что созданный объект статирования включает в себя как файлы, измененные в рабочей области, так и индекс, хотя вы только обеспокоены индексом, поэтому существует вероятность конфликтов, когда вы пытаетесь выскочить из стека, хотя вы использовали флаг --index (что означает "также применять индекс из кошелька", а не "применять индекс только от кошелька" ). В этом случае вы можете сделать "git reset --hard" перед появлением (потому что изменения, которые вы сбросили, также совпадают с изменениями, которые вы выскакиваете или применяете сразу после этого; не так опасно, как кажется.)
Ответ 9
git stash -k
git stash
git stash apply [email protected]{1}
git stash drop [email protected]{1}
Ответ 10
Вот немного script, с которым мне приходилось в прошлом делать именно это:
(Примечание: я изначально размещал это на fooobar.com/questions/410/..., но, похоже, это применимо и здесь. Это не совсем повторяющиеся вопросы, поэтому я думаю, что это служит в качестве возможного ответа в обоих случаях)
#!/bin/sh
# first, go to the root of the git repo
cd `git rev-parse --show-toplevel`
# create a commit with only the stuff in staging
INDEXTREE=`git write-tree`
INDEXCOMMIT=`echo "" | git commit-tree $INDEXTREE -p HEAD`
# create a child commit with the changes in the working tree
git add -A
WORKINGTREE=`git write-tree`
WORKINGCOMMIT=`echo "" | git commit-tree $WORKINGTREE -p $INDEXCOMMIT`
# get back to a clean state with no changes, staged or otherwise
git reset -q --hard
# Cherry-pick the index changes back to the index, and stash.
# This cherry-pick is guaranteed to suceed
git cherry-pick -n $INDEXCOMMIT
git stash
# Now cherry-pick the working tree changes. This cherry-pick may fail
# due to conflicts
git cherry-pick -n $WORKINGCOMMIT
CONFLICTS=`git ls-files -u`
if test -z "$CONFLICTS"; then
# If there are no conflicts, it safe to reset, so that
# any previously unstaged changes remain unstaged
#
# However, if there are conflicts, then we don't want to reset the files
# and lose the merge/conflict info.
git reset -q
fi
Вы можете сохранить приведенный выше script как git-stash-index
где-то на своем пути и затем вызывать его как git stash-index
# <hack hack hack>
git add <files that you want to stash>
git stash-index
Теперь в stash содержится новая запись, в которой содержатся только те изменения, которые вы поставили, а ваше рабочее дерево все еще содержит любые неустановленные изменения.
Основной вопрос заключается в том, что вы не сможете удалить удаленные индексированные изменения без возникновения конфликтов, например. если рабочее дерево содержит изменения, зависящие от индексированных изменений.
В этом случае любые такие конфликты будут оставлены в обычном невостребованном состоянии конфликта, аналогично тому, как это произошло после черешни/слияния.
например.
git init
echo blah >> "blah"
git add -A
git commit -m "blah"
echo "another blah" >> blah
git add -A
echo "yet another blah" >> blah
# now HEAD contains "blah", the index contains "blah\nanother blah"
# and the working tree contains "blah\nanother blah\nyetanother blah"
git stash-index
# A new stash is created containing "blah\nanother blah", and we are
# left with a merge conflict, which can be resolved to produce
# "blah\nyet another blah"
Ответ 11
Если вы добавляете файлы, готовые для фиксации в индекс, но хотите размещать только их, вы можете использовать функцию ниже.
>> momomo.com.git.stash.added
или же
>> momomo.com.git.stash.added "name of the stash"
Функция Баш:
momomo.com.git.stash.added() {
local name="$1";
if [[ "${name}" == "" ]]; then
name="$(date)"
fi
# This will stash everything, but let the added ones remain
# [email protected]{1}
git stash --keep-index
# This will stash only the remaining ones
# @[email protected]{0}
git stash save "${name}"
# Restore everything by applying the first push stash which is now at index 1
git stash apply [email protected]{1}
# Then drop it
git stash drop [email protected]{1}
# At the top of the stash should now be only the originally indexed files
}
Обратите внимание, что вам нужно будет снова добавить вещи в индекс сейчас.