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

Какой лучший способ иметь "временную" фиксацию в git?

Скажем, у меня есть проект с двумя ведущими мастерами и dev. У меня есть куча коммитов на dev для специального события, которое после тестирования слилось с мастером. Затем, после завершения события, я хочу удалить конкретный код события. Однако git reset не будет выполняться, поскольку с момента добавления кода события были сделаны другие коммиты.

В настоящее время я использую git checkout для проверки файлов до того, как событие было объединено, а затем используйте git diff для повторного добавления изменений, которые были сделаны после того, как событие было выполнено. Это кажется мне очень грязным методом.

Есть ли у кого-нибудь лучшее решение для временного кода в проекте?

Изменить: Чтобы быть ясным, изменения должны быть зафиксированы, нажаты, неблокированы, нажаты.

4b9b3361

Ответ 1

Возьмите мастер и создайте ветку: git checkout -b special-event, сделайте/примените свои изменения. Как только событие закончено, просто переключитесь на мастер и отпустите/удалите ветвь.

Чтобы продолжить внесение изменений, сделайте их на master и объедините их в специальную ветку, когда вы идете. git checkout master... внести изменения... git checkout special-event; git merge master.

В качестве альтернативы, сделайте все изменения, связанные с особым событием, в одном коммите, а затем используйте git revert, когда вы хотите вывернуть их, и укажите именно эту фиксацию.

Ответ 2

"Временный код"? В git для этого используются ветки. Записи очень легкие в git, а ветки, являющиеся просто именами (или ссылками) для коммитов с крошечным битом логики, являются сверхлегкими по сравнению с другими системами.

Крошечный бит логики заключается в том, что ссылка автоматически обновляется до последней фиксации. Это почти все, что такое ветка. Это означает, что создание и уничтожение ветвей в git выполняется быстро, просто и безопасно, поскольку ничего действительно не создано или не удалено. После удаления вы все равно можете ссылаться на ветвь ветки с помощью commit-id (да, он все еще там, пока не будет собран мусор, и даже это произойдет, только если нет другой ссылки на него).

Почти каждая команда в git принимает ссылки на commit как параметры. Это верно для слияния git. Вы не объединяете ветки, вы объединяете коммиты. Да, вы вводите 'git merge', но опять же, ветка - это просто имя для фиксации. Не более того. И поскольку все, что вам нужно, группирует коммиты для события вместе, просто дайте им имя.

Итак, правильная вещь - создать ветвь для события. Или, возможно, два: "event-master" и "event-dev" . Теперь вы разрабатываете код для события в "event-dev" . Если вы столкнетесь с ошибкой, которая должна быть исправлена ​​в главном коде, запишите и переключитесь на свою обычную ветку "dev" , введите код исправления и фиксации. Вернитесь к "event-dev" , объединитесь с "dev" и всплывайте. Продолжайте разрабатывать, делать, сдавать и тестировать. Если все в порядке, объедините "event-dev" в "event-master" . Это также будет содержать исправление. Обратите внимание, что исправление еще не находится в "master" .

Если вам нужно, чтобы исправление было объединено в "master" , вы просто делаете это обычным способом, так как исправление находится в "dev" .

В основном в этой настройке вы можете:

  • создайте основной код, как обычно: вы передаете "dev" , проверяете и объединяете в "master" ;

  • создать код, специфичный для события, аналогичным образом: вы передаете "event-dev" , тестируете и объединяетесь в "event-master" ; это тот же рабочий процесс;

  • смешивать два рабочих процесса; commit и switch, или используйте git stash;

  • свободно объединяются ветки (почти); вы можете объединить "master" в "event-dev" , если мастер каким-то образом обновлен, и вам нужны изменения для события; вы можете объединить "dev" в "event-dev" , если вы отчаянно нуждаетесь в изменениях для события и не можете дождаться обычного цикла тестирования, который подталкивает их к "хозяину". git будет делать это, поскольку слияния чисты, то есть, если вы не изменили один и тот же фрагмент кода двумя разными способами в двух ветвях -dev (это, конечно же, особый случай, который нужно обрабатывать);

Если вам нужна дополнительная гибкость, создайте больше ветвей. Для сверхспособности вы можете забирать индивидуальные фиксации в ветку, но в целом я советую против этого (делайте это, только если вы действительно знаете, что делаете).

Наконец, я должен отметить, что этот рабочий процесс настолько естественен в git. На самом деле, развитие в "dev" и вытягивание изменений в "master" не является лучшим в целом. Обычно создается ветвь dev для каждой функции или модуля, который вы разрабатываете, и объединяете эти ветки в "dev" .

Я думаю, что правильное мышление при использовании git заключается в следующем: "что я чувствую, когда хочу сегодня использовать код X. Хорошо, давайте создадим ветку" feature-x "и начнем взлом". Это ваше событие ничем не отличается.

Теперь я знаю, что то, что я говорю вам, - это то, как вы должны были делать все с самого начала, и это не очень помогает сейчас. Вам нужно исправить свое дерево, так как - так кажется - у вас есть изменения для события, смешанного с нормальными изменениями в вашей ветке "dev" . Поэтому ваша проблема заключается в том, как правильно создать "event-dev" только с изменениями для события и одновременно удалить их из "dev" .

