1

Тема: Git не створений для програмістів та для роботи декількох людей одноча

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

Доказ того, що воно не створене для коду - це те, як воно розглядає конфлікти.

Якщо у нас є файл з класом та деякими методами, а потім два розробника додали нові методи в цей клас, то будь-яка людина з середнім iq зрозуміє, що найпростіший спосіб злити ці два файла - це скопіювати додані методи одним розробником в той самий клас, тому що метод, чи функція - це окрема сутність в тому файлі, а не просто набір сраних рядків тексту, але цей дебільний ґіт надто примітивний шмат лайна, аби це зрозуміти (чому ми його взагалі використовуємо? бо кращого нічого нема?), і тому воно просто розбиває ці два файли на лінії і мерджить файли лінійно  *WALL*  (який ідіот додумався використовувати це для коду?)

Які є альтернативи цьому шматку лайна? Не хочу використовувати його на своєму пет проєкті.

2

Re: Git не створений для програмістів та для роботи декількох людей одноча

Може приклади якісь допоможуть?...

Було:

# main branch
class MyClass:
    def method1(self):
        print("This is method 1")

Гілка девелопера Петра:

# branchA
class MyClass:
    def method1(self):
        print("This is method 1")

    def method2(self):
        print("This is method 2 from branchA")

Гілка девелопера Миколи:

# branchB
class MyClass:
    def method1(self):
        print("This is method 1")

    def method3(self):
        print("This is method 3 from branchB")

Тімлід мерджить пул ріквести після рев'ю:

# main branch after merge
class MyClass:
    def method1(self):
        print("This is method 1")

    def method2(self):
        print("This is method 2 from branchA")

    def method3(self):
        print("This is method 3 from branchB")

3

Re: Git не створений для програмістів та для роботи декількох людей одноча

Я схожу ситуацію зустрічав, хоча й не можу точно пригадати всі обставини. Однак, я не готовий обзивати лайном потужний інструмент, доки мені не покажуть потужніший, який би з цими задачами справлявся краще, і тим більше аналізував код з точки зору програмування, а не як звичайний текст. Думаю, що в природі такого поки що не існує... Хоча, з розвитком ШІ, можливо що невдовзі з'явиться, або з'являться якісь інструменти ззовні, призначені для вирішення конфліктів з меншою участю людини.

Подякували: leofun011

4 Востаннє редагувалося flatliner (13.03.2024 14:44:56)

Re: Git не створений для програмістів та для роботи декількох людей одноча

О! Здається пригадав обставини. Переписуємо проект А на Б, таскаємо з А в Б велику кількість готового коду, скажімо, всі моделі. Намагаємось їх в проекті Б не чіпати, щоб нові фічі з А можна було легко переносити в Б разом з оновленими моделями, однак, іноді трапляється, що потрібно додати якийсь функціонал.

Тож маємо в проекті Б:

