Що означає сквош, що вживається в git?


117

Що означає сквошінг в git. Як я можу зробити сквош в Github?

Я новачок у Git, і я попросив, щоб він був призначений новим помилкою в аналізаторі коала. Я виправив помилку, і тепер мене попросили зняти свої коміти. Як це зробити?


Привіт @Lakshman сміливо приймай відповідь, яка найбільше проголосувала. Це правильно відповідає на ваше запитання.
Мостафіз Рахман

Відповіді:


180

Ви можете розглядати Git як розширену базу даних знімків робочого каталогу.

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

Скасування комісії означає, з ідіоматичної точки зору, перемістити зміни, внесені до зазначеного комітету, у його батьківський звіт, щоб у кінцевому підсумку виникла одна команда замість двох (або більше).
Якщо ви повторите цей процес кілька разів, ви можете зменшити n зобов’язань до одного.

Візуально, якщо ви розпочали свою роботу з пункту " Почати" з позначкою комітів , ви цього хочете

Git здійснює сквашування

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

У Git сквашування досягається за допомогою Rebase , спеціальної форми під назвою Interactive Rebase .
Спрощуючи, коли ви перезавантажуєте набір комісій у гілку B , ви застосовуєте всі зміни, внесені цими комісіями, як вони були зроблені, починаючи з B замість їх початкового предка.

Візуальна підказка

введіть тут опис зображення

Зауважте ще раз різні відтінки синього.

Інтерактивна база даних дозволяє вам вибирати, як комісій слід переоцінювати. Якщо виконати цю команду:

 git rebase -i branch

Ви отримаєте файл із списком комісій, які будуть перезавантажені

 pick ae3...
 pick ef6...
 pick 1e0...
 pick 341...

Я не назвав комітети, але ці чотири призначені для того, щоб вони були командами від " Почати до голови"

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

 pick ae3...
 squash ef6...
 squash 1e0...
 squash 341...

Якщо ви закриєте редактор і конфліктів злиття не знайдено, ви закінчите цю історію:

введіть тут опис зображення

У вашому випадку ви не хочете перезавантажуватися в іншу гілку, а скоріше в попередню комісію.
Щоб перетворити історію, як показано в першому прикладі, потрібно запустити щось на кшталт

git rebase -i HEAD~4

змінити "команди", щоб зменшити всі комісії, крім першого, а потім закрити редактор.


Примітка про зміну історії

У Git комісії ніколи не редагуються. Їх можна обрізати, зробити недосяжними, клонувати, але не змінювати.
Під час перезавантаження, ви фактично створюєте нові коміти.
Старі вже не доступні жодними посиланнями, тому їх не показують в історії, але вони все ще є!

Це те, що ви насправді отримуєте для повторної роботи:

введіть тут опис зображення

Якщо ви їх вже кудись підштовхнули, переписування історії фактично зробить гілку!


Приємно - що трапляється з оригінальними коментарями на виконання зобов’язань - вони об'єднуються в один великий коментар, або вони втрачаються?
Пол Р

Від man git rebase: Запропоноване повідомлення про фіксацію для складеного комітету - це з'єднання повідомлень про фіксацію першого комітету та тих, хто має команду "сквош",
Маргарет Блум

1
Це найкраще пояснення, яке я бачив, щоб відмовитись, дякую.
Керрі Джонс

Про сквашуванні на першому зображенні: чи можете ви зробити приклад, коли HEAD має інший робочий каталог перед (світло-блакитним) та після (темно-синім) сквашуванням? У всіх прикладах я спробував сквошинг виглядав так, що він просто видалив три коміти між START і HEAD.
фактична_панда

@actual_panda Я не впевнений, що дотримуюся. HEAD - це відмова від зобов'язань. Здійснює дельти магазину. Робочий dir є властивістю сховища в цілому, це залежить від того, яку комісію ви перевірили. Загалом, два відгуки (як HEAD і START) завжди дають два різних робочих робочих місця при реєстрації. Якщо ви перезавантажуєте сквош на одній гілці, ефект полягає в тому, щоб "втратити" проміжні комісії, але насправді git створив нову з усіма дельтами. git diffможе допомогти вам показати, що сталося
Маргарет Блум

22

