napredne GIT komande

Napredne Git komande za efikasniji rad

S obzirom da je Git već postao standard za kontrolu verzije u razvoju softvera, dobro je da svaki developer dobro razume ovaj alat.

I pored toga neki developeri nauče samo nekoliko jednostavnih komandi, bez udubljivanja u sve mogućnosti koje ovaj alat nudi. A Git bez sumnje nudi mnog toga korisnog što vam može pomoći da budete mnogo efikasniji u svom svakodnevnom poslu. U jednom od prethodnih tekstova na našem blogu predstavili smo neke osnovne Git komande za početnike, pa preporučujemo da sa upoznavanjem sa osnovama Git-a prvo pročitate taj tekst.

U ovom tekstu ćemo predstaviti neke od naprednih Git funkcija i kako da ih najbolje iskoristite. U pitanju su funkcije:

  • git stash – omogućava da privremeno sačuvate vaš kod lokalno
  • git reset – omogućava da očistite svoj kod pre nego uradite commit
  • git bisect – omogućava da pronađete loše commit-e
  • git sqash – omogućava da kombinujete svoje commit-e
  • git rebase – omogućava da primenite izmene iz jedne grane u drugu

Git Stash

Kako smo rekli, Git Stash čuva vaš kod bez potrebe da radite commit. Evo jednog primera kod kojeg ovo može biti korisna opcija:

Recimo da ste već uradili nekoliko uređenih commit-a, ali pored toga imate još neki neuređeni kod koji niste commit-ovali. Naravno, ne želite da commit-ujete neuređen kod, pre nego što ga uredite. U tom trenutku iz nekog razloga morate da pređete na drugi task i promenite grane. Ovo često može da se dogodi ukoliko ste na svojoj main grani, a pritom ste zaboravili da kreirate novu granu. Recimo da trenutno vaš kod izgleda ovako:

$ git status
On branch my-feature
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: css/common.scss

no changes added to commit (use "git add" and/or "git commit -a")

$ git diff
diff --git a/css/common.scss b/css/common.scss
index 2090cc4..90fd457 100644
--- a/css/common.scss
+++ b/css/common.scss
@@ -13,6 +13,6 @@
body {
font-family: "Proxima Nova", Arial, sans-serif;
font-size: 13px;
- color: #333;
+ color: red;
background-color: #f00;
}

Kada pokrenete git stash, ne commit-ovan kod će nestati bez da je commit-ovan. Stashing je nešto kao čuvanje privremenog lokal commit-a na vašoj grani. Nije moguće da gurnete stash na udaljeni repozitorijum, tako da je stash samo za vašu ličnu upotrebu.

$ git stash
Saved working directory and index state WIP on my-feature: 49ee696 Change text color

Vaša grana se sada pojavljuje onakva kakva je bila kada ste uradili svoj poslednji commit. Sada možete bezbedno promeniti grane bez da izgubite svoj kod ili da imate neuređen kod. Kada ponovo prebacite na svoju granu i pokrenete git stash list, videćete listu stash-eva koji izgledaju nekako slično ovome:

$ git stash list
stash@{0}: WIP on my-feature: 49ee696 Change text color

Možete lako ponovo primeniti stash-ovan sadržaj, pokretanjem git stash apply. Takođe možete primeniti određeni stash (ako ste uradili stash više puta) pokretanjem git stash apply stash@{1} ( “1” označava sekundu pre poslednjeg stash-a). Evo primera u kojem je stash primenjen u više commit-a i primenom različitih stash-ova.

$ git diff
diff --git a/css/common.scss b/css/common.scss
index 2090cc4..90fd457 100644
--- a/css/common.scss
+++ b/css/common.scss
@@ -13,6 +13,6 @@
 body {
     font-family: "Proxima Nova", Arial, sans-serif;
     font-size: 13px;
-    color: #333;
+    color: red;
     background-color: #f00;
 }
$ git stash
Saved working directory and index state WIP on my-feature: 49ee696 Change text color
$ git diff
diff --git a/css/common.scss b/css/common.scss
index 2090cc4..b63c664 100644
--- a/css/common.scss
+++ b/css/common.scss
@@ -13,6 +13,6 @@
 body {
     font-family: "Proxima Nova", Arial, sans-serif;
     font-size: 13px;
-    color: #333;
+    color: red;
     background-color: #f00;
 }