class Model_Something {
...
public static function new_method_for_B()
{
...
}

Копіюємо оновлену модель:

class Model_Something {
...
public static function new_method_from_A()
{
...
}

Тобто це не зовсім мердж, а перезаписування моделі новою версією. І тоді в мене є вибір, відкотити зміну - повернути метод for_B, але тоді зникне метод from_A. Зазвичай я копіюю останній, відкочую, а тоді вставляю скопійоване...

PS: Поточню, що мова йде про зміни, які припадають на ті самі рядки... Коли вони не перетинаються, можна легко відкотити затерті зміни, не втрачаючи нового коду з проекту А.

Подякували: FakiNyan1

5

Re: Git не створений для програмістів та для роботи декількох людей одноча

Хтось просто не вміє працювати з git :)

Подякували: leofun011

6

Re: Git не створений для програмістів та для роботи декількох людей одноча

flatliner написав:

О! Здається пригадав обставини. Переписуємо проект А на Б, таскаємо з А в Б велику кількість готового коду, скажімо, всі моделі. Намагаємось їх в проекті Б не чіпати, щоб нові фічі з А можна було легко переносити в Б разом з оновленими моделями, однак, іноді трапляється, що потрібно додати якийсь функціонал.

Тож маємо в проекті Б:

class Model_Something {
...
public static function new_method_for_B()
{
...
}

Копіюємо оновлену модель:

class Model_Something {
...
public static function new_method_from_A()
{
...
}

Тобто це не зовсім мердж, а перезаписування моделі новою версією. І тоді в мене є вибір, відкотити зміну - повернути метод for_B, але тоді зникне метод from_A. Зазвичай я копіюю останній, відкочую, а тоді вставляю скопійоване...

PS: Поточню, що мова йде про зміни, які припадають на ті самі рядки... Коли вони не перетинаються, можна легко відкотити затерті зміни, не втрачаючи нового коду з проекту А.

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

7

Re: Git не створений для програмістів та для роботи декількох людей одноча

FakiNyan написав:

Git - це жахливий застосунок

Сміливе твердженя. Можемо зробити кращий для якоїсь одної мови [або кількох мов] програмуваня, але більшість розробників відкинуть такий продукт, бо вони працюють з іншими мовами.
Найбільша біда в Git це diff, він не аналізує вміст, дивиться тільки на символ нового рядка.

FakiNyan написав:

який ідіот додумався використовувати це для коду?

Ну.. якщо зануритись в історію, то: Були часи, коли розробники тягнули сурси через FTP, вносили зміни, змінені файли заливали (через FTP) замість старих; Коли треба було глянути стару версію, то тягнули 1 із архівів; Архіви робили в кінці кожного робочого дня.
Я тих часів вже не застав, але старші ще памятають.

FakiNyan написав:

Які є альтернативи цьому шматку лайна?

Альтернативи є, але всі вони ше гірші.

FakiNyan написав:

Не хочу використовувати його на своєму пет проєкті.

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

Подякували: flatliner1

8

Re: Git не створений для програмістів та для роботи декількох людей одноча

frz написав:

Може приклади якісь допоможуть?...

Було:

# main branch
class MyClass:
    def method1(self):
        print("This is method 1")

Гілка девелопера Петра:

# branchA
class MyClass:
    def method1(self):
        print("This is method 1")

    def method2(self):
        print("This is method 2 from branchA")

Гілка девелопера Миколи:

# branchB
class MyClass:
    def method1(self):
        print("This is method 1")

    def method3(self):
        print("This is method 3 from branchB")

Тімлід мерджить пул ріквести після рев'ю:

# main branch after merge
class MyClass:
    def method1(self):
        print("This is method 1")

    def method2(self):
        print("This is method 2 from branchA")

