Использовать git сохранение закладок или git для локальных изменений?
Я изменил некоторые файлы в своем репо, но не хочу, чтобы их открывали или создавали временную ветвь для их хранения. Я просто хочу сохранить эти изменения где-нибудь. Итак, какая команда лучше:
git stash save "save message"
или
git commit -am "save message"
?
Если я использую git commit
, верно ли, что все мои локальные коммиты будут публично нажаты одной командой git push
? Что делать, если я просто хочу подтолкнуть к ним одну конкретную фиксацию?
Ответы
Ответ 1
При нажатии, вы всегда нажимаете один конкретный коммит (как правило, фиксация на конце вашей текущей ветки). Однако, поскольку хеш фиксации частично состоит из коммитов, на которых он основывается (его родительский коммит), вы имеете, чтобы также перетащить все родительские коммиты. И, выталкивая родительские коммиты, вы также должны подталкивать свои материнские коммиты и так далее. Таким образом, вы можете только нажать всю историю определенного коммита.
Если вы создаете фиксацию только для того, чтобы хранить что-то, но не для нажатия, вам нужно убедиться, что вы никогда не нажимаете на это коммит или какие-либо коммиты, которые основываются на этой фиксации. Чтобы сделать это, после того, как вы выполнили свою работу, которая основывается на временной фиксации, вам необходимо выровнять временную фиксацию в новом коммите, который вы создаете, чтобы нажать его.
Другими словами, да, можно использовать фиксацию для временного частного хранилища. Однако гораздо проще использовать функцию закладок. Фактически, эта функция используется для этого очень практичного случая.
Ответ 2
Лично я предпочитаю просто переходить прямо к частным (местным) ветвям, но заготовки работают. Помните о двух моментах:
- Это их собственные обязательства. За исключением метки, нет никакой принципиальной разницы между фиксацией "stash" и фиксацией, привязанной к ярлыку ветки или тега. (Ярлык тега имеет форму
refs/tags/tag-foo
, ветвь имеет форму refs/tags/branch-foo
, а однократная маркировка с фиксацией помечена refs/stash
. Конечно, метки ярлыков также имеют "автоматически перемещается при добавлении коммитов", но если вы никогда не добавляете больше коммитов, они никогда не перемещаются, поэтому они работают так же, как и для сохранения одного фиксации.)
- "Stack" stack " 1 реализуется с использованием журналов. Reflogs может истечь по умолчанию, большинство из которых выполняются (через 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
: вновь созданная ветка будет иметь поэтапные и неустановленные изменения, восстановленные так, как они были, когда вы сделали git stash
. (Филиал будет отключаться от фиксации, когда вы делали git stash
тоже.) Зафиксируйте изменения (git add
-весьте больше, если хотите, или как две отдельные коммиты или что-то еще) и продолжайте, как если бы вы Сначала сделал частную ветку.
1 Исключительная часть стека состоит из всех штампов, отличных от [email protected]{0}
, в выводе git stash list
.
Ответ 3
Я предлагаю вам использовать для этого инструмент для штамповки. Вот почему он здесь. Вы можете закрепить свои chnges, а затем добавить их в свой код. Есть гораздо больше функциональных возможностей, которые вы можете использовать с помощью git stash. Вот ссылка http://git-scm.com/book/en/Git-Tools-Stashing
Я бы предложил вам разобраться с документацией git здесь. Также читайте о инструменте. После этого вы станете мастером git наверняка.
Ответ 4
Я делаю что-то по-другому. Мне больше нужны скобки, а не ежедневная работа, потому что они не (легко) гранулированы в том, что вы можете на самом деле застревать. (т.е. если у меня есть 20 измененных файлов, и я хочу создать два stashes из десяти каждый, это нелегко сделать.)
Вот почему я хочу, чтобы мои ежедневные изменения были привязаны к фактической, хотя и временной ветке, только для моего личного использования, поэтому я могу включать в себя заметки и такие мои работы, как я. Ежедневные проверки, эксперименты и т.д. В основном вещи, которые я не хочу выталкивать на окончательное репо.
Когда я нахожусь в состоянии, когда я готов вернуться к основному репо, я использую "мягкую команду reset" в комманде, с которого я первоначально был разветвлен. Это приводит к тому, что все мои изменения, связанные с изменением темпа, будут возвращены как текущие изменения в этом исходном коммите без какой-либо моей ежедневной рабочей истории.
Затем я создаю новую ветку для этих "новых" изменений, и я могу либо скопировать их все сразу, либо я могу разбить ее на несколько коммитов, если это имеет смысл (т.е. один для вспомогательного материала, другой для внешний интерфейс, другой для ресурсов и т.д.)
Когда я закончил, у меня осталась хорошая, новая, чистая ветвь с историей, которая имеет смысл для других разработчиков, без моих ежедневных заметок и готова слиться и вернуться обратно в основное репо. Затем я могу удалить ветки temp и перейти к следующей задаче.
Итак, чтобы повторить...
- Создать рабочую ветвь
- Сделайте столько коммитов/подсетей, сколько вам нужно, чтобы выполнить свою работу.
- Когда вы будете готовы объединиться, не сохранив эту историю, git - reset вернуться к исходной фиксации, где вы разветвляетесь. Все ваши изменения теперь локальные.
- Повторно зафиксировать и слить, как вам удобно.
Другим преимуществом является то, что я могу фактически направить временные ветки на удаленное репо, чтобы я мог работать из нескольких мест, которые вы не можете сделать с помощью stash. Просто запомните, когда вы закончите, очистите резервные копии сервера, чтобы очистить репо. (Некоторые могут утверждать, что технически коммиты все еще существуют, просто отсоединены, что верно, но ветки легки в GIT, и в некотором смысле это становится еще одной защитной сетью для того, чтобы не потерять работу, поскольку вы можете вернуть если это действительно необходимо.)