Как да смачкате ангажименти в Git, за да поддържате историята си чиста
Когато работите с Git, е добра идея да се ангажирате често, така че винаги можете да се върнете в състоянието на кода, ако объркате. Записването на всички тези мини промени в основния клон не винаги е добра идея. Това прави историята разхвърляна и трудна за проследяване.
Git предоставя начин да смачкате куп ваши фикси, като използвате командата rebase. След като направите локално промените си в определен файл или за определена функция, винаги можете да използвате метода на сквош, за да комбинирате промените заедно, преди да се ангажирате с основния клон. Това ще помогне на другите да разберат по-добре промените ви.
Предупреждение: Въпреки че можете да изтегляте от външни хранилища и да извършвате скуош ангажименти, това е лоша идея. Това може да създаде конфликти и объркване. Избягвайте промяна на историята, която вече е публична. Придържайте се само към смачкване на ангажименти, които са местни за вашата работа.
Нека да разгледаме примерен случай.
Да предположим, че имаме два файла a.py и b.py. Нека първо преминем през процеса на създаване на файловете и извършване на модификациите:
$ mkdir myproject$ cd myproject /
$ git init
$ echo "print (" hello A ")"> a.py
$ git add -A && git commit -m "Добавен a.пи "
$ echo "print (" hello B ")"> b.py
$ git add -A && git commit -m "Добавено b.пи "
$ echo "print (" hello BB ")"> b.py
$ git add -A && git commit -m "b.py Модификация 1 "
$ echo "print (" hello BBB ")"> b.py
$ git add -A && git commit -m "b.py Модификация 2 "
Ако проверим историята на ангажиментите, ще видим следното:
$ git log --oneline --graph --decorate* dfc0295 (HEAD -> master) b.py Модификация 2
* ce9e582 b.py Модификация 1
* 7a62538 Добавен b.py
* 952244a Добавен a.py
След като приключим с работата си, решаваме да поставим всички промени в b.py в един ангажимент за яснота. Ние броим, че има 3 ангажименти на b.py от ГЛАВАТА. Издаваме следната команда:
git rebase -i HEAD ~ 3Опцията -i казва на Git да използва интерактивния режим.
Трябва да изскочи прозорец на вашия текстов редактор в Git:
pick 7a62538 Добавен b.pyизберете ce9e582 b.py Модификация 1
изберете dfc0295 b.py Модификация 2
# Пребазирайте 952244a… dfc0295 на 952244a (3 команда (и))
#
# Команди:
# p, pick = използвайте commit
# r, reword = използва ангажиране, но редактирайте съобщението за фиксиране
# д, редактиране = използване на ангажиране, но спиране за поправка
# s, squash = използвайте фиксация, но се влива в предишен фиксация
# f, fixup = като "тиква", но отхвърлете съобщението в дневника на този комит
# x, exec = команда за изпълнение (останалата част от реда) с помощта на shell
#
# Тези редове могат да бъдат пренаредени; те се изпълняват отгоре надолу.
#
# Ако премахнете ред тук, ЧЕ КОМИТЕТЪТ ЩЕ БЪДЕ ЗАГУБЕН.
#
# Ако обаче премахнете всичко, пребазирането ще бъде отменено.
#
# Обърнете внимание, че празните фиксирания се коментират
~
Комитите са изброени хронологично отгоре от най-ранните до най-новите. Можете да изберете кой ангажимент да „изберете“ и кой ангажимент да смачкате. За простота ще изберем първия ангажимент и ще смачкаме останалите в него. Така че ние ще модифицираме текста така:
pick 7a62538 Добавен b.pyскуош ce9e582 b.py Модификация 1
скуош dfc0295 b.py Модификация 2
# Пребазирайте 952244a… dfc0295 на 952244a (3 команда (и))
#
# Команди:
# p, pick = използвайте commit
# r, reword = използва ангажиране, но редактирайте съобщението за фиксиране
# e, редактиране = използване на ангажимент, но спиране за поправка
# s, squash = използвайте фиксация, но се влива в предишен фиксация
# f, fixup = като "тиква", но отхвърлете съобщението в дневника на този комит
# x, exec = команда за изпълнение (останалата част от реда) с помощта на shell
#
# Тези редове могат да бъдат пренаредени; те се изпълняват отгоре надолу.
#
# Ако премахнете ред тук, ЧЕ КОМИТЪТ ЩЕ БЪДЕ ЗАГУБЕН.
#
# Ако обаче премахнете всичко, пребазирането ще бъде отменено.
#
# Обърнете внимание, че празните ангажименти се коментират
Веднага след като запазите и затворите текстовия файл, трябва да се появи друг текстов прозорец, който изглежда така:
# Това е комбинация от 3 ангажирания.# Съобщението на първия ангажимент е:
Добавено b.py
# Това е второто съобщение за фиксиране:
б.py Модификация 1
# Това е третото съобщение за фиксиране:
б.py Модификация 2
# Моля, въведете съобщението за ангажиране за вашите промени. Стартиране на линии
# с '#' ще бъде игнорирано и празното съобщение прекъсва фиксирането.
#
# Дата: петък 30 март 21:09:43 2018 -0700
#
# преработване в ход; върху 952244a
# В момента редактирате фиксиране, докато пребазирате клон 'master' на '952244a'.
#
# Промени, които трябва да бъдат извършени:
# Нов файл: b.py
#
Запазете и затворете и този файл. Трябва да видите нещо подобно:
$ git rebase -i HEAD ~ 3[отделена ГЛАВА 0798991] Добавена b.py
Дата: петък 30 март 21:09:43 2018 -0700
1 файл е променен, 1 вмъкване (+)
режим на създаване 100644 b.py
Успешно пребазирани и актуализирани refs / heads / master.
Ако проверите историята на фиксиране сега:
$ git log --oneline --graph --decorate* 0798991 (HEAD -> master) Добавено b.py
* 952244a Добавен a.py
Всички ангажименти за b.py са смачкани в един коммит. Можете да проверите, като погледнете b.py файл:
$ котка b.pyпечат ("здравей BBB")
Съдържа съдържанието на Модификация 2.
Заключение
Пребазирането е мощна команда. Тя може да ви помогне да поддържате историята си чиста. Но избягвайте да го използвате за вече публични ангажименти, тъй като може да предизвика конфликти и объркване. Използвайте го само за вашето локално хранилище.
Допълнително проучване:
- https: // git-scm.com / docs / git-rebase
- https: // git-scm.com / book / en / v2 / Git-Branching-Rebasing
- https: // git-scm.com / book / en / v2 / Git-Tools-Rewriting-History