$ git stash
Saved working directory and index state WIP on my-feature: 49ee696 Change text color
$ git stash list
stash@{0}: WIP on my-feature: 49ee696 Change text color
stash@{1}: WIP on my-feature: 49ee696 Change text color
stash@{2}: WIP on my-feature: 49ee696 Change text color

$ git stash apply stash@{2}
On branch my-feature
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

	modified:   css/common.scss

no changes added to commit (use "git add" and/or "git commit -a") 

git stash apply stash@{2} je primenio nastarije stash-ovan kod, kada smo boju teksta promenili u crvenu.

$ git diff 
diff --git a/css/common.scss b/css/common.scss
index 2090cc4..90fd457 100644
--- a/css/common.scss
+++ b/css/common.scss
@@ -13,6 +13,6 @@
 body {
     font-family: "Proxima Nova", Arial, sans-serif;
     font-size: 13px;
-    color: #333;
+    color: red;
     background-color: #f00;
 }

Ako odlučite da ne commit-ujete svoj rad nakon što obnovite stash, možete da pokrenete git checkout koji resetuje sav ne commit-ovan kod.

Evo još jednog primera kako možete da koristite Git stash: recimo da imate neke nove fajlove od kojih neki ima bug. Ostavite sve fajlove u statusu unstaged osim fajla sa bug-om (kod mora biti stage-ovan da bi bio stash-ovan), a zatim možete stash-ovati taj fajl i rešiti problem sa njim. Ako se ispostavi da stash-ovan fajl nije problem, onda možete uraditi restore.

$ git status
On branch my-feature
Untracked files:
(use "git add <file>..." to include in what will be committed)

css/colors.scss

nothing added to commit but untracked files present (use "git add" to track)

$ git add css/colors.scss
$ git stash
Saved working directory and index state WIP on my-feature: 0d8deef delete colors
$ git status
On branch my-feature
nothing to commit, working tree clean
$ git stash apply stash@{0}
On branch my-feature
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

new file: css/colors.scss

Takođe, možete da prenesete svoje stash-ovane commit-e na novu granu ili debagujete granu pomoću git stash branch:

$ git status
On branch my-feature
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: css/common.scss

no changes added to commit (use "git add" and/or "git commit -a")
$ git stash
Saved working directory and index state WIP on my-feature: 66f3f3b Add colors file
$ git stash branch debugging-branch
M css/common.scss
Switched to a new branch 'debugging-branch'
Unstaged changes after reset:
M css/common.scss
On branch debugging-branch
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: css/common.scss

Dropped refs/stash@{0} (d140624f60d8deef7bceb0d11fc80ed4fd47e0a1)

Imajte u vidu da kada primenite stash, on nije obrisan. Možete ih uklanjati individualno korišćenjem git drop ili ukloniti sve stash-eve pomoću git stash clear:

$ git stash list
stash@{0}: WIP on my-feature: 66f3f3b Add colors file
stash@{1}: WIP on my-feature: 0d8deef delete colors
stash@{2}: WIP on my-feature: 49ee696 Change text color
$ git stash drop stash@{2}
Dropped stash@{2} (8ed6d2ce101aa2e28c8ccdc94cb12df8e5c468d6)
$ git stash list
stash@{0}: WIP on my-feature: 66f3f3b Add colors file
stash@{1}: WIP on my-feature: 0d8deef delete colors
$ git stash clear
$ git stash list
$

Git Reset

Ako se nađete u situaciji da ste slučajno commit-ovali neki neuređen kod, možete da uradite “soft” reset. Ovo znači da se kod pojavljuje kao da nije još commit-ovan. Onda možete očistiti svoj kod u nekom tekst editoru, pre nego uradite novi commit sa uređenom verzijom. Da biste to uradili možete da pokrenete git reset --soft HEAD~1. Ovo će resetovati poslednji commit. Možete resetovati i dalje, promenom broja nakon znaka ~ (na primer git reset --soft HEAD~2).

$ git reset --soft HEAD~1
$ git status
On branch debugging-branch
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

modified: css/common.scss

Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

modified: css/common.scss

$ git diff
diff --git a/css/common.scss b/css/common.scss
index 2090cc4..90fd457 100644
--- a/css/common.scss
+++ b/css/common.scss
@@ -13,6 +13,6 @@
body {
font-family: "Proxima Nova", Arial, sans-serif;
font-size: 13px;
- color: $grey;
+ color: red;
background-color: #f00;
}

