Яка користь у двоступеневому процесі вчинення git (постановка)?


174

Я вивчаю git, і я помітив, що він має двоступеневий процес фіксації:

  1. git add <files>
  2. git commit

На першому кроці розміщуються зміни в тому, що називається "область постановки" або "індекс".

Що мене цікавить, це чому приймається таке дизайнерське рішення і в чому його переваги?

Також, як користувач git, ви це робите чи просто використовуєте git commit -a?

Я запитую це, коли я родом з bzr (Bazaar), який не має цієї функції.


3
+1 для запитань. Я використовую Tortoise SVN, який має той самий підхід, і я ніколи не розумів, чому.
DPD

3
Область постановки не така вже й незвичайна. Еквівалент, скажімо, TFS перевіряв би або знімав прапорець біля файлу перед тим, як зареєструватися. Здійснюються лише перевірені файли. Різниця з Git полягає в тому, що якщо ви використовуєте git add -p, ви можете вирішити зафіксувати один фрагмент файлу, не роблячи іншого фрагменту цього ж файлу .
Kyralessa

Я виявив, що це посилання узагальнює більшість відповідей тут і додає ще кілька випадків використання для обгрунтування потреби в постановці.
Веверке

2
Це питання насправді вже відповів, але тут також один гарне пояснення: stackoverflow.com/questions/4878358 / ...
guitar_freak

1
Не забувайте git statusі, можливо git push. З усієї галасливості щодо git, (і код спільного використання GitHub чудовий) частини дуже дратують
user949300

Відповіді:


83

Роздайте роботу на окремі коміти. Ви, ймовірно, багато разів відкривали файл для написання однорядкового виправлення, але в той же час ви помітили, що форматування було неправильним, деякі документи можна було вдосконалити чи якісь інші непов'язані виправлення. З іншими RCS вам доведеться записати це або зафіксувати його в пам'яті, закінчити виправлення, до якого ви прийшли, зробити це, а потім повернутися, щоб виправити інші речі (або створити фіксацію кулі-грязі з непов'язаними речами) . За допомогою Git ви просто виправляєте все це одразу, а етап + здійснюєте окремий рядок окремо, за допомогою git add -iабо git-gui.

Не ламайте складання. Ви працюєте над складною модифікацією. Тож ви пробуєте різні речі, деякі з яких працюють краще, ніж інші, а інші, які ламають речі. За допомогою Git ви зможете checkoutналаштовувати речі, коли модифікація покращувала речі, і (або виправляли ще трохи), коли модифікація не працювала. Вам не доведеться покладатися на функцію скасування редактора, ви можете checkoutзробити все репо замість просто файлу за файлом та будь-яких помилок на рівні файлу (наприклад, видалення файлу, який не було зроблено, або збереження + закриття після погана модифікація) не призводить до втрати багато роботи.


3
Походить від DVCS (bzr), який не має цієї функції, це дуже схоже на те, що я досягаю в даний час, поєднуючи ліберальне використання буферів "скасувати" мого редактора, команду "повернути <файл>" та вибіркові коміти (" фіксувати <файл> "). Звучить така особливість git може бути більш методичною.
thomasrutter

1
Щодо "інших RCS", це не обов'язково правда. Насправді, ви можете досягти тих самих функцій у Mercurial, використовуючи патчі .
Лусіо Пайва

1
@ l0b0, про ваш другий пункт. Якби було лише одноступеневе фіксування, ви могли б просто здійснити зміни (які ви використовуєте з git add) безпосередньо як фіксація. Якби ви дізналися, що ви зробили щось не так, ви б просто видалили зобов’язання і повернулися туди, де ви були, перш ніж взяти на себе зобов’язання. З концептуальною постановкою ви це не просто робите, а додаєте більше складності?
alpha_989

Ваша перша думка має сенс, хоча я досі не використовував її. Теоретично, чому ти не можеш зробити щось на кшталт git add -iоднофазного виконання? Ви просто виберете купу файлів (або рядків у файлах), пов’язаних з однією функцією, і зробите компіляцію. Тоді ви повернетесь і зробите повторний
вчинок,

@thomasrutter, З вашої заяви, здається, ви пропонуєте, що область постановки створює "точки ручного скасування". У VIM з постійним скасуванням можна дуже надійно отримати необмежену історію. Це також відстежується автоматично типовоgit-branch ( jovicailic.org/2017/04/vim-persistent-undo ). Далі ваша історія скасування автоматично відстежується кожен раз, коли ви переходите у звичайний режим. Таким чином, це зменшує ваш ментальний тягар необхідності створювати "точки ручного скасування". Чому використання ваших редакторів "скасувати" буфери не настільки методично?
alpha_989

65

Однією з переваг для мене є можливість «додавати» файли поступово. Перед вчиненням я переглядаю кожен файл. Після перегляду файлу я додаю його. Коли я git statusабо git diff, git показує мені лише ті файли, які були змінені та ще не додані. Коли я переглянув усі файли та додав їх, тоді я можу зробити фіксацію.

Так що так, я вважаю, що площа постановки дуже корисна.

І ні, я ніколи не користуюся git commit -a. Однак я часто користуюся git add -u. Таким чином я все ще можу уявити, що потрібно зробити.


2
Саме так. Перевага - набагато більш тонкий контроль над тим, що ви робите.
Джош К

що відбувається, коли ви одноразово ставите один файл кілька разів? чи «зливається» воно в області постановки?
m4l490n

21

Перевага досить проста: вона дає вам повний контроль над тим, які файли ви хочете зробити. З цього питання ви можете використовувати git add -pдля керування рядки, які ви хочете зробити.


2
Я завжди цікавився, як це зробити. Я хотів би, щоб був файл, .gitignorelinesщоб ви могли внести локальні зміни до окремих рядків, які могли б пережити комікси, і залишатися недоторканими.
alex grey

3
@ReinHenrichs, подумайте про конфігураційні файли, які потребують змін кожного розробника.
Ян

1
@Ian Отже, частина файлу змінюється нечасто і ділиться частиною, а частина файлу змінюється часто, несумісними способами, і не поділяється? Підтримка цієї помилкової констатації, безумовно, звучить як антифункція.
Рейн Генріхс

1
@ReinHenrichs, так, і це дуже часто, коли файл містить ім'я сервера баз даних, і кожен розробник має власну базу даних.
Ян

4
@Ian Ваша проблема насправді полягає в тому, що у вас є файл, який повинен бути конфігурацією для програми, а також містить певну конфігурацію машини / розробника. Усі системи конфігурації, які я знаю, дозволяють розділити це на кілька файлів. Так, наприклад, у вас є ваш, app.confякий містить речі, якими ви хочете поділитися, а потім такий, db.confякий ви просто помістите у список .gitignore. Проблема вирішена. Якщо ви використовуєте щось власницьке, вам слід справді розібратися в тому, щоб отримати щось таке просте. Або перенесіть його через препроцесор у події перед збіркою. Там багато рішень.
Айдіакапі

1

Однією з переваг, яка мені подобається, є можливість здійснити частину зміни. Тобто, використовуючи git add -e. Я не здійснюю так часто, як слід іноді, і команда git add -e дозволяє мені до певної міри розгадати свої зміни.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.