Форкінг проти розгалуження в GitHub


278

Я хотів би дізнатися більше про переваги та недоліки розгортання проекту github порівняно зі створенням гілки проекту github.

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

Відповіді:


279

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

Форкінг - це не що інше, як клон на стороні сервера GitHub :

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

Ви тримаєте вилку синхронізовано з оригінальним проектом:

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

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

Мета справді - дозволити співпрацювати, хоча безпосередня участь не завжди можлива.


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

вилка на GitHub

Досвід злиття був би приблизно таким самим, але з додатковим рівнем непрямості (натисніть спочатку на вилку, потім попросіть тягнути, ризикуючи еволюцією на оригінальному репо, змушуючи ваші швидкі злиття вперед вже не перемотати вперед) .
Це означає, що правильним робочим потоком є git pull --rebase upstream(відновлення роботи над новими комісіями з висхідного потоку), а потім git push --force origin, щоб переписати історію таким чином, ваші власні зобов’язання завжди перебувають на вершині комітетів із початкового (вище) поточного репо .

Дивитися також:


3
Ми розробляємо проект вдома, і немає проблем із тим, щоб додати людей як співробітників. Але ми хотіли б зрозуміти, чи розгортання проекту суттєво зробить об'єднання змін до основного проекту.
репрограміст

7
@reprogrammer: якщо ви можете додати співробітників, роздрібнення не потрібно. вони можуть локально переобладнати, потім злитися на цільовій гілці, а потім натиснути безпосередньо на одне центральне репо, замість того, щоб керувати двома центральними репо (первісною та вилкою). Ребазація була б приблизно такою ж, але з додатковою непрямістю, коли бере участь вилка. Знову: тут не потрібно. Я оновив свою відповідь.
VonC

14
Чесно кажучи, навіть якщо цього не потрібно, завжди гарна ідея мати священний репо, який можна писати лише для старших розробників, керівників команд чи інших «довірених» людей . Усі інші члени команди повинні працювати у вилах (~ пісочниці) та внести свої зміни у вигляді запиту на тягу. Оскільки DVCS це робить можливим, ми адаптували це як "найкращу практику" і успішно використовуємо це навіть у найменших проектах ...
intland

1
@intland, тож ви більше прихильнітесь до "робочого процесу менеджера інтеграції", як описано в stackoverflow.com/users/6309/vonc?tab=respoances тоді? Оскільки я ввів Git у великий корпус, я схильний спершу прийняти централізований робочий процес (більш звичний для всіх), перш ніж переходити на "Менеджер інтеграції".
VonC

15
Ми повинні називати вилки «гілочками», оскільки вони відламуються гілкою і використовуються для створення цілого нового дерева. Всього два мої центи - мені подобається дендропардонна ідіома.
Ерік

66

Ось відмінності на високому рівні:

Розгалуження

Плюси

  • Зберігає гілки, розділені користувачем
  • Зменшує захаращення в первинному сховищі
  • Ваш командний процес відображає процес зовнішнього внеску

Мінуси

  • Складніше бачити всі активні (або неактивні) гілки з цього приводу)
  • Співпраця на гілці складніше (власник вилки повинен додати особу як співавтора)
  • Вам потрібно зрозуміти поняття декількох дистанційних в Git
    • Вимагає додаткового розумового обліку
    • Це ускладнить робочий процес людям, яким не дуже комфортно з Git

Відгалуження

Плюси

  • Тримає всю роботу, яка проводиться навколо проекту, в одному місці
  • Усі співробітники можуть натиснути на одну гілку, щоб співпрацювати над нею
  • Є лише один пульт дистанційного керування Git

Мінуси

  • Гілки, які занедбані, можуть накопичуватися легше
  • Процес внеску вашої команди не відповідає процесу зовнішнього внеску
  • Потрібно додати членів команди як учасників, перш ніж вони зможуть вийти на відділення

Що розуміється під "процесом зовнішнього внеску"?
Карс Барендрехт

1
@KarsBarendrecht Оновлено, щоб використовувати термін "зовнішній внесок". Той, хто не має writeдозволу на сховище.
Айдан Фельдман

45

Це пов'язано із загальним робочим процесом Git. Ви навряд чи зможете перейти безпосередньо до основного сховища проекту. Я не впевнений, чи репозиторій проекту GitHub підтримує управління доступом на базі філій, оскільки ви не хочете нікому надати дозвіл наштовхуватися на головну гілку.

Загальна закономірність така:

  • Складіть у сховище оригінального проекту, щоб він мав свою власну копію GitHub, до якої ви зможете надсилати зміни.
  • Клоніруйте сховище GitHub на локальній машині
  • За бажанням додайте оригінальний сховище як додатковий віддалений сховище у вашому локальному сховищі. Тоді ви зможете отримати зміни, опубліковані в цьому сховищі безпосередньо.
  • Внесіть зміни та власні зобов’язання на місцевому рівні.
  • Перемістіть зміни до вашого сховища GitHub (оскільки у вас зазвичай не буде дозволу на запис безпосередньо у сховище проекту).
  • Зверніться до керівників проекту та попросіть їх отримати ваші зміни та переглянути / об'єднати, і нехай вони повернуться до сховища проекту (якщо ви та вони хочете).

Без цього для громадських проектів досить незвично дозволяти комусь безпосередньо рухати власні зобов'язання.


@RecoJohnson, ну ... я не використовував у своїй відповіді слово "тягнути" (але "терміни" ефективно "витягнути" + "злити" в термінах Git). Яке використання "push", на вашу думку, є неправильним?
Бруно

2
@RecoJohnson Ви як учасник натискаєте на вашу вилку GitHub; керівники проекту витягують ваш внесок з вашої вилки.
mljrg

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

8

Форкінг створює абсолютно новий сховище з існуючого сховища (просто робимо git-клон на gitHub / bitbucket)

Форли найкраще використовувати: коли мета "розколу" полягає у створенні логічно незалежного проекту, який ніколи не може об'єднатися зі своїм батьківським.

Стратегія відділення створює нову гілку над існуючим / робочим сховищем

Гілки найкраще використовувати: коли вони створюються як тимчасові місця для роботи за допомогою функції, з наміром об'єднати гілку з початком.

Більш конкретно: - У проектах з відкритим кодом вирішує, хто може перейти до сховища. Однак ідея відкритого коду полягає в тому, що кожен може зробити свій внесок у проект.

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

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

Нижче наведені посилання надають різницю в чітко поясненому вигляді:

https://blog.gitprime.com/the-definitive-guide-to-forks-and-branches-in-git/

https://buddy.works/blog/5-types-of-git-workflows

http://www.continuousagile.com/unblock/branching.html


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