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

Работа с временными изменениями (не обязательными) в Git

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

Об этих "временных" изменениях:

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

В настоящее время я просто сохраняю их как нестационарные, и я пропущу их вручную, когда выполняем каждую фиксацию. Однако я не могу оставаться с этим решением, потому что:

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

Как мне с этим бороться?


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

4b9b3361

Ответ 1

Обычно я общаюсь с этим:

git add -p

... для смены скоростей. Затем вам нужно только нажать n для своих отладочных изменений.


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

git rebase -i master

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

git checkout master
git merge local-changes^
git checkout local-changes

Ответ 2

Попробуйте git update-index --assume-unchanged <file>. Таким образом, git не будет добавлять файл в индекс при использовании git add или git commit -a.

EDIT: Это не позволяет вам иметь дело с случаем наличия одного файла с временными и постоянными изменениями.

Ответ 3

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

Настройка:

git branch tempChanges  [branch for temporary changes]
  [create your temporary changes]
git add -A
git commit

Обратите внимание на sha для этого фиксации. Затем переключитесь на свою рабочую ветку и:

git cherry-pick shaOfTempChangesCommit

Теперь у вас есть изменения в вашей рабочей ветке. Выполняйте свою работу и совершайте коммиты. Затем, прежде чем нажимать:

git rebase -i

Вы увидите что-то вроде этого:

pick bfd4d2e This first commit is your temporary changes.
pick 186a99d Some stuff done on the working branch.
pick ec871c6 More stuff done on the working branch.
(etc.)

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

Когда вы будете готовы снова работать, вы можете вернуть временные изменения в текущую рабочую ветку (или новую рабочую ветку):

git cherry-pick shaOfTempChangesCommit

Итак, в сумме, все, что вам нужно запомнить в этом методе, это

  • после создания рабочей ветки

    git cherry-pick shaOfTempChangesCommit

  • после того, как вы закончите работу и готовы нажать

    git rebase -i [для удаления временных изменений перед нажатием]

Ответ 4

Вы можете использовать

git stash

чтобы сохранить его во временном пространстве. После выполнения слияния вы можете использовать

git stash pop

чтобы вернуть ваши временные изменения в рабочий каталог.

Ответ 5

Я нашел чистое решение этой проблемы: (pardon my ascii-art). Для этого требуется дополнительная ветка для ветки темы. (это имеет недостатки и оспаривается/исправляется, см. комментарии)

Работа сначала выглядит так:

master
     \
      \
     commit1  ---- commit2 ---- "branch"

Работа выполняется на "ветке".

Чтобы ввести некоторые временные изменения:

  • создать ветку "ветвь-temp" из "master"
  • зафиксировать временные изменения там
  • rebase "branch" от "master" на "branch-temp"

Теперь репо выглядит следующим образом:

master
     \
      \
     "branch-temp" ----- commit1 ---- commit2 ---- "branch"

Работа теперь с радостью продолжается в ветке , а временные изменения не отображаются в статусе.

Чтобы изменить или расширить временные изменения:

  • checkout branch-temp
  • commit -amend временные изменения там - это неправильно, так как это приводит к тому, что распад "ветка-темп"

Чтобы слить изменения из ветки в мастер:

Это немного сложнее. Мы хотим объединить все изменения, кроме изменений, внесенных в "ветвь-темп". Моя идея:

  • запустить нормальное слияние из "ветки" на "мастер"
    (теперь мы имеем слияние, но с некоторыми ненужными временными изменениями - удалим их)
  • git revert --no-commit branch-temp
  • git commit --amend
    (эти два шага должны изменить фиксацию слияния, так что он больше не содержит изменений от temp ветвей)

Ответ 6

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

Ответ 7

Как насчет написания простой оболочки script, которая будет исправлять и отменять ваши отладочные изменения по запросу (а затем сделать ее как псевдоним git).

например.

git apply-my-debug
...
do coding
...
git remove-my-debug
git add .
git commit -m "Don't worry about debug changes"

Ответ 8

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

#warning - DEBUG ONLY - DO NOT MERGE

print(debugInfo)

#warning - DEBUG ONLY - DO NOT MERGE

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

После этого у вас будут разные способы удаления фиксации отладки:

  • revert фиксируется конкретная ошибка отладки. Это сохранит свою историю в отрасли.

  • cherry-pick хорошая фиксация. Это полностью устранит фиксацию отладки.

  • Что-то более сложное, например rebase -interactive для удаления коммитов на месте.

Ответ 9

GIT Функциональность закладок обеспечивает именно то, о чем вы просите. По крайней мере, для "хранения". Сделать хороший/плохой выбор при совершении невозможно избежать.

Ответ 10

Я, как правило, не допускаю подобных изменений. Я просто использую git add -i или git add -p для смены изменений (если только я не уверен, что хочу все изменения, которые имеет дерево). Таким образом, я просматриваю все изменения, которые я хочу совершить, и легко пропускаю временные. Это также помогает сгенерировать изменения, которые, как вы знаете, вам нужно выполнить раньше, и держать их в поэтапном или даже комментировать, а также добавлять дополнительные изменения с помощью git commit --amend.