Как сделать резервную копию текущего состояния (включая неотслеживаемые файлы), чтобы при желании я мог проверить их позже - PullRequest
0 голосов
/ 23 сентября 2019

В настоящее время я работаю над фиксацией

У меня есть некоторые измененные файлы, а также файлы без отслеживания

Я хочу сохранить резервную копию текущего состояния для дальнейшего использования.

Я прочитал и нашел, в основном, с помощью stash.

Я хочу, чтобы все файлы на текущем этапе все были сохранены в тайнике.(включая неотслеживаемые, а также не удалять файлы gitignore)

Я обнаружил, что используется git stash.Это сохранит текущее состояние в stash и будет иметь чистое рабочее дерево после сохранения

Какой из следующих способов использовать git stash.

$ git stash save "my_stash" 

$ git git stash --include-untracked save "my_stash"

$ git stash --all save "my_stash"

затем мы снова получаем тайник с помощью

$ git apply

Также, если возможно, я хочу знать, как сделать то же самое, создавая ветку вместо тайника.

Ответы [ 3 ]

0 голосов
/ 23 сентября 2019

Ответ Марка в порядке, поэтому я просто добавлю следующее:

Если вы часто оказываетесь в этой позиции, желая по существу проверить несколько веток одновременно, чтобы сравнить изменения и поработать над различными изменениями, тогда вы можетехочу использовать рабочие деревья .Они позволяют легко проверять несколько веток без дополнительных затрат на несколько локальных репозиториев (что может быть очень дорого на диске).Вы также можете использовать рабочее дерево, чтобы временно переключиться на другую ветку, выполнить некоторую работу, а затем вернуться без необходимости создавать временные ветви или помнить, что вы спрятали некоторые изменения.

0 голосов
/ 24 сентября 2019

Это то, что я искал

Я в настоящее время нахожусь в ветке мастеров, я нахожусь между работой с некоторыми неподготовленными файлами, а также с некоторыми неотслеживаемыми файлами.Я хочу сохранить свое текущее состояние в новую ветку, просто как резервную копию / ссылку на будущее.

Итак, я сделал stash push --include-untracked в моем текущем состоянии, а затем create and checkout to a new branch и stash apply там и подготовил все файлына add -A, а затем commit changes.Снова come back to master branch и снова сделайте stash apply там.

там

$ git status

On branch master

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   filename1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    filename2

no changes added to commit (use "git add" and/or "git commit -a")

$ git stash push --include-untracked

One stash is run

$ git status
On branch master
Your branch is up to date with 'origin/master'.

nothing to commit, working tree clean

$ git checkout -b backup_branch
Switched to a new branch 'backup_branch'

$ git stash apply
On branch backup_branch


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   filename1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    filename2


$ git status
On branch backup_branch


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   filename1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    filename2

$ git add -A

$ git commit -m "Saved for backup"

$ git checkout master
Switched to branch 'master'
Your branch is up to date with 'origin/master'.

$ git stash apply
On branch origin/master


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   filename1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    filename2

$ git status
On branch origin/master


Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

    modified:   filename1

Untracked files:
  (use "git add <file>..." to include in what will be committed)

    filename2

Теперь я вернулся с тем же рабочим режиссером.С резервной копией моего текущего состояния в новой ветке backup_branch

0 голосов
/ 23 сентября 2019

Имейте в виду, что когда вы говорите «на текущем этапе», это подразумевает то, что вы явно не имеете в виду.(staged означает «в индексе» в git-говорить; это определенно не включает в себя неотслеживаемые файлы - и не внесенные в них изменения в отслеживаемых файлах.)

Что касается какой команды использовать,Вы не должны использовать git stash save;он устарел, поэтому вместо него следует использовать git stash push.(push - это значение по умолчанию, поэтому вам не нужно вообще называть какую-либо подкоманду при создании тайника.)

Я не уверен, что вы имеете в виду, как вы хотите обрабатывать игнорируемые файлы.Если вы хотите, чтобы игнорируемые файлы были включены в stash

git stash --all

, если вы не хотите, чтобы игнорируемые файлы в stash (и поэтому хотели, чтобы они оставались в рабочем дереве)

git stash -u

И когда вы apply храните тайник, вам нужно сообщить git, что вы хотите восстановить индекс

git stash apply --index

Обратите внимание, что это работает только тогда, когда процесс применения хранилища не вызывает конфликтов;для этого использования он не должен конфликтовать, но если вы примените к другому коммиту, отличному от того, где был создан тайник, он может.

Чтобы создать ветку вместо тайника:

Здесь вы можете использовать ярлык, потому что тайник - это действительно набор коммитов со специально обработанной ссылкой.Таким образом, вы можете создать тайник как обычно, тогда

git checkout stash
git checkout -b my_branch
git stash drop

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

Если вы вообще не хотите использовать команду stash, тогда это сложнее.Вы можете фиксировать только поэтапные изменения, поэтому вам нужно будет сделать что-то вроде

git checkout -b my_branch
git commit -m "staged changes"
git commit -a -m "unstaged changes"
# if you want a commit with only the non-ignored
# untracked files
git add :/:
git commit -m "untracked files'
# if you want a single commit with all untracked
# files (ignored or not), then skip the previous
# command and run this; if you want a separate 
# commit for ignored files, run the previous
# command and *then* run this:
git add -f :/:
git commit -m "ignored files"

(Обратите внимание, что вы можете даже объединить неустановленные, неотслеживаемые и игнорируемые файлы в один коммит (хотя stash делаетнет), но вам действительно нужно зафиксировать поэтапные изменения отдельно, чтобы позже можно было точно восстановить индекс.)

Затем необходимо восстановить рабочее состояние и продолжить работу.Точные команды зависят от того, какую из команд вы выполнили.Сначала вы хотите отсоединиться от своего подобного тайнику сарая

git checkout --detach

Затем восстановите индекс с поэтапными изменениями.Если вы создали все 4 коммита, это было бы

git reset --mixed HEAD~3

Если вы создали только один коммит для неотслеживаемых файлов

git reset --mixed HEAD~2

(Или, если вы создали только один коммит для неизмененных изменений и неотслеживаемых / игнорируемых файлов, это будет

git reset --mixed HEAD~1

или эквивалентный.)

Затем переместите HEAD до конца пути от ветви

git reset --soft HEAD~1

Наконец, проверьте вашу рабочую ветку снова;например, если вы начали на мастере

git checkout master

После всего этого вы сохранили всю ту же информацию, что и тайник;но у вас все еще нет автоматизации команды stash, чтобы помочь вам, поэтому в будущем, если вы захотите восстановить это состояние снова, вам придется очистить рабочее дерево, проверить ветвь, похожую на stash, и повторитьснова вся процедура отсоединения / сброса / извлечения.

И если вы хотите применить эти изменения к другому базовому коммиту (стандартная функциональность для stash), вам придется сначала перебазировать ветвь, подобную stash, кНовый коммит, а затем восстановите изменения там.

...