# git

## git

### git Commit Historie eines Branches entfernen

Den aktuellen Branch (im Beispiel 'main') auf den Stand bringen, der später im
root der bereinigten Commit Historie stehen soll.

Als Zwischenschritt wird ein Branch ('temp_branch') erzeugt. Durch den
Parameter `--orphan` hat dieser keine Commit Historie.

```bash
$ git checkout --orphan temp_branch
```

In diesem Branch alle Dateien Stagen (`git add`) und den initialen Commit
durchführen

```bash
$ git commit -m "initial commit"
```

Damit sind alle Projektdateien im neuen Branch enthalten, haben aber nicht die
Commit Historie des anderen Branches.

Der alte Branch kann nun entfernt werden.

```bash
$ git branch -D main
```

Und der aktuelle Branch auf den Namen des alten Branches umbenannt werden.

```bash
$ git branch -m main
```

Bisher wurden die Änderungen nur an dem lokalen Repository vorgenommen und es
wurden Referenzen auf die Branches in einer Form geändert, dass andere Clones
des Repositories nicht mehr damit zurecht kommen. Dies würde man beim ersten
Push auf den Server beobachten, der die Änderungen ablehnt. Durch den
zusätzlichen Parameter `--force` lässt sich trotzdem der geänderte Stand des
Repositories pushen, allerdings müssen all diejenigen, die einen Clone des
Repositories haben diesen Parameter auch beim nächsten `pull` angeben um das
angepasste Repository zu laden.

```bash
$ git push --force origin main
```

## Automatic rebase

Um einen `git rebase` mehrerer commits ohne manuelle Interaktion durchzuführen
kann das Editor Kommando gegen einen `sed` getauscht werden und damit bis auf
den ersten 'pick' alle weiteren gegen ein 'squash' getauscht werden.

```bash
$ GIT_SEQUENCE_EDITOR="sed -i '2,\$s/^pick/squash/'" git rebase -i $REBASE_BASE --autosquash
```
