Подтвердить что ты не робот

Как вы скажите git только для того, чтобы скрыть индекс?

Я только что использовал "git add -p", чтобы добавить кучу изменений в индекс, и я просто понял, что пропустил изменение, которое должно было пройти в предыдущую фиксацию.

Я не могу совершить -amend сейчас, потому что я добавил все эти новые изменения в индекс, и я не хочу использовать 'git reset', чтобы удалить все из индекса, поскольку он потребуется возраст, чтобы снова добавить их обратно.

Мне нужно что-то вроде "git stash", который будет только индексировать индекс - он должен оставить рабочие файлы в покое. Затем я могу зачеркнуть индекс, добавить недостающее изменение, зафиксировать его, затем всплыть и нажать индекс назад, как он был.

Не похоже, что "git stash" может это сделать, но я что-то упускаю? Спасибо!

4b9b3361

Ответ 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" перед появлением (потому что изменения, которые вы сбросили, также совпадают с изменениями, которые вы выскакиваете или применяете сразу после этого; не так опасно, как кажется.)

Ответ 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
}

Обратите внимание, что вам нужно будет снова добавить вещи в индекс сейчас.