Команда rebase має в своєму розпорядженні деякими приголомшливими параметрами --interactive (або -i) режимі, і однією з найбільш широко використовуваних є можливість сквош коммітів. Для цього потрібно взяти менші комісії та об'єднати їх у більші, що може бути корисно, якщо ви закінчуєте роботу дня або якщо просто хочете іншим чином упакувати свої зміни. Ми розберемося, як ви можете це легко зробити.

Слово обережності: Робіть це лише на комісіях, на які не було висунуто зовнішнє сховище. Якщо інші базуються на комітетах, які ви збираєтесь видалити, може виникнути велика кількість конфліктів. Просто не переписуйте свою історію, якщо вона ділиться з іншими.

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

введіть тут опис зображення

Останні 4 коміти були б набагато щасливішими, якби вони були завершені разом, тому давайте зробимо саме це за допомогою інтерактивного перезапису:

$ git rebase -i HEAD~4

pick 01d1124 Adding license
pick 6340aaa Moving license into its own file
pick ebfd367 Jekyll has become self-aware.
pick 30e0ccb Changed the tagline in the binary, too.

# Rebase 60709da..30e0ccb onto 60709da
#
# Commands:
#  p, pick = use commit
#  e, edit = use commit, but stop for amending
#  s, squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#

Отже, тут трапилось декілька речей. Перш за все, я сказав Git, що я хочу перезавантажити, використовуючи останні чотири коміти, звідки HEAD з HEAD ~ 4. Тепер Git помістив мене в редактор із наведеним вище текстом, і трохи пояснень, що можна зробити. На цьому екрані у вас є безліч варіантів, але зараз ми просто збираємо все в одну команду. Таким чином, змінивши перші чотири рядки файлу на це, ви зробите фокус:

pick 01d1124 Adding license
squash 6340aaa Moving license into its own file
squash ebfd367 Jekyll has become self-aware.
squash 30e0ccb Changed the tagline in the binary, too.

В основному це говорить Git об'єднати всі чотири комісії в першу фіксацію в списку. Після того, як це зроблено та збережено, інший редактор вискакує із наступним:

# This is a combination of 4 commits.
# The first commit's message is:
Adding license

# This is the 2nd commit message:

Moving license into its own file

# This is the 3rd commit message:

Jekyll has become self-aware.

# This is the 4th commit message:

Changed the tagline in the binary, too.

    # Please enter the commit message for your changes. Lines starting
    # with '#' will be ignored, and an empty message aborts the commit.
    # Explicit paths specified without -i nor -o; assuming --only paths...
    # Not currently on any branch.
    # Changes to be committed:
    #   (use "git reset HEAD <file>..." to unstage)
    #
    #   new file:   LICENSE
    #   modified:   README.textile
    #   modified:   Rakefile
    #   modified:   bin/jekyll
    #

Оскільки ми поєднуємо стільки комітетів, Git дозволяє змінювати повідомлення нового комітету на основі решти комітетів, що беруть участь у процесі. Відредагуйте повідомлення так, як вважаєте за потрібне, а потім збережіть і вийдіть з нього. Щойно це зроблено, ваші зобов’язання були успішно знищені!

Created commit 0fc4eea: Creating license file, and making jekyll self-aware.
 4 files changed, 27 insertions(+), 30 deletions(-)
  create mode 100644 LICENSE
    Successfully rebased and updated refs/heads/master.

А якщо ми знову подивимось на історію ... введіть тут опис зображення

Отже, це було поки що відносно безболісно. Якщо ви зіткнулися з конфліктами під час перезавантаження, їх зазвичай вирішити досить просто, і Git веде вас якнайбільше. Основи цього - виправити конфлікт, про який йдеться, git addфайл, а потім git rebase --continueвідновить процес. Звичайно, роблячиgit rebase --abort заповіту поверне вас до попереднього стану, якщо ви хочете. Якщо з якоїсь причини ви втратили команду в ребасті, ви можете скористатися рефлогом, щоб повернути її.

Детальніше можна ознайомитись за цим посиланням .


3
Дякую! Якщо ви хочете, щоб хтось настільки ж незручний з VIM, як і я ..., коли ви доходите до пункту, коли ви вводите дії для редагування, натисніть "я", щоб увійти в режим редагування. Коли ви закінчите зі змінами, натисніть клавішу escape і введіть ": wq", і вона перемістить вас вперед. (Mac)
Farasi78

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

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.