Git reset može da bude malo zbunjujuć, naročito ukoliko ste početnik u Git-u. Soft reset treba da bude rezervisan za originalnu grešku, gde stash može biti korišćen za zamenu koda.

Takođe možete raditi i hard reset (git reset --hard HEAD~1). Ovaj tip reseta u suštini briše vaš poslednji commit. Treba da budete veoma pažljivi kada izvodite hard reset, posebno kada radite push na svoju granu, s obzirom da ne postoji način da uradite restore svog commit-a.

Git Bisect

Git bisect izvodi binarnu pretragu između dva data commit-a i zatim ih prikazuje sa određenim detaljima commit-a. Prvo je potrebno da uradite tzv dobar commit, kada ste sigurni da vaša funkcionalnost radi, a zatim i tzv loš commit.

Da biste započeli proverite granu sa kodom koji sadrži bug i pronađite dobre commit-e. Biće potrebno da idete kroz vašu istoriju commit-a i ponađite commit hash, a zatim proverite taj određeni commit i testirate vašu granu. Kada pronađete dobru i lošu tačku iz koje možete da radite, možete da pokrenete git bisect.

U ovom primeru, tekst na testnom sajtu je crvene boje, ali mi ne znamo kako i kada je on kreiran. Ovo je veoma jednostavan primer, pa je realno očekivati da kod stvarnih problema nemate tako očiglednu situaciju kao ovde. Ipak, naš primer sa tekstom može da posluži da bolje razumete primenu git bisect-a.

Kada pokrenemo git log možemo da vidimo listu commit-a između kojih možemo da biramo:

$ git log
commit a3cfe7f935c8ad2a2c371147b4e6dcd1a3479a22 (HEAD -> main)
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:52:57 2023 +0100

Update .gitignore file for .DS_Store

commit 246e90977790967f54e878a8553332f48fae6edc
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:51:23 2023 +0100

Change styling of page

commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:50:48 2023 +0100

Change text color

commit 032a41136b6653fb9f7d81aef573aed0dac3dfe9
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:42:57 2023 +0100

Change text color

commit 246e90977790967f54e878a8553332f48fae6edc
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:41:23 2023 +0100

delete colors

commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:50:48 2023 +0100

Change text color

commit ce861e4c6989a118aade031020fd936bd28d535b
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:07:36 2023 +0100

…

Ukoliko otvorimo našu web stranicu na poslednjem commit hash-u, tekst je crvene boje, tako da znamo da imamo problem.

Sada pokrećemo bisect i kažemo Git-u da imamo loš commit:

$ git bisect start
$ git bisect bad 8d4615b9a963ef235c2a7eef9103d3b3544f4ee1

Sada se vraćamo unazad i pokušavamo da pronađemo commit gde tekst nije bio crven.

$ git checkout ce861e4c6989a118aade031020fd936bd28d535b
Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

HEAD is now at ce861e4 Add CSS styles

I zatim radimo refresh stranice.

Tekst više nije crven, što znači da smo pronašli tzv dobar commit.

$ git checkout d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e
Previous HEAD position was ce861e4c6989a118aade031020fd936bd28d535b Add CSS styles
HEAD is now at d647ac4 Change text color

Git vam nikada neće reći koliko commit-a treba da pretraži da bi pronašao onaj pravi. Broj commit-a koje će pretražiti zavisi od toga koliko je commit-a između dobrog i lošeg commit-a (što je duži period u pitanju, to će Git morati da prođe više iteracija).

Sada treba ponovo da testirate svoju granu i proverite da li je problem nestao. To ponekada može biti dosadno ukoliko regularno ažurirate module, jer je možda potrebno da reinstalirate module nodova na vašem frontu i u repozitorijumu. Ukoliko je postojalo i ažuriranje baze, možda ćete morati da ažurirate i to.

git bisect automatski proverava commit u sredini između vašeg dobrog i lošeg commit-a. Ovde procenjuje jedan korak do pronalaska lošeg commit-a:

$ git bisect good 1cdbd113cad2f452290731e202d6a22a175af7f5
Bisecting: 1 revision left to test after this (roughly 1 step)
[ce861e4c6989a118aade031020fd936bd28d535b] Add CSS styles
$ git status
HEAD detached at ce861e4
You are currently bisecting, started from branch '8d4615b'.
(use "git bisect reset" to get back to the original branch)

