Пояснення Git Squash

Що таке Git Squash?

Одне з речей, яке розробники досить часто чують щодо своїх запитів на витягування, це щось на кшталт: "Мені це виглядає добре, будь ласка, розімніть і об'єднайте". Найцікавішим є те, що такої команди, як git squash(якщо ви не створили для неї псевдонім), не існує.

Для того, щоб squashтягнути запит кошти зазвичай ущільнити всі коммітов в цьому запиті в один (рідко інший номер) , щоб зробити його більш коротким, читабельним і не забруднювати історію головного філії. Для цього розробнику потрібно використовувати інтерактивний режим команди Git Rebase.

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

Тож припустимо, у вас є такий журнал комітів у гілці, яку ви хочете об’єднати як частину запиту на витяг:

$ git log --pretty=oneline --abbrev-commit 30374054 Add Jupyter Notebook stub to Data Science Tools 8490f5fc Minor formatting and Punctuation changes 3233cb21 Prototype for Notebook page

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

Отже, що ми робимо, це розпочати інтерактивний сеанс перебазування з поточного HEAD ( коміт 30374054 ) до коміту 3233cb21 , маючи намір об’єднати 3 останні коміти в один:

$ git rebase -i HEAD~3

Це відкриє редактор приблизно такого вигляду:

pick 3233cb21 Prototype for Notebook page pick 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools # Rebase # # Commands: # p, pick = use commit # r, reword = use commit, but edit the commit message # e, edit = use commit, but stop for amending # s, squash = use commit, but meld into previous commit # f, fixup = like "squash", but discard this commit's log message # x, exec = run command (the rest of the line) using shell # # These lines can be re-ordered; they are executed from top to bottom. # # If you remove a line here THAT COMMIT WILL BE LOST. # # However, if you remove everything, the rebase will be aborted. # # Note that empty commits are commented out

Як завжди, Git дає нам дуже приємне довідкове повідомлення, де ви можете побачити squashваріант, який ми шукаємо.

В даний час інструкції з інтерактивного перебазування говорять до pickкожного вказаного коміту та зберігають відповідне повідомлення коміту. Тобто - нічого не змінюйте. Але ми хочемо мати лише один коміт в підсумку.

Таким чином , ви можете просто змінити текст в вас редактор , який замінює pickз squash(або просто s) поруч років кожен робить ми хочемо , щоб позбутися від і збереження / виходу з редактора. Це може виглядати так:

s 3233cb21 Prototype for Notebook page s 8490f5fc Minor formatting and Punctuation changes pick 30374054 Add Jupyter Notebook to Data Science Tools

Коли ви закриєте свій редактор після збереження цієї зміни, він буде відразу відкритий і запропонує вам вибрати та переформулювати ці повідомлення про коміти. Щось на зразок цього:

# This is a combination of 3 commits. # The first commit's message is: Prototype for Notebook page # This is the 2nd commit message: Minor formatting and Punctuation changes # This is the 3rd commit message: Add Jupyter Notebook to Data Science Tools # Please enter the commit message for your changes. Lines starting # with '#' will be ignored, and an empty message aborts the commit.

На цьому етапі ви можете видалити всі повідомлення, які ви не хочете включати до остаточної версії коміту. Ви також можете переформулювати їх або просто написати повідомлення коміту з нуля.

Тільки пам’ятайте, що нова версія включатиме всі рядки, які не починаються з #символу. Ще раз збережіть і вийдіть з редактора.

Тепер ваш термінал повинен показувати повідомлення про успіх, включаючи, Successfully rebased and updated а журнал git повинен показувати приємну та ущільнену історію лише з одним комітом. Усі посередницькі комітети зникли, і ми готові об’єднатись!

Попередження про невідповідність історії місцевих та віддалених комітів

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

Іноді це буде вже просунуто - як би ви все-таки створили запит на витягування? У цьому випадку вам доведеться змусити зміни на віддаленій гілці після того, як виконати сквошінг, оскільки ваша локальна історія та історія гілок у віддаленому сховищі відрізняються:

$ git push origin +my-branch-name

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