Время перезаписи истории. Как сильно это будет, это зависит от характера изменений. Например, если все изменения относятся к одному каталогу, все может быть проще.

Вот что я буду делать (зная не лучше):

  • просмотрите историю с помощью git log;

  • найдите коммит, который прямо перед первым изменением конкретного события, обратите внимание на его commit-id: это фиксация "day-0",

  • создать ветку с именем 'newdev', указывающую на эту фиксацию. Сделайте это в чистом дереве, то есть совершите это: git checkout < commit-id > -b newdev;

  • создать 'event-dev': git checkout -b event-dev;

  • у вас есть две ветки, указывающие на фиксацию "день-0",

  • теперь снова просмотрите историю (git log dev), вам нужно следовать ей commit by commit;

  • Я предполагаю, что каждая фиксация, следующая за "днем-0", является либо фиксацией, принадлежащей основному коду, либо той, которая принадлежит только событию. То, что вам нужно сделать, это вишня - выбрать их в правильной ветке, "newdev" , если это основной код, "event-dev" , если это код события; делайте это один раз, в правильном порядке (от "день-0" до сегодняшнего дня);

  • Если вам очень повезло, никакая фиксация, которая заканчивается в 'newdev', зависит от коммитов в 'event-dev' и наоборот; вы делаете это; вы можете захотеть переименовать (держать их вокруг) текущего мастера и dev в мастер-старый и dev-old, а затем переименовать newdev в dev, создать мастер из dev, event-master из event-dev, и вы установите;

  • если вам немного повезло, иногда вам придется объединить "newdev" в "event-dev" , потому что некоторые фиксации зависят от изменений, сделанных в основном коде, что хорошо,; если вы чувствуете смелость здесь, пришло время прочитать о git rebase; но rebase не делайте, если вам не нужно;

  • или (что еще хуже) некоторые коммиты в "newdev" зависят от изменений в "event-dev" ... oops, этот код, зависящий от конкретного события, оказывается не таким специфичным для события, если требуется основная ветвь Это. Требуется некоторое слияние;

  • or (bad) one commit содержит оба вида изменений: деление и победа (вам нужно отделить изменения и применить их к правой ветке), это означает, что вы разделили фиксацию на две части;

  • или что-то еще, чего я не могу себе представить, так как у меня недостаточно информации о вашем дереве.

Это может быть легкий ветерок или кошмар. Осмотрите каждую фиксацию заранее (git показать, вы можете посмотреть на нее как патч), решить, что делать (в конечном итоге не вишневый выбор, просто редактирование файлов может быть проще), если не уверен - угадайте, что - создать ветвь, работайте там, посмотрите, что произойдет, объедините ее, если хотите, сбросьте ее в противном случае и повторите попытку.

Я не упомянул об этом до сих пор, но, конечно, вы можете сделать копию всего дерева, включенных git файлов и работать с копией на 100% безопасной.

Делать это с самого начала довольно легко. Исправить это сейчас, ну, удачи.:)

Ответ 3

Сверните свои транзакции после моего непатентованного метода:

# work on a new branch
git checkout -b event-36
git commit -a -m "all broken dammit"
git commit -a -m "fixed that damn code"
git commit -a -m "almost ready, going to eat lunch"
git commit -a -m "It done!"

# other people might be working on master in the meantime, so
git checkout master
git checkout -b erasemeImmediately
git merge event-36
git reset --soft master # THE KEY TO THE WHOLE THING: SOFT RESET!
git commit -a -m "Event 36, all code in one commit"

git checkout master
git merge erasemeImmediately

Вы можете сделать это с помощью reflog, но тогда вам понадобится недавняя степень CS (т.е. это трудно понять).

Теперь ваша фиксация - одна. Теперь вы можете использовать revert или do cherry-pick your way to branch без него.

Ответ 4

git checkout -b event

... внести определенные изменения в события...

git commit -am "specific event change"

... изменить другое конкретное событие...

git commit -am "another specific event change"

На этом этапе ветвь master по-прежнему остается нетронутой, а изменения, связанные с конкретным событием, находятся в ветки event. Если в ведущую ветвь внесены изменения, которые также необходимы в ветке event, используйте rebase...

git rebase master

Другой ответ предложил объединить master в событие, но обычно лучше использовать переустановку. Ребаза отменяет коммиты, сделанные в ветке темы, вытягивает обновленную master вперед, а затем снова вносит изменения в ветку темы... как если бы изменения в ветке темы были внесены в самую последнюю версию мастера.

В вашем сценарии, когда событие закончено, просто удалите ветвь событие.

Ответ 5

git revert

Он удалит любую фиксацию или диапазон коммитов, которые необходимо отменить. Также безопасно нажать на публичное репо.

Ответ 6

По моему опыту, некоторые специальные события имеют способ повторения. Поэтому альтернативное решение для рассмотрения здесь - создать параметр конфигурации, позволяющий обрабатывать специальное событие, чтобы его можно было включать и выключать по мере необходимости.

Ответ 7

Я верю stash делает то, что вы хотите.