Uradite refresh stranice i proverite da li je vaš problem nestao. Ukoliko je još uvek tu, treba da kažemo Git-u da je još uvek na lošem commit-u. Ovog puta ne morate da referencirate commit hash, jer će Git koristiti commit koji ste proverili. Ovaj proces treba da ponovite sve dok Git ne prođe kroz sve moguće korake:

$ git bisect bad
Bisecting: 0 revisions left to test after this (roughly 0 steps)
[cbf1b9a1be984a9f61b79ae5f23b19f66d533537] Add second paragraph to page

Uradite refresh stranice i videćete da je vaš problem nestao.

U ovoj fazi Git je pronašao prvi loš commit:

$ git bisect good
ce861e4c6989a118aade031020fd936bd28d535b is the first bad commit
commit ce861e4c6989a118aade031020fd936bd28d535b
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:52:57 2023 +0100

Add CSS styles

:000000 100644 0000000000000000000000000000000000000000 092bfb9bdf74dd8cfd22e812151281ee9aa6f01a M css

Sada možete da iskoristite git show da prikažete taj commit i identifikujete problem:

$ git show ce861e4c6989a118aade031020fd936bd28d535b
commit ce861e4c6989a118aade031020fd936bd28d535b
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:52:57 2023 +0100

Add CSS styles

diff --git a/css/base.scss b/css/base.scss
index e69de29..26abf0f 100644
--- a/css/base.scss
+++ b/css/base.scss
@@ -1,7 +1,7 @@
body {
background-color: $white;
margin: 0px;
line-height: 20px;
- color: $grey;
+ color: red;
}

Kada ste završili možete da pokrenete git bisect reset da biste resetovali vašu granu na njeno normalno radno stanje.

Što su commit-i bliži jedni drugima, to će Git lakše biti u stanju da pronađe problem.

Git squash

Uz prethodno navedene primere, važno je da znate i kako da uradite sabijanje, odnosno kombinovanje vaših commit-a. U svakom slučaju to je dobra praksa koja samo može da vam pomogne u vašem svakodnevnom radu. To može biti posebno korisno drugim developerima koji će morati da rade review i edit-ovanje funkcionalnosti koje ste vi radili.

U primeru ispod napravili smo pet commit-a, ali se svi odnose na jednu funkcionalnost, koja se odnosi na stilizovanje stranice.

$ git log
commit a8fbb81d984a11adc3f72ce27dd0c39ad24403b7 (HEAD -> main)
Author: Test Test <email@example.com>
Date: Sun Apr 30 11:16:10 2023 +0100

Import colors

commit e2b3ddd5e8b2cb1e61f88350d8571df51d43bee6
Author: Test Test <email@example.com>
Date: Sun Apr 30 11:15:32 2023 +0100

Add new color

commit d647ac489ad43b3c6eaea5aceb02b0a7d7e5cf8e
Author: Test Test <email@example.com>
Date: Sun Apr 30 10:50:48 2023 +0100

Change text color

commit c005d9ceeefd4a8d4e553e825fa40aaafdac446e
Author: Test Test <email@example.com>
Date: Sun Apr 30 09:59:57 2023 +0100

Add CSS styles

commit 9e046b7df59cef07820cc90f694fabc666731bd2
Author: Test Test <email@example.com>
Date: Sun Apr 30 09:56:28 2023 +0100

Add second paragraph to page

commit 5aff973577d67393d914834e8af4c5d07248d628
Author: Test Test <email@example.com>
Date: Sun Apr 30 16:04:22 2023 +0100

Add colors CSS file and edit background color

Možete takođe da koristite git merge --squash, ali je svakako čistije da koristite rebase, zato što kada odaberete vaše commit-e, lakše je da vidite opis commit-a. Ukoliko pokrenete git merge --squash prvo je potrebno da uradite hard reset vaših commit-a (git reset --hard HEAD~1) i lako je zbuniti se time koliko zapravo commit-a vam je potrebno da biste to uradili. Zbog toga je lakše koristiti git rebase.

Krenite tako što ćete pokrenuti git rebase -i --root i otvoriće se vaš podrazumevani IDE na komandnoj liniji sa listom commit-a:

