Git rebase, squash

19 червня 2019 р.

Команда git rebase дозволяє отрмати зміни робочої гілки з головної.
Наприклад, ми працюємо від гілки develop

git checkout -b branche-1

Працюємо в branch-1, але виявилось, що нам потрібні зміни, які зробив колега і "залив" в develop. Нам треба оновити свій develop змінами і перенести ці зміни в branch-1.
Спершу зробимо коміт з тим, що вже є в branch-1

git add .
git commit -m "branch-1: Adds main login app"

Оновляємо develop

git pull origin develop

Оновляємо branch-1 змінами з develop

git rebase -i develop

Тепер гілка branch-1 оновлена. Стан і порядок комітів можна подивтись за допомогою git log

Тепер далі. В нас вже є один коміт в branch-1 і після нелегкого програмування, виправлення багів в нас з'явилось ще три коміти. Тобто в branch-1 є чотири коміти. Але ці коміти не є змістовно важливі (наприклад це були випралення непотрібних коментарів, які ви забули забрати тощо) і нам потрібно все об'єднати в один, щоб branch-1 мала один змістовний коміт. Для цього потрібно зробити squash комітів

git rebase -i develop

Відкриється файл в редакторі, який використовується по дефолту (в нас це nano).

pick f7f3f6d branch-1: Adds main login app
pick 310154e branch-1: Adds main login app v2
pick a5f4a0d branch-1: remove comment
pick ed44a3s branch-1: upd html
# Rebase 710f0f8..a5f4a0d onto 710f0f8
#
# Commands:
# p, pick <commit> = use commit
# r, reword <commit> = use commit, but edit the commit message
# e, edit <commit> = use commit, but stop for amending
# s, squash <commit> = use commit, but meld into previous commit
# f, fixup <commit> = like "squash", but discard this commit's log message
# x, exec <command></command> = run command (the rest of the line) using shell
# b, break = stop here (continue rebase later with 'git rebase --continue')
# d, drop <commit> = remove commit
# l, label <label> = label current HEAD with a name
# t, reset <label> = reset HEAD to a label
# m, merge [-C <commit> | -c <commit>] <label> [# <oneline>]
# .       create a merge commit using the original merge commit's
# .       message (or the oneline, if no original merge commit was
# .       specified). Use -c <commit> to reword the commit message.
#
# 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

Залишаємо pick в першому коміті, в у всіх решта pick замінюємо на squash:

pick f7f3f6d branch-1: Adds main login app
pick 310154e branch-1: Adds main login app v2
pick a5f4a0d branch-1: remove comment
pick ed44a3s branch-1: upd html
.....

Зберігаємо зміни Ctrl+X. Після збереження відкриється ще один файл з назвами комітів. Залишаємо першу назву branch-1: Adds main login app, а інші можна видалити або закоментувати. Зберігаємо зміни Ctrl+X.
Все, в branch-1 є весь написаний код і тільки один коміт. Перевірити можна командою git log.
Робимо push для Merge Request git push origin branch-1

Інші дописи

Django, Nginx, uWSGI

Деплой сайту на Django за допомогою Nginx, uWSGI, Supervisor

Git Cherry Pick

Вишенька на торті - git команда, яка забирає тільки зміни