Зафиксировать файл в другом филиале без проверки
Можно ли зафиксировать файл в ветке git без проверки этой ветки? Если да, то как?
По сути, я хочу сохранить файл в моей ветке github pages без переключения ветвей все время. Любые мысли?
Обновление: Невозможно выполнить то, что я хочу (см. комментарии ниже для использования). То, что я закончил, - это программно клонировать мой текущий каталог в каталог tmp, а затем проверить мою ветвь в этом каталоге tmp (не влияет на мой рабочий каталог) и передать мои файлы в клон-каталог tmp. Когда все будет готово, я вернусь в рабочий каталог и удалю каталог tmp. Отстой, но это единственный способ зафиксировать файлы в другой ветке, не меняя текущую рабочую ветвь рабочего каталога. Если у кого-то есть лучшее решение, не стесняйтесь добавлять его ниже. Если это лучше, чем "это невозможно сделать", я соглашусь с вами.
Ответы
Ответ 1
Это невозможно.
Изменения, которые вы совершаете, связаны с текущей рабочей копией. Если вы хотите передать другой филиал, это означает, что вы можете зафиксировать изменения в своей рабочей копии, но основывать их на другом состоянии копии.
Это не естественный способ проверки вашей работы, и поэтому вам нужно сделать разные шаги (изменения смены, проверить ветку, поп-штамп и фиксацию), чтобы выполнить ее.
Что касается вашего конкретного случая использования, простой способ состоит в том, чтобы сохранить две копии вашей работы, одну из которых вычеркнута в ветке master
, а другая - в ветке pages
.
В рабочей копии pages
добавьте копию master
в качестве удаленного репо.
- Вы совершаете страницы на
master
- Вытащите из
master
копию pages
- нажмите на GitHub
- reset главная ветвь в своем предыдущем состоянии.
Ответ 2
Это можно сделать, переопределяя git commit.
Это можно сделать с помощью другого вызова git hash-object
Но этого трудно достичь.
Прочтите прог. главу 9 для получения более подробной информации и полный пример того, как имитировать фиксацию.
Ответ 3
Пока у вас нет ничего в вашем текущем индексе, который отличается от вашего HEAD
, который вы хотите сохранить, может так что-то вроде этого. (Если вы хотите сохранить свой индекс, вы можете временно экспортировать переменную среды GIT_INDEX_FILE
, чтобы указать временный файл на время выполнения этих команд.)
# Reset index and HEAD to otherbranch
git reset otherbranch
# make commit for otherbranch
git add file-to-commit
git commit "edited file"
# force recreate otherbranch to here
git branch -f otherbranch
# Go back to where we were before
# (two commits ago, the reset and the commit)
git reset [email protected]{2}
Мы никогда не проверяли otherbranch
, и наши рабочие файлы дерева не были затронуты.
Ответ 4
Как говорили некоторые другие, это буквально возможно, но непрактично.
Однако, начиная с Git 2,5 (с некоторыми важными исправлениями в 2.6 и младших с тех пор), существует практический метод для этого, используя git worktree add
.
Скажем, например, что вы хотите одновременно работать с ветвями main
и doc
", или ветвями develop
и test
" одновременно, но две ветки в вопросе намеренно содержат разные вещи. (Например, ветвь doc
имеет документацию, которая существует снаружи или рядом с кодом, или ветвь test
имеет тесты, которые будут выполняться против кода, но не распределены, или которые, как ожидается, будут иметь сбои, для которых тесты намеренно пропустили сторону develop
или что-то еще.)
Вместо просто:
git clone -b develop <source> theclone
а затем работая в theclone
с постоянным переключением между двумя ветвями, вы должны:
git clone -b develop <source> theclone
но затем:
cd theclone
git worktree add ../ct test # check out branch test in ../ct
или просто:
git worktree add ../test # check out branch test in ../test
Теперь вы можете запускать тесты в ../test
при разработке в theclone
. Вы можете объединить и/или переустановить изменения из одной ветки в другую обычным способом: базовый репозиторий уже используется совместно, поэтому не требуется git push
или git fetch
. У вас просто две ветки проверены на две отдельные рабочие деревья, названные theclone
и test
с верхнего уровня.
Ответ 5
В то время как в настоящее время нет единственной команды для этого, есть как минимум две другие опции.
Примечание: теперь команда mktree not mk-tree
Ответ 6
Я не могу согласиться, что это невозможно. Смешивая git stash push
, git stash pop
, git checkout
, git checkout
, git add
и git commit
, это возможно.
Как я понимаю проблему:
Вы находитесь на сервере ветки, и вы внесли некоторые изменения в файл patched.txt
, и вы хотели бы зафиксировать этот файл в другой ветке.
Что вы хотели бы сделать:
- сохранить все изменения в этом репо, выполнив git stash
- checkout
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 [email protected]{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
Теперь, если вы запустите мой script с параметрами
destBranch=patch
thisBranch=`git rev-parse --abbrev-ref HEAD`
FileToPutToOtherBranch="file1.txt"
message="patched file $FileToPutToOtherBranch"
У вас будет file1.txt
, измененный только в ветке патча, для получения дополнительной информации см. gitk --all
Ответ 7
Если вы случайно модифицировали вещи в неправильной ветке, выполните несколько простых шагов:
- Зафиксируйте эти изменения;
- Объедините их в нужную ветвь;
- Оформить покупку ветки, на которой вы были, и reset до фиксации до;
- Очистите свои изменения с помощью git checkout -. ".
После этого все должно быть хорошо. Вы также можете объединить, reset и выборочно очистить свои модификации.
Ответ 8
Я сделал небольшой инструмент, который делает именно это: https://github.com/qwertzguy/git-quick
Позволяет редактировать определенные файлы из другого ветки, не проверяя другую ветвь полностью (только файлы, которые вы хотите отредактировать) и зафиксировать их. Все это без влияния на вашу рабочую копию или область постановки.
За кулисами используется комбинация git worktree и разреженной проверки. Источник довольно небольшой, поэтому вы можете прочитать.
Ответ 9
Вот как я это делаю:
если я сделал это, откат назад:
git reset --soft 'HEAD^'
добавить файлы, которые вы хотите добавить
git add .
создать новую временную ветку:
git checkout -b oops-temp
зафиксировать изменения:
git commit -m "message about this commit"
Завершите проверку ветки, которую вы хотели проверить:
git checkout realbranch
объединить старую ветку:
git merge oops-temp
удалить старую ветку:
git branch -D oops-temp