pick eb1eb3c Update homepage
pick 5aff973 Add colors CSS file and edit background color
pick 9e046b7 Add second paragraph to page
pick c005d9c Add CSS styles
pick d647ac4 Change text color
pick e2b3ddd Add new color
pick a8fbb81 Import colors

# Rebase a8fbb81 onto b862ff2 (7 commands)
#
# 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
# d, drop = remove commit
#
# 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

Možda ćete želeti da sabijete vaših nekoliko zadnjih commit-a, pa u tom slučaju treba da pokrenete git rebase -i HEAD~3. Prikazaće vam se poslednja tri commit-a:

pick eb1eb3c Update homepage
pick 5aff973 Add colors CSS file and edit background color
pick 9e046b7 Add second paragraph to page

# Rebase b862ff2..9e046b7 onto b862ff2 (3 commands)
#
# 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
# d, drop = remove commit
#
# 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

Sada možete da sabijete sve commit-e u prvi commit, kao na primeru ispod:

pick eb1eb3c Update homepage
squash 5aff973 Add colors CSS file and edit background color
squash 9e046b7 Add second paragraph to page

# Rebase b862ff2..9e046b7 onto b862ff2 (3 commands)
#
# 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
# d, drop = remove commit
#
# 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

Kada sačuvate fajl, Git će vam otvoriti vašu commit poruku da je editujete:

# This is a combination of 3 commits.
# This is the 1st commit message:

Update homepage

# This is the commit message #2:

Add colors CSS file and edit background color

# This is the commit message #3:

Add second paragraph to page

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#
# Date: Sun Apr 30 18:31:28 2023 +0100
#
# interactive rebase in progress; onto b862ff2
# Last commands done (3 commands done):
# squash 5aff973 Add colors CSS file and edit background color
# squash 9e046b7 Add second paragraph to page
# No commands remaining.
# You are currently rebasing branch 'main' on 'b862ff2'.
#
# Changes to be committed:
# new file: .gitignore
# new file: css/base.css
# new file: css/base.scss
# new file: css/colors.css
# new file: css/colors.css.map
# new file: css/colors.scss
# new file: css/common.css
# new file: css/common.scss
# new file: index.html
#

Dok radite rebase, takođe možete i editovati opis commit-a, kako bi bio lakši za čitanje:

Implement new design for homepage. Add .gitignore file for Sass folder.

# Please enter the commit message for your changes. Lines starting
# with '#' will be ignored, and an empty message aborts the commit.
#

Ponovo sačuvajte fajl i time ste završili. Kada ponovo pogledate u Git log, videćete da postoji samo jedan čist commit:

[detached HEAD 574ec7e] Implement new design for homepage. Add .gitignore file for Sass folder.
Date: Wed Jan 13 18:31:28 2021 +0100
10 files changed, 215 insertions(+)
create mode 100644 .gitignore
create mode 100644 css/base.css
create mode 100644 css/base.scss
create mode 100644 css/colors.css
create mode 100644 css/colors.css.map
create mode 100644 css/colors.scss
create mode 100644 css/common.css
create mode 100644 css/common.scss
create mode 100644 index.html
create mode 100644 verylargefile.txt
Successfully rebased and updated refs/heads/main.
$ git log
commit 574ec7e5d7d7a96427e049cad9806cdef724aedd (HEAD -> main)
Author: Ursula Clarke <email@example.com>
Date: Wed Jan 13 18:31:28 2021 +0100

Implement new design for homepage. Add .gitignore file for Sass folder.

Git Rebase

Developeri uobičajeno oklevaju da koriste git rebase zato što znaju da rebase može biti korišćen da potpuno obriše fajlove iz vaše baze koda. Kao što smo videli na prethodnim primerima, git rebase može biti korišćen da čuva vaš kod, kao i da ga očisti i obriše, ali šta ako zaista želite da trajno uklonite fajl iz istorije.

U našem primeru ćemo prikazati veliki fajl koji je commit-ovan zajedno sa drugim kodom koji želimo da sačuvamo u našoj istoriji kao drugi od pozadi commit.

Kada pronađete problematični commit, proverite ga pomoću git checkout:

$ git checkout ce861e4c6989a118aade031020fd936bd28d535b
Note: checking out 'ce861e4c6989a118aade031020fd936bd28d535b'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, you may
do so (now or later) by using -b with the checkout command again. Example:

git checkout -b <new-branch-name>

