Чи неправильно git push push force?


11

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

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

Однак це призводить до того, що мені часто доводиться робити git push --forceвіддалене сховище після ребави, дії, яке, як правило, нахмуриться. Або як говорить пов'язана сторінка github:

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

Чи існує (загальновизнана) політика, яка вирішує цей конфлікт?

Чому це не дублікат « Чи так суттєво важливий git« Золоте правило звільнення »?

У цьому моєму запитанні пропонується розв'язати конфлікт між політикою, яка хотіла б створити резервну копію вашої роботи у віддаленому сховищі та повторно звільнити свою роботу , тоді як інше питання намагається заперечити наявність конфлікту і запитує, чому деякі люди думають, що конфлікт існує взагалі, і, таким чином, запитує, чому "важливо" не натискати на знищення сили?



1
@gbjbaanb, якщо ви робите WIP-зобов’язання, повторна база дуже корисна, щоб уникнути багато комісій за роботу, що коштує один день. Я часто вказую на невеликі зміни просто для того, щоб у мене був варіант "скасувати стан, який я пам'ятаю", якщо це потрібно - більшість з них не мають значення / шумують для основної історії репо (саме тому ребазація настільки корисна).
Ендерленд

1
@gbjbaanb Я думаю, що це питання думки. Багато команд використовують стратегію звільнення, щоб зберегти свою історію в чистоті.
Chiel ten Brinke

1
@enderland всі хочуть гарної історії, її все-таки неправильну (і небезпечну) річ робити, як показано за посиланням. Торвальдс ніколи не повинен був це вводити, він повинен був дозволити "компресії" на екрані замість цього.
gbjbaanb

1
@gbjbaanb, але ... він цього не зробив, і тому ми повинні працювати з тим, що маємо. Для мене набагато корисніше мати один комітет на головній гілці замість 30+ індивідуальних та поступових комітів з кожної гілки функцій. Але, мабуть, у кожного буде різний робочий процес
Ендерланд

Відповіді:


5

Ключове питання, яке потрібно задати собі:

  • Чи зберігаєте ви свою віддалену гілку після об'єднання назад у майстер?

Якщо ви видалите свою віддалену гілку функції після об'єднання в головну, ви вже втрачаєте історію. Якщо припустити, що ви скошуєте / перезавантажуєте відділення перед тим, як здійснити об'єднання / PR, ви втратите цю історію. У вашому випадку все ваші сили натискання дозволяють використовувати github як резервну копію.

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

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

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

Що ви можете зробити замість своєї проміжної роботи, це створити вилку цієї гілки. Ви можете натиснути на це, а потім перезавантажити всі свої зобов’язання в одне зобов’язання перед об'єднанням, тому коли ви об'єднаєте їх у свою галузь функцій, у вас є лише 1 фіксація (з перезавантаженою історією всієї вашої гілки).


"Чи зберігаєте ви свою віддалену гілку після об'єднання назад у майстер?" Я припускаю, що ви запитуєте, чи можу я зберегти непроменену гілку? Ні, AFAIC. Тим не менш, натискання на це може теоретично призвести до втрати комісій від інших користувачів, які перейшли до тієї ж гілки.
Chiel ten Brinke

@ChieltenBrinke Я трохи про це відредагував. FYI
enderland

Я думаю, що розгортання як міра запобігання руйнуванню комітетів під час натискання насправді є дуже гарною пропозицією. Але AFAIK це насправді не git концепція, і вам потрібна сервісна обгортка для цього, щоб зробити це легко (наприклад, github). Я з цим прав? Чи, можливо, я помиляюсь із вашим використанням терміна "вилажування" лише для створення окремої гілки?
Chiel ten Brinke

@ChieltenBrinke добре, що ви можете зробити те ж саме різними способами. Якщо ваша гілка функції знаходиться у віддаленому сховищі, ви можете розблокувати репо і мати свою версію цієї гілки. А потім з’єднайте цю гілку з віддаленою гілкою після скоєння скосів. Або ви можете просто створити іншу локальну гілку (можливо featurebranch-local), а потім зробити активну розробку на цій гілці з такою кількістю комісій, скільки вам потрібно. Після того, як ви хочете об'єднати, скасуйте ці комірки, а потім об'єднайте їх у функції. В основному просто робиш Dev у фактичній тимчасовій гілці, а потім розкочуєш / зливаєшся у твій функції.
Ендерленд

Якщо припустити, що розгортання репо не є можливим, оскільки не використовується github, ми б працювали з "приватною" develop-featureгілкою. Звичайно, приватність полягає виключно за умовами і не застосовується нічим, але може бути частиною політики, особливо якщо для цього вводяться певні конвенції про іменування галузей. (Можливо, я зараз занадто занепокоєний, а може і не :) Поєднання з --force-with-leaseне може нашкодити, хоча не слід покладатися на це, як зазначалося в моєму іншому пості.
Chiel ten Brinke

3

Я перераховую тут деякі можливості, які перетинають мою думку.

Завжди переглядайте нову гілку

Маючи безладну гілку some-feature, переставте її на нову гілку. Напр

$ git checkout -b some-feature-rebase
$ git rebase -i master # etc..

Потім some-feature-rebaseпереглянули та інтегрували.

Проблема: Великий недолік тут полягає в тому, що, строго кажучи, вам потрібна нова гілка для кожного ребазу. (Ви можете мати кілька знижок, якщо внесете зміни, наприклад, після перегляду коду)

Використовуйте git push --force-with-lease

Я щойно дізнався про git push --force-with-leaseальтернативуgit push --force , якій

відмовляється оновлювати філію, якщо ми не очікуємо такого стану; тобто ніхто не оновлював гілку вище за течією.

Проблема : Це, здається, покращує ситуацію, коли ми використовуємо просто --force, але все ще є деякі застереження, особливо, коли я роблю git fetchзамість цього git pull, який оновлює наші локальні гілки вище за течією, --force-with-leaseзадумавшись про те, що на пульті дистанційних змін не було внесено відділення.

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