Подтвердить что ты не робот

Зафиксировать файл в другом филиале без проверки

Можно ли зафиксировать файл в ветке git без проверки этой ветки? Если да, то как?

По сути, я хочу сохранить файл в моей ветке github pages без переключения ветвей все время. Любые мысли?

Обновление: Невозможно выполнить то, что я хочу (см. комментарии ниже для использования). То, что я закончил, - это программно клонировать мой текущий каталог в каталог tmp, а затем проверить мою ветвь в этом каталоге tmp (не влияет на мой рабочий каталог) и передать мои файлы в клон-каталог tmp. Когда все будет готово, я вернусь в рабочий каталог и удалю каталог tmp. Отстой, но это единственный способ зафиксировать файлы в другой ветке, не меняя текущую рабочую ветвь рабочего каталога. Если у кого-то есть лучшее решение, не стесняйтесь добавлять его ниже. Если это лучше, чем "это невозможно сделать", я соглашусь с вами.

4b9b3361

Ответ 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