Почему я должен хотеть этап перед совершением в Git?


Я новичок в управлении версиями, и я понимаю, что "фиксация" по существу создает резервную копию при обновлении новой "текущей" версии того, над чем вы работаете.

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

Edit: я думаю, что я могу запутать терминологию. Является ли "поэтапный" файл то же самое, что и "отслеживаемый" файл?

6 60

6 ответов:

при фиксации он будет фиксировать только изменения в индексе ("поэтапные" файлы). Есть много применений для этого, но наиболее очевидным является разбить ваши рабочие изменения на более мелкие, автономные части. Возможно, вы исправили ошибку во время реализации функции. Вы можете git add только этот файл (или git add -p добавить только часть файла!) и затем зафиксируйте это исправление, прежде чем совершать все остальное. Если вы используете git commit -a тогда вы просто заставляете add of все прямо перед совершением. Не используйте -a если вы хотите воспользоваться промежуточных файлов.

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

  • промежуточная область дает контроль, чтобы сделать фиксацию меньше. Просто сделайте одно логическое изменение в коде, добавьте измененные файлы в промежуточную область и, наконец, если изменения плохи, то проверьте предыдущую фиксацию или иным образом зафиксируйте changes.It дает гибкость для разделения задачи на меньшие задачи и фиксации меньших изменений. С промежуточной областью легче сосредоточиться на небольших задачах.
  • Он также дает вам предложение сделать перерыв и забыть о том, сколько работа, которую вы сделали перед перерывом. Предположим вам нужно изменить три файла чтобы сделать одно логическое изменение и вы изменили первый файл и нужен длительный перерыв, пока вы не начнете делать другие изменения. В этот момент Вы не можете совершить, и вы хотите отслеживать, какие файлы вы сделали с таким образом, что после возвращения вам не нужно пытаться вспомнить, сколько работы было сделано. Поэтому добавьте файл в промежуточную область, и он сохранит вашу работу. Когда вы вернетесь, просто сделайте "git diff -- staged" и проверьте, какие файлы вы изменили и где, и начните вносить другие изменения.

одной из практических целей постановки является логическое разделение фиксаций файлов.

поскольку staging позволяет вам продолжать вносить изменения в каталог files/working и делать коммиты по частям, когда вы думаете, что все готово, вы можете использовать отдельные этапы Для логически несвязанных изменений.

Предположим, у вас есть 4 файла fileA.html,fileB.html,fileC.html и fileD.html. Вы вносите изменения во все 4 файла и готовы к фиксации, но изменения в fileA.html и fileB.html логически связанные (например, одна и та же реализация новой функции в обоих файлах) при изменении fileC.html и fileD.html являются отдельными и логически не связанными с предыдущими файлами. Вы можете на первом этапе файлы fileA.html и fileB.html и зафиксировать их.

git add fileA.html
git add fileB.html
git commit -m "Implemented new feature XYZ"

затем на следующем шаге вы выполняете и фиксируете изменения в оставшихся двух файлах.

git add fileC.html
git add fileD.html
git commit -m "Implemented another feature EFG"

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

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

здесь вы можете найти больше примеров : использование индекса

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

легче понять использование команд git add и commit Если вы представляете, что файл журнала поддерживается в вашем репозитории на Github. Типичный файл журнала проекта для меня может выглядеть так:

---------------- Day 1 --------------------
Message: Completed Task A
Index of files changed: File1, File2

Message: Completed Task B
Index of files changed: File2, File3
-------------------------------------------

---------------- Day 2 --------------------
Message: Corrected typos
Index of files changed: File3, File1
-------------------------------------------
...
...
...and so on

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

каждая из этих подзадач (задача A и задача B здесь) являются индивидуальными коммитами. Элемент git add команда добавляет файлы в список "индекс измененных файлов". Этот процесс также называется стадией. Элемент git commit команда записывает / завершает изменения и соответствующий список индексов вместе с пользовательским сообщением.

помните, что вы все еще изменяете только локальную копию своего репозитория и не тот, что на Github. После этого, только когда вы делаете "git push", все эти записанные изменения вместе с вашими индексными файлами для каждой фиксации регистрируются в главном репозитории(на Github).

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

git pull
# Make changes to these files
git add File3 File4
# Verify changes, run tests etc..
git commit -m 'Corrected typos'
git push

в двух словах git add и git commit позволяет разбить изменения в главном репозитории на систематические логические подменю. Как указывали другие ответы и комментарии, есть, конечно, гораздо больше пользы для них. Тем не менее, это один из наиболее распространенных способов использования и движущий принцип git, являющийся многоступенчатой системой контроля версий, в отличие от других популярных, таких как Svn.

Я вижу смысл в использовании stage, чтобы сделать коммиты меньше, как упоминалось @Ben Jackson и @Tapashee Tabassum Urmi, и иногда я использую его для этой цели, но я в основном использую его, чтобы сделать мои коммиты больше! вот моя точка зрения:

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

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

Я вижу другие способы сделать это (упрощение истории git) , которые вы можете использовать в зависимости от ваших предпочтений:

  1. git amend (который изменяет вашу последнюю фиксацию), которая не является чем-то, что вы хотите для этой конкретной цели (я вижу это в основном как плохую фиксацию и затем исправляя его)
  2. git rebase, который является запоздалой мыслью и может вызвать серьезные проблемы для вас и других, кто использует ваш репозиторий.
  3. создание временной ветви, слияние, а затем удалить его впоследствии(что также является хорошим вариантом, требует больше шагов, но дает больше контроля)