# Git Operations
Version control operations using the Git CLI.
## Operations
### Git.Tag
Creates a git tag. By default creates annotated tags. Runs on host (not in container).
```csharp
Git.Tag("v1.0.0");
Git.Tag("v1.0.0", o => o.WithMessage("Release notes here"));
Git.Tag("v1.0.0", o => o.AsLightweight()); // Lightweight tag
```
### Git.Push
Pushes the current branch to the remote repository. Runs on host (not in container).
```csharp
Git.Push();
Git.Push(o => o.ToRemote("upstream"));
Git.Push(o => o.WithUpstream()); // -u flag
```
### Git.PushTags
Pushes tags to the remote repository, skipping tags that already exist on the remote. Tags are pushed individually for safety. Runs on host (not in container).
```csharp
Git.PushTags();
Git.PushTags("upstream");
```
## Example
Tag and push a release with version tracking.
```csharp
// Tag and push a release
Git.Tag("v1.0.0");
Git.Push();
Git.PushTags();
// Custom tag with message
Git.Tag("v1.0.0", o => o.WithMessage("Release notes here"));
// Lightweight tag (not annotated)
Git.Tag("my-tag", o => o.AsLightweight());
```
## Using with Profiles
Git operations are commonly used with profiles to run only during release workflows.
```csharp
// Use profiles to run Git operations conditionally
var release = DefineProfile("release");
Dotnet.Build(app);
Dotnet.Test(tests);
if (release) {
Git.Tag("v1.0.0");
Git.Push();
Git.PushTags();
}
// CLI usage:
// ando -p release
```
## Options Reference
### Git.Tag Options
| Option | Description |
|--------|-------------|
| `WithMessage(string)` | Set the tag message for annotated tags. Appears when viewing the tag with `git show`. |
| `AsLightweight()` | Create a lightweight tag instead of an annotated tag. Lightweight tags are just pointers to commits without metadata. Use for temporary or local markers. |
| `WithSkipIfExists()` | Skip tag creation if the tag already exists. Shows a warning instead of failing. Useful in CI where builds may be re-run. |
### Git.Push Options
| Option | Description |
|--------|-------------|
| `ToRemote(string)` | Remote to push to (e.g., "origin", "upstream"). Defaults to "origin". |
| `ToBranch(string)` | Branch to push. Defaults to the current branch. |
| `WithUpstream()` | Set upstream tracking reference (`-u` flag). The local branch will track the remote branch for future push/pull operations. |
## Notes
- Git operations run on the **host machine**, not inside the container, since git credentials are typically configured on the host.
- By default, `Git.Tag()` creates annotated tags. Use `.AsLightweight()` for lightweight tags.
- `Git.PushTags()` only pushes tags that don't already exist on the remote. Tags are pushed individually rather than with `--tags`, so existing remote tags are never overwritten. If all tags already exist, the step succeeds with a skip message.
- **CI Server**: The ANDO CI Server automatically configures a git committer identity (`user.name` / `user.email`) in build containers, so annotated tags work out of the box. The default identity is `Ando Server `. Override it with `GIT_COMMITTER_NAME` / `GIT_COMMITTER_EMAIL` environment variables in your `.env.ando` file.