git stash - > объединить скрытое изменение с текущими изменениями
Я внес некоторые изменения в свою ветку и понял, что забыл, что я спрятал некоторые другие необходимые изменения в указанной ветке. То, что я хочу, - это способ объединить мои скрытые изменения с текущими изменениями.
есть ли способ сделать это?
его больше для удобства, я в конечном итоге сдался и совершил сначала мои текущие изменения, а затем мои спрятанные изменения, но я предпочел бы получить их одним махом.
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 файлы и применять их оба-в случае, если его не дополнительный фиксации и не включает в себя десять шагов процесса :/