Git és un sistema de control de versions (VCS, Version Control System) distribuït, creat l’any 2005 per Linus Torvalds (el creador del nucli Linux) per gestionar el desenvolupament del propi kernel després que es retirés la llicència de l’eina propietària que s’utilitzava fins aleshores (BitKeeper).
Un sistema de control de versions permet:
A diferència d’altres sistemes més antics (com CVS o Subversion), que són centralitzats (hi ha un únic servidor amb l’historial complet i els clients només tenen una còpia de treball), Git és distribuït: cada còpia local del dipòsit conté tot l’historial complet del projecte. Això té avantatges importants:
Git no s’ha de confondre amb GitHub, GitLab o Bitbucket: aquests són serveis web (plataformes d’allotjament de dipòsits) que utilitzen Git per sota, però hi afegeixen funcionalitats extra (interfície web, gestió d’incidències, pull requests, CI/CD, wikis, etc.).
És l’eina estàndard de facto per al control de versions en el
desenvolupament de programari i la gestió de qualsevol projecte basat en
fitxers de text (codi, configuracions, documentació…). El seu model
distribuït, la rapidesa de les branques i la integritat garantida de
l’historial l’han convertit en una peça imprescindible tant en entorns
professionals com educatius. La instal·lació a Ubuntu és immediata
mitjançant apt, i una configuració inicial mínima (nom,
correu, editor i clau SSH) és suficient per començar a treballar-hi amb
comoditat.
| Concepte | Descripció |
|---|---|
| Dipòsit (repo) | Directori on Git emmagatzema tot l’historial d’un projecte (a la
carpeta oculta .git). |
| Commit | Una “fotografia” de l’estat dels fitxers en un moment donat, amb un missatge descriptiu i un identificador únic (hash SHA-1). |
| Working directory | Els fitxers tal com els veus i edites al disc. |
| Staging area (índex) | Zona intermèdia on es preparen els canvis abans de confirmar-los amb un commit. |
| Branca (branch) | Una línia de desenvolupament independent. La branca per defecte sol
anomenar-se main (abans master). |
| Remot (remote) | Una còpia del dipòsit allotjada en un altre lloc (per exemple, a GitHub), amb la qual se sincronitzen canvis. |
| HEAD | Punter que indica en quin commit/branca et trobes actualment. |
| Merge | Combinar els canvis de dues branques diferents. |
| Clone | Descarregar una còpia completa d’un dipòsit remot. |
git log, git diff, git blame per
veure qui ha canviat cada línia i quan.v1.0.0).git daemon, Gitea o Gitolite).Ubuntu inclou el paquet git als dipòsits oficials, de
manera que la instal·lació és molt senzilla.
Actualitza la llista de paquets:
sudo apt updateInstal·la Git:
sudo apt install gitComprova la versió instal·lada:
git --versionEls dipòsits d’Ubuntu no sempre porten la versió més recent de Git. Si es necessita l’última versió estable, es pot utilitzar el PPA mantingut pels desenvolupadors de Git:
sudo add-apt-repository ppa:git-core/ppa -y
sudo apt update
sudo apt install git -y
git --versionEncara que aquest document se centra en la línia d’ordres (la manera més habitual i completa de treballar amb Git), hi ha clients gràfics disponibles als dipòsits si es vol una interfície visual:
sudo apt install gitk git-guigitk: visualitzador d’historial i branques.git-gui: eina gràfica per fer commits, veure
diferències, etc.Un cop instal·lat, cal configurar com a mínim el nom i el correu electrònic, ja que Git els incrusta a cada commit.
git config --global user.name "Ramon López"
git config --global user.email "ramon@exemple.cat"L’opció --global desa la configuració a ~/.gitconfig, aplicant-se a tots els dipòsits de l’usuari.
Sense --global, la configuració només s’aplica al dipòsit
actual (es desa a .git/config).
Per als missatges de commit llargs o operacions com git rebase -i:
git config --global core.editor "nano" # o "vim", "code --wait", etc.Des de Git 2.28, es pot triar el nom de la branca inicial
(habitualment main en lloc de l’antic master):
git config --global init.defaultBranch maingit config --global color.ui autogit config --global alias.st status
git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.cm "commit -m"
git config --global alias.lg "log --oneline --graph --all --decorate"git config --list
git config --list --show-origin # mostra a quin fitxer prové cada valorEls fitxers de configuració es llegeixen en aquest ordre de prioritat (de menor a major):
/etc/gitconfig — configuració de tot el sistema
(git config --system).~/.gitconfig o ~/.config/git/config —
configuració de l’usuari (git config --global)..git/config — configuració específica del dipòsit
(git config --local, per defecte).Per treballar amb GitHub/GitLab sense haver d’introduir la contrasenya cada vegada, es recomana generar i configurar una clau SSH:
ssh-keygen -t ed25519 -C "ramon@exemple.cat"
eval "$(ssh-agent -s)"
ssh-add ~/.ssh/id_ed25519
cat ~/.ssh/id_ed25519.pub # copiar i enganxar a GitHub/GitLab (Settings > SSH Keys)Comprovar la connexió:
ssh -T git@github.com# Crear un dipòsit nou
git init
# Clonar un dipòsit existent
git clone https://github.com/usuari/projecte.git
# Veure l'estat del directori de treball
git status
# Afegir canvis a l'àrea de preparació (staging)
git add fitxer.txt
git add . # afegeix tots els canvis
# Confirmar els canvis (crear un commit)
git commit -m "Missatge descriptiu del canvi"
# Veure l'historial de commits
git log
git log --oneline --graph --all
# Crear i canviar de branca
git branch nova-funcionalitat
git checkout nova-funcionalitat
# o, en una sola ordre:
git checkout -b nova-funcionalitat
# Fusionar una branca amb la branca actual
git merge nova-funcionalitat
# Sincronitzar amb el dipòsit remot
git pull # descarregar i fusionar canvis
git push # pujar els commits locals
git fetch # descarregar canvis sense fusionar-los
# Desar canvis temporalment
git stash
git stash pop
# Desfer canvis
git checkout -- fitxer.txt # descartar canvis no confirmats
git reset HEAD~1 # desfer l'últim commit (mantenint els canvis)
git revert <hash> # crear un commit nou que desfà un commit anterior