    def method3(self):
        print("This is method 3 from branchB")

пояснюю.
в гілці мастер створюю файл з клясом та методом sayHello.
далі створюю гілку А, додаю до клясу новий метод sayBye.
далі йду взад у мастер і створюю гілку Б, в ній додаю метод sayHaslo.
потім мерджу гілку А в мастер.
тепер хочу змерджити мастер в гілку Б, і маю ось це.
https://replace.org.ua/uploads/images/2564/07faa15fe996bafde729810e77327171.png

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

Тому я й кажу, шо це не для коду створено, а для тексту, бо для коду порівнювати треба не рядки, а парсити той код на окремі елементи, як от кляс, змінна, метод, і далі дивитись - якшо методу sayHaslo раніше не було, а тепер є, і більше нічого не змінилось, то ми просто додаємо той метод в кляс, а не ґвалтуємо мізки факіняну.

9

Re: Git не створений для програмістів та для роботи декількох людей одноча

Користуйся мелдом. (meld)

Подякували: flatliner, leofun01, FakiNyan3

10 Востаннє редагувалося flatliner (14.03.2024 02:23:54)

Re: Git не створений для програмістів та для роботи декількох людей одноча

Угу. Взагалі-то дуже корисно користуватися якимось гуєм до гіту. Мені дуже подобався smartgit, але він пропрієтарний. Непоганий також модуль git вбудований у phpstorm (теж пропрієтарний). З безкоштовних можу з великою натяжкою порекомендувати лише git-cola (до речі для порівняння там використовується kdiff3, але його можна замінити на той же meld, якщо він більш до вподоби). Ну і зовсім вже на крайній випадок - плагіни для vscode, як на мене вони не зручні, але практично всі операції, які бувають потрібні, там виконати можна... іноді дуже через сраку, але можна )

PS: А зовсім забув. Є ще TortoiseGit під віндовз...

Подякували: leofun01, FakiNyan2

11

Re: Git не створений для програмістів та для роботи декількох людей одноча

FakiNyan написав:

пояснюю.
в гілці мастер створюю файл з клясом та методом sayHello.
далі створюю гілку А, додаю до клясу новий метод sayBye.
далі йду взад у мастер і створюю гілку Б, в ній додаю метод sayHaslo.
потім мерджу гілку А в мастер.
тепер хочу змерджити мастер в гілку Б, і маю ось це.

Гілку "Б" можна було створити (форкнути) на базі гілки "А" (поки її не змерджено) та робити зміни відносно неї, а не мастер гілки, тоді, коли гілку "А" змерджать, у своїй гілці "Б" робите рібейз на мастер і вуаля, ніяких конфліктів.

FakiNyan написав:

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

Це те, як працює git (й не лише він), оскільки обидві гілки "форкнуті" з мастера, то так, це справедливий конфлікт. А ваш хейт випливає лише з нерозуміння його роботи :)

FakiNyan написав:

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

Код і є текстом, не більше того. Головне, щоб те, що розробник хоче змерджити відповідало його намірам і жодна розумна тулза чи ШІ не зможе цього передбачити, бо інколи люди зовсім не логічні.. Якби git мерджив все автоматом, ха-ха, це було б справжнє пекло.

Подякували: leofun011

12

Re: Git не створений для програмістів та для роботи декількох людей одноча

1. треба просто більше познайомитись з git, більше практики
2. раціонально розприділяти таски (мінімізувати одночасну зміну сутності)
3. старатись писати чистий код, ознайомитись з принципами SOLID. Щоб не було такого - створити клас на сто пятсот рядків коду, в якому методи на всі випадки і різні таски потребують зміни в ньому.
4. Користуватись diff-інструментами типу meld, winmerge.

Також через різні git gui (типу SourceTree, SmartGit) можна легше боротись з конфліктами (use theirs, use mine).

Ну але іноді буває шо треба все вручну порезолвити, ніц не поробиш ) Ідеального нічого немає )

Подякували: flatliner1

13 Востаннє редагувалося Droid 77 (31.03.2024 20:35:58)

Re: Git не створений для програмістів та для роботи декількох людей одноча

FakiNyan написав:

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

Доказ того, що воно не створене для коду - це те, як воно розглядає конфлікти.

Якщо у нас є файл з класом та деякими методами, а потім два розробника додали нові методи в цей клас, то будь-яка людина з середнім iq зрозуміє, що найпростіший спосіб злити ці два файла - це скопіювати додані методи одним розробником в той самий клас, тому що метод, чи функція - це окрема сутність в тому файлі, а не просто набір сраних рядків тексту, але цей дебільний ґіт надто примітивний шмат лайна, аби це зрозуміти (чому ми його взагалі використовуємо? бо кращого нічого нема?), і тому воно просто розбиває ці два файли на лінії і мерджить файли лінійно  *WALL*  (який ідіот додумався використовувати це для коду?)

Які є альтернативи цьому шматку лайна? Не хочу використовувати його на своєму пет проєкті.

Спобуйте будь який "Base Camp" в будь якій великій компанії (незалежно від мови програмування та навичок).
Там перше на що звертають увагу:
Перше це, на що Ви здатні при створенні ак на git, друге як комітите свій хід робіт.Ззвертають увагу на те як студент комітить (коментує свої дії). Розумні коменти до змін в коді багато чого варті, при груповій розробці одного продукта.