Files
git-cheatsheet-ita/docs/04-fetch-merge-pull.md

118 lines
2.2 KiB
Markdown

<!-- File: 04-fetch-merge-pull.md -->
# `git fetch`, `git merge` e `git pull`
Questi tre comandi sono spesso confusi, soprattutto da chi arriva da SVN.
---
## `git fetch`
- **Cosa fa:** scarica gli aggiornamenti dal remote (`origin`) ma **non** tocca la tua branch locale.
- Aggiorna solo i branch “remoti” tipo `origin/development`, `origin/master`.
Esempio:
```bash
git fetch origin
```
Dopo questo comando:
* `origin/development` ha gli ultimi commit dal server
* la tua branch `development` locale è ancora come prima
Puoi vedere la differenza:
```bash
git log --oneline --graph --decorate --all
```
---
## `git merge`
* **Cosa fa:** unisce i commit di un branch in un altro.
* Crea un nuovo commit di **merge** (a meno che la storia non sia fast-forward).
Caso tipico: sei su `development` e vuoi integrare gli ultimi commit dal server:
```bash
git checkout development
git fetch origin
git merge origin/development
```
Se non ci sono conflitti, Git può fare un **fast-forward**:
```text
Updating 1a2b3c4..9f8e7d6
Fast-forward
src/report.py | 10 +++++++---
1 file changed, 7 insertions(+), 3 deletions(-)
```
Se ci sono conflitti, Git segnala i file:
```bash
# risolvi i conflitti modificando i file
git add file-conflitto.ext
git commit # per completare il merge
```
---
## `git pull`
* **Cosa fa:** combinazione di:
1. `git fetch`
2. `git merge` (o `git rebase`, se configurato)
Comando corto:
```bash
git pull
```
È comodo ma **meno esplicito**: non vedi distintamente fase di fetch e merge.
### Comportamento consigliato
Per evitare sorprese:
```bash
git fetch origin
git merge origin/<nome-branch>
```
Quindi, esempio completo:
```bash
git checkout development
git fetch origin
git merge origin/development
```
### Quando usare `git pull`
* Sei sulla branch che traccia già il remote (es. `development``origin/development`)
* Sai che ti va bene un merge automatico
```bash
git checkout development
git pull
```
---
## Riepilogo concettuale
* **`git fetch`**
➜ "Scarica le novità dal server, ma non toccare il mio lavoro"
* **`git merge`**
➜ "Integra le modifiche da un branch dentro il branch su cui sono"
* **`git pull`**
➜ "Scarica e integra subito (fetch + merge) nella branch attuale"