Не могу согласиться, это невозможно. Это возможно при смешивании git stash push
, git stash pop
, git checkout
, git checkout
, git add
и git commit
.
Как я понимаю проблему:
Вы находитесь на главном филиале и внесли некоторые изменения в файл patched.txt
, и вы хотели бы зафиксировать этот файл в другой ветви.
То, что вы хотели бы сделать, это:
- сохранить все изменения в этом репо, выполнив git stash
- оформить заказ
file.txt
из спрятанной стопки
- добавить файл
patched
(и только этот файл) в новую ветку
- вернуться в состояние репо до модификации
file.txt
Этого можно достичь, выполнив следующие команды:
destBranch=patch
thisBranch=master
FileToPutToOtherBranch="file1.txt file2.txt 'file with space in name.txt'"
message="patched files $FileToPutToOtherBranch"
#assumption: we are on master to which modifications to file.txt should not belong
git stash &&\ #at this point we have clean repository to $thisBranch
git checkout -b $destBranch &&\
git checkout stash@{0} -- $FileToPutToOtherBranch && #if there are many files, repeat this step #create branch if does not exist (param -b)
git add $FileToPutToOtherBranch &&\ # at this point this is equal to git add . --update
git commit -m "$message" &&\
git checkout $thisBranch &&\
git stash apply &&\ # or pop if want to loose backup
git checkout $thisBranch -- $FileToPutToOtherBranch # get unpatched files from previous branch
Причина, по которой я использую «&&», и в конце концов, если кто-то скопирует и вставит этот фрагмент в терминал, даже если произойдет одна ошибка, будут выполнены следующие команды, что не очень хорошо. \ для информирования оболочки о том, что команда продолжается в следующей строке.
Чтобы доказать это, я предоставляю среду тестирования для этого фрагмента
mkdir -p /tmp/gitcommitToAnyBranch && cd /tmp/gitcommitToAnyBranch &&\
git init
echo 'this is master file' > file1.txt
echo 'this is file we do not want to have modified in patch branch because it does not patches any feature' > docs.txt
git add file1.txt && git commit -m "initial commit"
echo 'now this file gets patched' > file1.txt
git status
Теперь, если вы запустите мой скрипт с параметрами
destBranch=patch
thisBranch=`git rev-parse --abbrev-ref HEAD`
FileToPutToOtherBranch="file1.txt"
message="patched file $FileToPutToOtherBranch"
У вас будет file1.txt
изменено только в ветке патча, подробнее см. gitk --all