Git gebruik organiseren: branches, comit, merge
(Reeks Git – handboek (nl) – commando’s vb – branch, merge – GitLab vb – SourceForge vb – git en gambas)
Zie ook artikel over branches in git, (Engelstalig, 2015)
Branch commando’s
git branch
(--list
)= toon branches; git branch -a
= toon alle (ook remote)
git branch -v
= toon laatste commit messages
git branch Testing
= maak nieuwe branch met naam “Testing”
git checkout Testing
= overschakelen naar branch
git checkout -b Testing2
= maken en overschakelen naar nieuwe branch (die op het moment wordt gemaakt; combinatie van branch en checkout)
git merge bugfix
= merge bugfix in huidige branch (vorige checkout branch, hier dus Testing)
git branch -d bugfix
= verwijder branch (gaat niet? checked out?)
Branch, merge
Veelgebruikte struktuur van vertakkingen:
Master branch (-> production server)
Develop branch (-> staging server)
- Feature branch
- Hotfix branch
- Release branch
- Support branch
Git Branching and merging strategies beschrijft het zo:
Master – Test – Develop
Uit Master wordt initieel test gemaakt, uit test develop, en uit develop de feature branches.
Master - Test - Develop -- Feature-1 -- Feature-2
(
De Develop stage krijgt updates uit de feature branch die gewijzigd is;
.. Develop <-- Feature-1 <-- Feature-2
De feature branches houden zich up to date door de wijzigingen uit de develop regelmatig af te halen (rebase). Hoe beter ze onderling op de hoogte blijven van de ontwikkeling, hoe minder conflicten later.
.. Develop --> Feature-1 --> Feature-2
En alles van develop gaat uiteindelijk naar boven naar test, dan naar Master.
Vanuit Master wordt een Release 1.0 branch gemaakt.
Later vanuit Master een Release 2.0 branch.
De bugs die ontdekt worden in de Release branches, kunnen gepatcht worden (éérst op eerste versie waar die voorkomt)
bv comit op Release 1 –
van daaruit Merge naar Release 2
van daaruit Merge naar Develop (waarna het met rebase bij de feature branches komt, en waar het klaar zit voor de volgende release naar boven)
Overzicht van bestaande branches:
git branch --list
bugfix
* master
testing
Verschillende commits:
- Merge
- Fast-Forward
- Rebase
Branch namen
Vb van een prefix die onderscheidend werkt:
feat-shortname
bv: feat-stocklist
fix-shortname
bv: fix-bugitem1234
hot-shortname
bv: hot-fixCrashStartWithoutDb
rel-shortname
bv: rel-v1-2
try-shortname
bv: try-stocklistlocalcache
Branch lokaal-remote
Een lokaal gemaakte branch kan nadien gewoon naar de server gestuurd worden:
git push origin feat-1
of ook:
git push --set-upstream origin test
korte versie:
git push -u origin test
Voorbeeld 1 merge (recursive):
master: bestand 1 veranderd; commit
develop: bestand 2 veranderd; commit
git checkout master
git merge testing
Merge made by the ‘recursive’ strategy.
TweedeBestand.txt | 1 +
1 file changed, 1 insertion(+)
Voorbeeld 2 merge (fast-forward):
git checkout master
git checkout -b bugfix
Switched to a new branch ‘bugfix’
Wijzig bestand 2, en …
git commit -a -m "voeg commentaar toe"
[bugfix 02aa0b3] voeg commentaar toe
1 file changed, 1 insertion(+)
git checkout master
Switched to branch ‘master’
Your branch is ahead of ‘origin/master’ by 3 commits.
(use “git push” to publish your local commits)
git merge bugfix
Updating feb4282..02aa0b3
Fast-forward
TweedeBestand.txt | 1 +
1 file changed, 1 insertion(+)
Voorbeeld 3: opkuisen na merge
Daarna mag de tak van de bugfix weg:
git branch -d bugfix
Deleted branch bugfix (was 02aa0b3).
Als hij nog aktief staat krijg je een fout:
error: Cannot delete branch ‘bugfix’ checked out at ‘/home/..
Voorbeeld 4 merge (rebase)
branch master, test, feat-1, feat-2
wijzigingen feat-1, commit
wijzigingen feat-2, commit
git checkout test
git status
git merge feat-1
Updating f276191..804f3c6
Fast-forward
Project/.src/Filename.class | 12 +++++++++++-
… (bestanden en wijzigingen)
12 files changed, 291 insertions(+), 37 deletions(-)
create mode 100644 Project/.src/FGetText.class
create mode 100644 Project/.src/FGetText.form
git merge feat-2
Auto-merging Project/Changes.txt
Auto-merging Project/.src/MForm.module
Auto-merging Project/.src/FMain.class
Merge made by the ‘recursive’ strategy.
Project/.src/FMain.class | 2 +-
Project/.src/MForm.module | 1 +
… (bestanden en wijzigingen)
7 files changed, 646 insertions(+), 1 deletion(-)
create mode 100644 Project/.src/Class/CIntWeek.class
create mode 100644 Project/.src/Forms/FInterim.class
Om in mijn feat-1 alle wijzigingen van test al mee te krijgen:
git checkout feat-1
git rebase test
Opm:
– alhoewel niet iedereen voorstander is van rebase gebruik, zie ook fetch/merge, pull
– “never force push to a shared branch”, “don’t rebase on shared branches”, zegt Julia Evans
Voorbeeld 5 merge (diverged/rebase)
Zie hier…
http://linuxuser.copyleft.be/liglog/?p=7490
Merge Error 1
Fout op 1 bestand dat lokaal veranderd is, maar enkel een .settings bestand is dat mag overschreven worden:
git reset --hard
Daarna terug de merge.
Merge Error 2
git checkout test
git merge feat-1
Auto-merging Proj/Changes.txt
CONFLICT (content): Merge conflict in Proj/Changes.txt
Automatic merge failed; fix conflicts and then commit the result.
git status
On branch test
You have unmerged paths.
(fix conflicts and run “git commit”)
(use “git merge –abort” to abort the merge)Changes to be committed:
modified: Proj/.src/ProjForms/FInterim.class
modified: Proj/.src/ProjForms/FInterim.formUnmerged paths:
(use “git add…” to mark resolution) both modified: Proj/Changes.txt
Inderdaad, de Changes.txt file is gewijzigd in beide takken. Als je het bestand in de huidig aktieve branch (de merge branch Test in dit geval) opent, zal je aanduidingen zien van de overlapping:
0.1.2 ... < <<<<<< HEAD FFactoring: 0.1.2 ======= >>>>>>> feat-interim
HEAD : geeft de “hoofd”-branch aan, waar naartoe gemerged wordt, waarna die tekstversie
====== : geeft de scheiding aan naar het begin van de ingevoegde (feature-,..) branch en de bijhorende tekstversie
Ook de ingevoegde branch naam staat er achter.
Maak van de tekst de versie die het uiteindelijk moet worden, combineer beide stukken of gooi wat weg.
Stage de veranderingen met git add .
Commit de veranderingen met git commit -m "Resolve merge conflict by combining and ordening changes.txt"
Probeer daarna opnieuw een merge.