git stash - > объединить скрытое изменение с текущими изменениями


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

есть ли способ сделать это?

его больше для удобства, я в конечном итоге сдался и совершил сначала мои текущие изменения, а затем мои спрятанные изменения, но я предпочел бы получить их одним махом.

5 123

5 ответов:

Я только что обнаружил, что если ваши незафиксированные изменения добавляются в индекс (т. е. "staged", используя "git add ..."), то "git stash apply "(и, предположительно," git stash pop") на самом деле сделает правильное слияние. Если нет никаких конфликтов, вы Золотой. Если нет, разрешите их как обычно с помощью "git mergetool" или вручную с помощью редактора.

чтобы быть ясным, это процесс, о котором я говорю:

mkdir test-repo && cd test-repo && git init
echo test > test.txt
git add test.txt && git commit -m "Initial version"

# here's the interesting part:

# make a local change and stash it:
echo test2 > test.txt
git stash

# make a different local change:
echo test3 > test.txt

# try to apply the previous changes:
git stash apply
# git complains "Cannot apply to a dirty working tree, please stage your changes"

# add "test3" changes to the index, then re-try the stash:
git add test.txt
git stash apply
# git says: "Auto-merging test.txt"
# git says: "CONFLICT (content): Merge conflict in test.txt"

... вероятно то, что вы ищете.

под управлением git stash pop или git stash apply по сути является слиянием. Вам не нужно было фиксировать текущие изменения, если файлы, измененные в тайнике, также не были изменены в рабочей копии, и в этом случае вы бы увидели это сообщение об ошибке:

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

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

то, что я хочу, это способ объединить мои спрятанные изменения с текущим изменения

вот еще один вариант, чтобы сделать это:

git stash show -p|git apply
git stash drop

git stash show -p покажет патч последнего сохраненного тайника. git apply будет его применять. После завершения слияния объединенный тайник можно удалить с помощью git stash drop.

как предложил @Brandan, вот что мне нужно было сделать, чтобы обойти

error: Your local changes to the following files would be overwritten by merge:
       file.txt
Please, commit your changes or stash them before you can merge.
Aborting

выполните этот процесс:

git status  # local changes to `file`
git stash list  # further changes to `file` we want to merge
git commit -m "WIP" file
git stash pop
git commit -m "WIP2" file
git rebase -i HEAD^^  # I always use interactive rebase -- I'm sure you could do this in a single command with the simplicity of this process -- basically squash HEAD into HEAD^
# mark the second commit to squash into the first using your EDITOR
git reset HEAD^

и вы останетесь с полностью слилась local изменения file, готовы сделать дальнейшую работу / очистку или сделать один хороший коммит. Или, если вы знаете объединенное содержимое file будет правильно, вы можете написать подходящее сообщение и пропустить git reset HEAD^.

другой вариант-сделать еще один" git stash " локальных незафиксированных изменений, а затем объединить два git stashes. К сожалению, у git, похоже, нет способа легко объединить два тайника. Поэтому один вариант-создать два .diff файлы и применять их оба-в случае, если его не дополнительный фиксации и не включает в себя десять шагов процесса :/

как: https://stackoverflow.com/a/9658688/32453