Звільнення та те, що означає "повторне звільнення"


109

Часто кажуть, що не слід перезавантажувати зобов’язання, які ви вже натиснули. Що може означати це?

Відповіді:


80

Книга ProGit має гарне пояснення .

Конкретну відповідь на ваше запитання можна знайти в розділі під назвою " Небезпеки звільнення ". Цитата з цього розділу:

Під час перезавантаження матеріалів ви відмовляєтесь від існуючих комітетів і створюєте нові, схожі, але різні. Якщо ви куди-небудь натискаєте комітети, а інші витягують їх і базують на них роботу, а потім ви переписуєте ці комісії з git rebase і знову підштовхуєте їх, вашим співробітникам доведеться знову об'єднати свою роботу, і все стане брудно, коли вони намагаються повернути їх роботу назад у вашу.

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


Дякую за пояснення. Отже, щоб зробити своє розуміння зрозумілішим, після того, як я натиснув певні зміни, я не повинен використовувати git rebase(- інтерактивний?) Для переписування цієї історії, це впевнений рецепт невдачі. З іншого боку, якщо я переробив певні зміни до теми гілка (від гілки X) та натисніть її, її цілком нормально знову перезавантажуватись після того, як інший розробник змінює гілку теми. По суті, я використовую mergeвже досить давно, але ми в тому ж човні, що і darwinweb.net/articles/86, і історія майже непридатна.
Hemant Kumar

@Hemant: Звільнення зобов’язань після натискання на публічне репо, як правило, погана ідея. Незважаючи на це, поради з цитованої вами статті про Дарвінвеб звучать розумно, якщо ваш робочий процес нагадує їхній. Перегляньте мою оновлену відповідь щодо списку інших посилань, які можуть допомогти.
Тім Геніган

Оновіть посилання на сторінку "ProGit" про "Команда приватних керованих" на git-scm.com/book/en/…
Eimantas

Таким чином, технічно, git-коміти залишаються однаковими, але "відмова від існуючих комітетів і створення нових, схожих, але різних" - це однакові коміти з різними ша1 id? добре, це був би єдиний очевидний спосіб, коли я можу придумати, чому співробітники повинні були б знову об'єднати власну роботу!
Ciasto piekarz

@Ciastopiekarz, це тому, що ви переписуєте історію у верхньому репо, і місцеві репости розробника можуть мати вказівки на це. Тепер їхні покажчики застарілі: клієнт git не має іншої можливості, крім використання старших покажчиків і покладатися на людину для сортування решти. Це повторне злиття, і воно може бути ДУЖЕ безладним з великою кількістю заплутаних змін, які потрібно впорядкувати вручну! Таким чином, рекомендація ніколи не поновлювати те, що вже було висунуто на репо-версію за течією. Це хороша порада, і її не слід ігнорувати, якщо ви не експерт з глибокими знаннями.
Forbin

240

Щоб зрозуміти це, нам потрібно трохи розібратися в тому, як працює git. Сховище git - це структура дерева, де розташовуються вузли дерева. Ось приклад дуже простого сховища: Коли ви розщедриться

він має чотири коміти на головній гілці, і кожен коміт має ідентифікатор (у цьому випадку a, b, c і d). Ви помітите, що d на даний момент є останньою коміткою (або HEAD) головного відділення. введіть тут опис зображення

Тут у нас є дві гілки: майстер і моя. Ви можете бачити, що і master, і моя гілка містять символи a і b, але вони починають розходитися: master містить c і d, тоді як my-гілка містить e і f. b, як кажуть, є "базою злиття" моєї гілки порівняно з головним - або, звичайно, просто "базою". Це має сенс: ви бачите, що моя філія була заснована на попередній версії master.

Тож скажімо, що мій відділення застаріло, і ви хочете ознайомити його з останньою версією майстра. Інакше кажучи, моя гілка повинна містити c і d. Ви можете зробити злиття, але це призводить до того, що філія містить дивні комісії для злиття, що ускладнюють перегляд запиту на витяг. Натомість ви можете зробити ребауз.

введіть тут опис зображення

Коли ви перезавантажуєте, git знаходить основу вашої гілки (у цьому випадку, b), знаходить усі коміти між цією базою та HEAD (у цьому випадку e та f) та повторно відтворює ці коміти на HEAD гілки ви відмовляєтесь (у цьому випадку майстер). Git фактично створює нові коміти, які представляють, як виглядають ваші зміни на вершині майстра: на діаграмі ці коміти називаються e ′ і f ′. Git не стирає ваші попередні зобов’язання: e і f залишаються недоторканими, і якщо щось піде не так з перезавантаженням, ви можете повернутися до того, як було раніше.

Коли багато різних людей симулюють роботу над проектом, запити на витяг можуть швидко застаріти. "Застійний" запит на витяг - це той, який більше не відповідає сучасній основній лінії розробки, і його потрібно оновити, щоб його можна було об'єднати в проект. Найпоширеніша причина, по якій запити на витягнення застаріли, пов’язана з конфліктами: якщо два запити на витягування модифікують схожі рядки в одному файлі, а один запит на витягування об'єднується, запит про витягнення тепер буде конфліктом. Іноді запит на виклик може залишатися незмінним без конфліктів: можливо, зміни в іншому файлі в кодовій базі вимагають відповідних змін у вашому запиті на витяг, щоб відповідати новій архітектурі, або, можливо, гілка була створена, коли хтось випадково об'єднав невдалі тестові одиниці тесту з майстер відділення. Незалежно від причини,


68

Звільнення переписує історію. Якщо про цю історію ніхто не знає, то це прекрасно. Якщо ж ця історія загальновідома, то переписування історії в Git працює саме так, як це відбувається в реальному світі: вам потрібна змова.

Конспірації справді важко тримати разом, тому вам краще уникати в першу чергу публічних відділень.

Зауважте, що є приклади успішних змов: puфілія сховища git Junio ​​C. Hamano (офіційне сховище Git SCM) часто повторно базується. Це працює так, що майже всі, хто використовує pu, також підписалися на розсилку розсилки розробників Git, а той факт, що puфілія перезавантажена, широко розголошується у списку розсилки та веб-сайті Git.


4
+1. Я думаю, puгілка git.git є надзвичайно корисним прикладом того, як використовувати rebase у (загальнодоступному) робочому процесі. Для тих, хто з ним не знайомий, загальна ідея полягає в тому, щоб перезавантажити тематичні гілки, які не мають жодних комісій next(нестабільна гілка безпосередньо перед об'єднанням у майстер), а потім відновити puгілку шляхом перезавантаження nextта об'єднання всіх галузей теми. (Джерело: Документація / howto / support-git.txt git.kernel.org/?p=git/git.git;a=blob;f=Documentation/howto/… )
Cascabel

25
+1 за "Переписування історії в Git працює так само, як це відбувається в реальному світі: вам потрібна змова"
Спіл Сміт

"Публічне оголошення не потрібно, оскільки pu - це викидаюча гілка, як описано вище". git-scm.com/docs/gitworkflows Ми робимо щось подібне на роботі, "TEMP-щось-новітнє" - це викидаюча гілка, яка є комбінацією останніх змін, може бути об'єднанням декількох гілок функцій, може бути видалена і відтворені в будь-який момент часу і не повинні розвиватися далі.
пікч

6

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

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

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