HEAD is now at ce861e4 Add CSS styles

Uklonite fajl ili editujte vaš kod i ostavite kod ili fajlove koje želite da ostanu netaknuti:

$ rm verylargefile.txt
$ git status
HEAD detached at ce861e4
Changes not staged for commit:
(use "git add/rm <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)

deleted: verylargefile.txt

no changes added to commit (use "git add" and/or "git commit -a")

Pokrenite git add -A tako da vaš obrisan fajl bude smešten tako da Git može da ga ukloni. Sada pokrenite git commit --amend -v i Git će vam tražiti da editujete vašu commit poruku.

Nakon toga, pokrenite git rebase --onto HEAD <commit-id> main. Tu možete naići na nekoliko konflikta prilikom spajanja, pre svega na konflikt između vašeg novog commit-a i starog koda. Git će vam tražiti da rešite konflikt:

$ git add -A
$ git status
HEAD detached at ce861e4
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)

deleted: verylargefile.txt

$ git commit --amend -v
[detached HEAD 7c9516a] Add CSS styles
Date: Sun Apr 30 14:43:54 2021 +0100
3 files changed, 9 insertions(+), 2 deletions(-)
create mode 100644 css/common.css.map
delete mode 100644 verylargefile.txt
$ git status
HEAD detached from ce861e4
nothing to commit, working tree clean
$ git rebase --onto HEAD ce861e4
First, rewinding head to replay your work on top of it...
Fast-forwarded HEAD to HEAD.

Ako otvorite fajl u vašem tekst editoru, videćete da je Git označio dve verzije index fajla. Vi jednostavno treba da uklonite jedan ili ga editujete da biste sačuvali željene izmene:

<p>
Internet was created by engineers. We are entrepreneurs, all passionate about
working with top tech talent and exciting companies from all over the world.
</p>
<<<<<<< HEAD
<p>
Intenet connects the top freelance talent all over the world.
</p>
</main>
</body>
</html>
=======
</main>
</body>
</html>
>>>>>>> Add index file

Kod između <<<<<<< HEAD i linije koja se sastoji od znakova jednakosti je jedna verzija, a kod između linije sa znakovima jednakosti i >>>>>>> Add index file je verzija iz “Add index file” commit-a. Tu možete videti da jedna verzija ima dodatni paragraf koja se sastoji od “Internet connects the top freelance talent all over the world,”, dok druga nema.

Sačuvajte editovan fajl i pokrenite git add filename praćeno sa git rebase --continue. Ukoliko nema izmena, takođe možete da pokrenete git rebase --skip. Malo će potrajati da prođe kroz rebase ukoliko je bilo dosta commit-a između commit-a velikog fajla i poslednjeg commit-a u glavnom fajlu.

Imajte na umu da su spojene izmene relevantne za određeni commit u istoriji, a ne za vaše poslednje izmene. Na primer, ako editujete commit kod kog je tekst na sajtu bio Arial, a sada je Verdana, trebalo bi da sačuvate taj commit sa istorijom dok je font face bio Arial.

Isto tako, ukoliko Git naiđe na razmak ili oznaku za kraj reda, to može da dovede do konflikta kod spajanja, pa budite oprezni.

Zaključak

Kao što ste videli, napredne Git komande mogu pomoći u rešavanju složenih problema pri radu sa kodom, uključujući promene u istoriji Git repozitorijuma, povezivanje različitih grana koda, interaktivno dodavanje izmena u commit-ove, promene commit poruka i sl.

Ove napredne Git komande mogu takođe pomoći u poboljšanju timskog rada, omogućavajući jednostavnije i efikasnije saradnju na projektima sa drugim developerima. Takođe mogu olakšati praćenje i analizu koda, omogućavajući developerima da se brzo kreću kroz velike količine izmena i različitih verzija koda.

Ukratko, napredne Git komande su od izuzetne važnosti za developere i timove koji žele da unaprede svoje veštine u radu sa Git-om, poboljšaju efikasnost i kvalitet svojih projekata i poboljšaju saradnju u okviru tima.

Pogledajte i ostale članke na ovu temu:

Slični postovi:

Git komande za početnike
Šta je novo u PHP 8.3
Redovno ažurirajte svoju lokalnu Git instalaciju

Bez komentara

Оставите одговор

Ваша адреса е-поште неће бити објављена. Неопходна поља су означена *