Git stash → слить спряженное изменение с текущими изменениями
Я внес некоторые изменения в свою ветку и понял, что забыл, что я наложил некоторые другие необходимые изменения в указанную ветку. То, что я хочу, - это способ объединить мои спрятанные изменения с текущими изменениями.
Есть ли способ сделать это?
Его больше для удобства я в конце концов сдался и перенял первые мои текущие изменения, затем мои спрятанные изменения, но я предпочел бы получить их одним махом.
Ответы
Ответ 1
Я только что обнаружил, что если ваши незафиксированные изменения будут добавлены в индекс (т.е. "Поэтапно", с использованием 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 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 add
.
Ответ 2
Запуск git stash pop
или git stash apply
по существу является слиянием. Вам не нужно было бы фиксировать текущие изменения, если только файлы, измененные в stash, также не будут изменены в рабочей копии, и в этом случае вы бы увидели это сообщение об ошибке:
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
, если вам действительно не нужны две фиксации, но это может быть больше проблем, которые стоит.
Ответ 3
То, что я хочу, - это способ объединить мои спрятанные изменения с текущим изменения
Вот еще один вариант:
git stash show -p|git apply
git stash drop
git stash show -p
покажет патч последнего сохраненного заклада. git apply
применит его. После того, как слияние будет завершено, слияние может быть сброшено с помощью git stash drop
.
Ответ 4
Как предложил @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^
И вы останетесь с полностью объединенными локальными изменениями в file
, готовыми к дальнейшей работе/очистке или сделайте одно хорошее совершение. Или, если вы знаете, что объединенное содержимое file
будет правильным, вы могли бы написать фиктивное сообщение и пропустить git reset HEAD^
.
Ответ 5
Чтобы сделать это, сначала git add
git stash apply <stash code>
затем git stash apply <stash code>
. Это самый простой способ.
Ответ 6
Может быть, это не самая плохая идея слияния (через difftool) из... да... ветки!
> current_branch=$(git status | head -n1 | cut -d' ' -f3)
> stash_branch="$current_branch-stash-$(date +%yy%mm%dd-%Hh%M)"
> git stash branch $stash_branch
> git checkout $current_branch
> git difftool $stash_branch
Ответ 7
Другой вариант - сделать еще один "git stash" локальных незафиксированных изменений, а затем объединить два git stashes. К сожалению, git, похоже, не имеет возможности легко объединить два закладок. Таким образом, один из вариантов состоит в том, чтобы создать два .diff файла и применить их оба - чтобы он не являлся дополнительным фиксацией и не включал десятиэтапный процесс: |
как: fooobar.com/info/59819/...