2013-09-11 2 views
14

Я изменил некоторые файлы в своем репо, но не хочу, чтобы их публично открывали или создавали временную ветвь для их хранения. Я просто хочу сохранить эти изменения где-нибудь. Так какая команда лучше:Использовать git stash save или git для локальных изменений?

git stash save "save message" 

или

git commit -am "save message" 

?

Если я использую git commit, верно ли, что все мои местные коммиты будут публично нажаты одной командой git push? Что, если я просто хочу подтолкнуть к ним одну конкретную сделку?

+10

Почему бы не использовать временную ветку? Если вы используете commit, вы либо создадите фиксацию без HEAD, либо используете свой текущий HEAD и перемещаете его. Использование ветки и не подталкивание ее к публике - это то, что я сделал бы. – Gauthier

+0

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

ответ

12

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

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

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

+0

В этом случае я не очень люблю использовать git. Означает ли это, что если я сделаю SHA1 для измененных работ, тогда сделайте check to back to original work, затем сделайте git pull для извлечения новых коммитов из git, мой SHA1 перейдет в другую новую ветвь или просто исчезнет? – Balthier

+0

В этом случае ваша история не является линейной. У вас есть две коммиты, основанные на одном и том же родительском коммите. Один - это фиксация для измененной работы, а другая - то, которое вы выбрали. Вы можете объединить коммиты вместе. Вы также можете просто работать над измененным коммандой работы и переустанавливать результат поверх загруженного материала. Это не приведет к какой-либо опасности, поскольку вы не подтолкнули свою измененную работу. – Oznerol256

+0

Я предполагаю, что перебаза нормально для местных коммитов, поскольку это не так опасно, как для публичных коммитов :) – Balthier

0

Я предлагаю вам использовать для этого инструмент для штамповки. Вот почему он здесь. Вы можете закрепить свои chnges, а затем добавить их в свой код. Есть много возможностей, которые вы можете использовать с git stash. Вот ссылка http://git-scm.com/book/en/Git-Tools-Stashing

Я бы предложил вам разобраться с документацией git here. Также читайте о инструменте. После этого вы станете мастером git наверняка.

3

Лично я предпочитаю просто переходить прямо к частным (местным) ветвям, но застревает. Помните о двух моментах:

  • Это их собственные фиксации. За исключением метки, нет никакой принципиальной разницы между фиксацией «stash» и фиксацией, привязанной к ярлыку ветки или тега. (Метка тега имеет форму refs/tags/tag-foo, ветвь имеет форму refs/tags/branch-foo, а одноточечная фиксация штрихов обозначена как refs/stash. Разумеется, метки ветви также имеют функцию «автоматически перемещается по мере добавления коммитов», но если вы никогда не добавьте больше коммитов там, они никогда не двигаются, поэтому они работают так же хорошо, чтобы сохранить один фиксатор.)
  • Шкаф «стопка» реализован с использованием журналов. Reflogs может истекает по умолчанию most do (через 30 или 90 дней), а те, что указаны в refs/stash, не имеют значения, но вы можете изменить это с помощью записей конфигурации - так что уложенные в стопные косы могут также «истекать» (в то же время reflog срок действия истекает). (Точнее, они «становятся коллекционируемыми», но это различие не помогает, если они ушли. :-))

Цель с прилавками - сэкономить что-то краткосрочное.Если вы когда-либо возвращаетесь к репо поздно и находите кучу закладок, все называются «WIP on branch», это не забавно, пытаясь понять их.

Другие функции/ошибки :-) stash обеспечить являются:

  • git stash branch позволяет изменить свой ум после того, как факт и превратить тайник в отрасли. Итак, если «краткосрочная» окажется проблемой (вы собираетесь ее исправить сегодня днем, но теперь ее отталкивают не менее месяца), вы можете просто превратить кошелек в ветку.
  • git stash apply [--index] сделает все возможное, чтобы «переделать» применяемые изменения в текущей ветке. С помощью --index он попытается восстановить как поэтапные, так и неустановленные изменения независимо. (Есть случаи, когда это невозможно.)
  • git stash pop автоматически отбрасывает ссылку на stash для вас. К сожалению, это делает это, даже если вы хотели использовать git stash pop --index и оставили часть --index. Если вы используете pop, легко потерять часть своего состояния (поставленное против нестационарного). Если вы используете apply, а затем drop, как только вы убедитесь, что у вас есть все так, как вы хотели, вы можете избежать этой проблемы.

Обратите внимание, что git stash branch подразумевает --index: вновь созданный филиал будет инсценировать-и-unstaged изменения возрожденного к тому, как они были, когда вы сделали git stash. (Филиал будет отходить от фиксации, когда вы делали git stash.) Зафиксируйте изменения (git add - при необходимости, если хотите, или как две отдельные коммиты или что-то еще) и продолжайте, как если бы вы сделали частного сектора.


истекают-состояние часть стеки состоит из всех, кроме [email protected]{0} тайников, в git stash list выходе.

+0

Так истекает срок действия git, и я боюсь, что не смогу сохранить изменения навсегда. Кроме того, ветвь git stash создает новый частный филиал, который является моим окончательным выбором для сохранения локальных работ. Спасибо. Думаю, я должен изменить вопрос на использование git stash, git commit или git branch. – Balthier

0

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

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

Когда я нахожусь в состоянии, когда я готов вернуться к основному репо, я использую команду «мягкого сброса» в команде, которую я изначально отделил. Это ставит все мои изменения, связанные с изменением темпа, как текущие изменения этого первоначального коммита без какой-либо моей ежедневной рабочей истории.

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

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

Так что напомним ...

  1. Создать рабочую ветвь
  2. сделать так много коммитов/подотрасли, как вам нужно, чтобы сделать Вашу работу
  3. Когда вы будете готовы слиться обратно, не сохраняя эту историю, ГИТ-сброс обратно оригинальная фиксация, где вы разветвляетесь. Все ваши изменения теперь являются локальными изменениями.
  4. Re фиксации и слияния, как вы считаете нужным

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

Смежные вопросы