@Mark Longair прибив це у своїй відповіді тут , але я хотів би додати трохи додаткових розумінь.
Пов’язані та відповіді на питання про те, як розбити великий запит на витяг (PR), особливо коли розбиття ваших комітетів недоцільно через одного або декількох об'єднань майстра у вашу особливість_branch
Моя ситуація:
я зробив великий feature_branchз 30 комітами і відкрив запит на виклик (PR) на GitHub, щоб об'єднати його master. Відділення masterзмінило тонну під мною, і отримав 200 комісій, моїх feature_branchне було. Для вирішення конфліктів я зробив git checkout feature_branchі git merge masterоб'єднав masterзміни в свої feature_branch. Я вирішив mergeзамість rebaseостаннього майстра, тому мені довелося б вирішувати конфлікти лише один раз, а не потенційно 30 разів (один раз за кожен мій вчинок). Я не хотів розбивати свої 30 комірок на 1 спочатку, а потім переробляти на останніmasterтому що це може знищити історію коментарів GitHub з огляду в PR. Отже, я об'єднав майстра у свою галузь функцій і вирішив конфлікти 1 раз. Все було добре. Однак мій піар був занадто великим для перегляду колег. Мені потрібно було розділити його. Я поїхав сквош 30 моїх комітів, і НІ! ДЕ ВОНИ? ВСІ ПІДГОТОВЛЕННЯ З master200 останніми вчинками зараз, тому що я злився masterу своєму feature_branch! ЩО РОБИТИ?
git cherryвикористання, якщо ви хочете спробувати git cherry-pickіндивідуальні зобов'язання:
git cherry на допомогу (на зразок)!
Щоб побачити всі комітети, які є, feature_branchале НЕ в, masterя можу:
git checkout feature_branch
git cherry master
АБО я можу перевірити комісії з будь-якої філії без того, щоб переконатися, що я feature_branchспочатку виконуючи git cherry [upstream_branch] [feature_branch]такі дії. Знову ж таки, це перевіряє, щоб побачити, які в них ARE, feature_branchале НЕ upstream_branch( masterу цьому випадку):
git cherry master feature_branch
Додавання -vтакож показує рядки теми повідомлення про фіксацію:
git cherry -v master
Трубопровід до "count count" "-lines" ( wc -l) підраховує, скільки комісій існує:
git cherry master | wc -l
Ви можете порівняти цей підрахунок з номером комісій, показаним у вашому PR-програмі GithHub, щоб краще зрозуміти, чи git cherryдійсно працює. Ви також можете порівнювати git хеші один за одним і побачити, що вони відповідають між git cherryі GitHub. Зверніть увагу , що git cherryне розраховуватиметься будь злиття фіксацій, ви злиті masterв feature_branch, але GitHub ВОЛЯ. Тож якщо ви побачите невелику невідповідність у підрахунку, перегляньте на сторінці GitHub PR-комісії слово "об'єднати", і ви, мабуть, побачите, що це винуватець, який не відображається в git cherry. Наприклад: комітет під назвою "Об'єднати" головну гілку "в feature_branch" з'явиться в PR GitHub, але не під час запуску git cherry master feature_branch. Це добре і очікувано.
Отже, тепер у мене є спосіб виявити, що відрізняється, я, можливо, захочу вибрати вишню на свіжу галузь функції, щоб розділити цю різницю: я можу використовувати git cherry master feature_branchлокально або дивитися на комітети в PR GitHub.
Як сквош може допомогти - якби ми могли сквош:
Але альтернативно, щоб розділити мою велику різницю, - це розбити всі 30 моїх комітетів на одну, виправити її на новій гілці функції, м'яко скинути патч-комісію, а потім використовувати git guiдля додавання фрагментів файл за файлом, шматок за шматок або рядок за рядком. Як тільки я отримаю одну підфункцію, я можу вчинити те, що я додав, потім перевірити нову гілку, додати ще кілька, зробити фіксацію, перевірити нову гілку тощо, поки у мене не з’явиться моя велика функція, розбита на кілька підфункцій . Проблема полягає в тому, що мої 30 комісій переплутані з іншими 200 комітами від інших людей через мою передачу git merge masterв мою feature_branch, тому звільнення від цього є недоцільним, тому що мені доведеться просіяти 230 комітетів, щоб повторно замовити і розчавити мої 30 комітів.
Як використовувати файл патча як набагато простішу заміну для сквош:
Обхід полягає в тому, щоб просто отримати патч-файл, що містить "еквівалент сквош" з усіх 30 моїх комітетів, закріпити його на новому вилку master(новій гілці підфункції) і працювати звідти так:
git checkout feature_branch
# ensure I have the latest changes from master merged into feature_branch
git merge master
# Obtain a patch file, which is the equivalent of a squash of my 30 commits into 1 commit:
git diff master..feature_branch > ~/mypatch.patch
git checkout master
# Create a new, sub-feature branch
git checkout -b feature_branch2
# Patch the 30 commit patch file onto it:
git apply ~/mypatch.patch
Тепер у мене патч на 30 комітів, застосований локально, але невідображений і не видалений.
Тепер використовуйте git guiдля додавання файлів, фрагментів та / або рядків та розділіть великий PR або "diff":
Зауважте, що якщо у вас немає git gui, ви можете легко встановити його в Ubuntu за допомогою sudo apt install git-gui.
Тепер я можу запустити git guiта почати додавати файли, фрагменти та / або рядки (клацаючи правою кнопкою миші в програмі GUI git) та розбивати гілку функції 30 фіксування на підрозділи, як описано вище, повторно додаючи, здійснюючи, а потім розгортаючи нова гілка функцій і повторює цей цикл, поки всі зміни не будуть додані до гілки підфункцій, і моя функція на 30 комітів буде успішно розбита на 3 або 4 підфункції. Я можу відкрити окремий піар для кожної з цих підфункцій, і моїй команді їх буде легше переглянути.
Список літератури:
- Створіть патч або diff файл із сховища git та застосуйте його до іншого іншого сховища git