Як побачити, які комісії в одній галузі відсутні в іншій?


180

У мене дві гілки develі next. У мене є більш-менш величезна кількість комітетів. Деякі з комітетів є вишневим next. Також я додав декілька комісій до наступних, до яких об’єднано devel.

Тепер я хотів би побачити, чого не вистачає next, тому я можу перевірити зміни докладно, перш ніж їх довести next. Моє запитання зараз, як я можу побачити, в яких комісіях є, develа не в наступному?



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

Відповіді:


210

Мало використана команда git cherryпоказує вам, які ще не були вибрані вишні. Документація на тутgit cherry є , але, коротше кажучи, ви просто повинні мати можливість:

git checkout devel
git cherry next

... і подивіться вихід таким чином:

+ 492508acab7b454eee8b805f8ba906056eede0ff
- 5ceb5a9077ddb9e78b1e8f24bfc70e674c627949
+ b4459544c000f4d51d1ec23f279d9cdb19c1d32b
+ b6ce3b78e938644a293b2dd2a15b2fecb1b54cd9

Початкові зобов’язання +будуть такими, яких ви ще не вибрали next. У цьому випадку я б тільки вибрав вишню до одного часу. Ви можете додати -vпараметр до git cherryкоманди, щоб він також виводив рядок теми кожного комітету.


Чудово, це те, що мені було потрібно. Було б також непогано отримати короткий опис тестів, але я можу це сценарій.
Саша Ефферт

29
Вам не потрібно git checkout devel, ви можете просто зробити git cherry next devel.
Робін Уінслоу

21
"Ви можете додати -v" ? Вишня без a -v- це як lsбез -la. ; -J
Сліпп Д. Томпсон

1
І ви б не знали способу отримати cherryпозначення або виключення рівнозначних комісій, чи не так? cherryсхоже на сантехнічну команду, але не (здається) не пропонує багато варіантів. Що я зараз перебуваю в середині, git cherryдає мені помилкові позитиви, але @ sehe git log --cherry-pickправильно виключає попередньо вибрані / відкинуті зобов’язання.
Сліпп Д. Томпсон

Документація наводить конкретний приклад: git-scm.com/docs/git-cherry#_concrete_example
ams

107

Також можна використовувати

git log --left-right --graph --cherry-pick --oneline devel...next

щоб отримати хороший список фактичних різних комітетів, не поділених між гілками.

Оперативне слово є --cherry-pick

--cherry-pick

Пропустіть будь-яку комісію, яка вносить ту саму зміну, що й інша комісія з "іншої сторони", коли набір комісій обмежений симетричною різницею. Наприклад, якщо у вас є дві гілки, A і B, звичайний спосіб переліку всіх комісій, що знаходяться лише на одній їх стороні, є --left-right, як приклад вище в описі цього параметра. Однак він показує комітети, які було вибрано вишнею з іншої гілки (наприклад, "3-й на b" може бути вишневим від гілки A). При такому варіанті такі пари комітетів виключаються з виводу.

Оновлення Як було сказано в коментарі, останні версії git додано --cherry-mark:

--cherry-mark

Як --cherry-pick (див. Нижче), але позначення еквівалента здійснює з =, а не опускаючи їх, і нееквівалентних з +.


1
Це для мене не вийшло. Моя версія git не знає - one-line, тому я її видалив. Тоді мені довелося обміняти devel і далі, і це спрацювало. Дуже хороша!
Саша Ефферт

@SaschaEffert: вам не потрібно було перемикати на devel і next (помічайте ТРИ крапки, а не ДВА). Однак це може бути інакше, якщо ви використовували стародавню версію git (?), Але в такому випадку ви мали б отримати помилку повторного аналізу на трьох крапках.
sehe

2
Для розваги я зрозумів, що синтаксис "..." (симетрична різниця) rev-parse був доданий у липні 2006 року , а документація на нього була оновлена ​​в червні 2008 року . Радість з відкритим кодом!
sehe

1
'gls - first-parent --cherry-mark --left-only development ... next', де gls - псевдонім мого журналу git із усім гарним форматуванням. вишнева марка показує як вишневу, так і не вишневу, що бере участь у розвитку, але позначає їх інакше.
angularsen

1
додати
--не

51

Ви можете спробувати зробити підмножини журналу git:

git log --oneline devel ^next

4
На моє переконання, це найкраще рішення (у відповіді @ sehe також показано, що наступні зобов’язання не знаходяться в розвитку - в контексті ОП таких немає, але в моєму є - використання --left-onlyбуло б краще). Однак це можна трохи покращити, додавши, --no-mergesщоб опустити будь-які комісії злиття (наприклад, якщо функція або гілка виправлення була об'єднана (окремо) у розробку та наступну). Строго кажучи, звичайно, вирішення конфліктів у злиттях може створити інші відмінності, але це зазвичай не так. Цей --no-mergesваріант може бути корисно застосований і до інших відповідей.
Алекс Дюпюй

27

Як щодо

git log next..devel

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


4
Ви також можете опустити другу гілку, якщо ви зараз перебуваєте на цій гілці. тобтоgit log next..
jmaxyz

btw 'git log next..devel' відрізняється від 'git log devel..next'
Євген Кауров

1

Щоб отримати список комітетів, які не були інтегровані у відділення випуску (наступний), ви можете використовувати:

git rev-list --reverse --pretty="TO_TEST %h (<%ae>) %s" --cherry-pick --right-only origin/release_branch...origin/development_branch | grep "^TO_TEST " > NotIntegratedYet.txt

Перегляньте список git-rev для отримання додаткової інформації.


У цій команді відповіді відсутні фактичні гілки, про які йдеться, тобтоnext...devel
Алекс Дюпюй

@AlexDupuy Yah, це досить напівзвукова відповідь. Оскільки це також не найпростіша відповідь і не пояснює, чому такий підхід був би кращим, я це -1 .
Сліпп Д. Томпсон

-1

@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 підфункції. Я можу відкрити окремий піар для кожної з цих підфункцій, і моїй команді їх буде легше переглянути.

Список літератури:

  1. Створіть патч або diff файл із сховища git та застосуйте його до іншого іншого сховища git

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