@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 моїх комітів, і НІ! ДЕ ВОНИ? ВСІ ПІДГОТОВЛЕННЯ З master
200 останніми вчинками зараз, тому що я злився 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