Основная причина того, что я вижу, заключается в следующем:
- Пользовательский интерфейс GitHub для слияния запросов на выборку в настоящее время (октябрь 2015 г.) не позволяет редактировать первую строку сообщения фиксации, заставляя его
Merge pull request #123 from joebloggs/fix-snafoo
- Пользовательский интерфейс GitHub для просмотра истории коммитов в настоящее время не позволяет вам просматривать историю ветки с
--first-parent
точки зрения
- Пользовательский интерфейс GitHub для просмотра вины в файле в настоящее время не позволяет вам просматривать вину файла с
--first-parent
точки зрения (обратите внимание, что это было исправлено только в Git 2.6.2, поэтому мы могли бы простить GitHub за отсутствие этого доступный)
Поэтому, когда вы объединяете все три вышеперечисленные ситуации, вы получаете ситуацию, когда несокращенные коммиты сливаются с помощью пользовательского интерфейса GitHub.
Ваша история с раздавленными коммитами будет выглядеть примерно так
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... Hotfix for android display issue
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... Implemented pop-up to select language
Тогда как без раздавленных коммитов история будет выглядеть примерно так
1256556316... Merge pull request #423 from jrandom/add-slideshows
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... Merge pull request #324 from ahacker/fix-android-display
787g8fgf78... hotfix for #5849564648
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Когда в отслеживании PR происходит много коммитов, когда произошли изменения, это может стать кошмаром, если вы ограничитесь использованием пользовательского интерфейса GitHub .
Например, вы обнаруживаете, что нулевой указатель разыменовывается где-то в файле ... поэтому вы говорите: «Кто это сделал и когда? На какие версии выпуска влияют?». Затем вы переходите к представлению «вина» в пользовательском интерфейсе GitHub и видите, что линия была изменена в789fdfffdf
... «о, подождите секунду, в этой строке был изменен отступ, чтобы он соответствовал остальной части кода», так что теперь вам нужно перейти к состоянию дерева для этого файла в родительском коммите и повторно посетить страница с обвинениями ... в конце концов вы находите коммит ... это коммит 6 месяцев назад ... "о **** фактически был в запросе на извлечение и был объединен только вчера, и никто еще не сократил выпуск ... "Черт возьми, люди за объединение коммитов без истории" - это крик, который обычно можно услышать после примерно 2 или 3 экспедиций по археологии кода через GitHub UI
Теперь давайте рассмотрим, как это работает, если вы используете командную строку Git (и супер-удивительный 2.6.2, в котором есть исправление git blame --first-parent
)
- Если бы вы использовали командную строку Git, вы могли бы полностью контролировать сообщение коммита слияния, и, следовательно, коммит слияния мог бы иметь хорошую итоговую строку.
Таким образом, наша история коммитов будет выглядеть
$ git log
1256556316... #423 Added new slideshow feature
7hgf8978g9... Added new slideshow feature, JIRA # 848394839
85493g2458... Fixed slideshow display issue in ie
gh354354gh... wip, done for the week
789fdfffdf... minor alignment issue
56556316ad... #324 Hotfix for android display issue
787g8fgf78... hotfix for #5849564648
f56556316e... #28 Implemented pop-up to select language
9080gf6567... implemented feature # 65896859
gh34839843... minor fix (typo) for 3rd test
Но мы также можем сделать
$ git log --first-parent
1256556316... #423 Added new slideshow feature
56556316ad... #324 Hotfix for android display issue
f56556316e... #28 Implemented pop-up to select language
(Другими словами: Git CLI позволяет вам есть свой торт и есть его)
Теперь, когда мы сталкиваемся с проблемой нулевого указателя ... ну, мы просто используем, git blame --first-parent -w dodgy-file.c
и нам сразу дается точный коммит, где в основной ветке была введена обратная ссылка нулевого указателя, игнорируя простые изменения пробелов.
Конечно, если вы выполняете слияния с использованием пользовательского интерфейса GitHub, то git log --first-parent
это действительно дерьмо благодаря GitHub, форсирующему первую строку сообщения коммита слияния:
1256556316... Merge pull request #423 from jrandom/add-slideshows
56556316ad... Merge pull request #324 from ahacker/fix-android-display
f56556316e... Merge pull request #28 from somwhere/select-lang-popup
Короче говоря, короткая история:
Пользовательский интерфейс GitHub (октябрь 2015 г.) имеет ряд недостатков, связанных с тем, как он объединяет запросы на извлечение, как он отображает историю коммитов и как он приписывает информацию об обвинениях. В настоящее время лучший способ обойти эти недостатки в пользовательском интерфейсе GitHub - это попросить людей сдавить свои коммиты перед слиянием.
Git CLI не имеет этих проблем, и вы можете легко выбрать, какое представление вы хотите видеть, так что вы можете узнать причину, по которой было сделано конкретное изменение (просмотрев историю невыполненных коммитов), а также увидеть эффективно подавленные коммиты.
Post Script
Последняя причина, которая часто упоминается для коммитов на сжатие, состоит в том, чтобы упростить бэкпортинг ... если у вас есть только один коммит на бэк-порт (т.е. сдавленный коммит), тогда легко выбрать вишню ...
Ну, если вы смотрите историю git, git log --first-parent
тогда вы можете просто выбрать коммиты слияния. Большинство людей запутываются в коммитах с вишневым выбором, потому что вы должны указать -m N
опцию, но если вы получили коммит, git log --first-parent
то вы знаете, что это первый родитель, которому вы хотите следовать, поэтому он будетgit cherry-pick -m 1 ...