Skip to main content

Git Functions

Utah provides Git integration functions for version control operations and repository management.

Available Functions

FunctionReturnsDescription
git.undoLastCommit()voidUndo the last commit, preserving changes in staging area
git.currentBranch()stringGet the name of the current git branch
git.isClean()booleanCheck if the working directory has no uncommitted changes
git.resetToCommit(hash)voidHard reset to a specific commit hash
git.status()stringGet the short status of the working directory

git.undoLastCommit()

Performs a soft reset to undo the last commit while preserving all changes in the staging area. This is the safest undo operation — no work is lost.

// Undo the last commit
git.undoLastCommit();
console.log("Last commit undone, changes preserved in staging area");

// Use in error recovery
let commitNeedsFixing: boolean = true;
if (commitNeedsFixing) {
git.undoLastCommit();
console.log("Ready to make corrected commit");
}

// Use in a function for reusable rollback
function emergencyRollback(): void {
console.log("Rolling back last commit...");
git.undoLastCommit();
console.log("Done. Review changes before recommitting.");
}

Generated Bash:

# git.undoLastCommit() becomes:
git reset --soft HEAD~1

Reset type comparison:

Reset TypeCommit HistoryStaging AreaWorking Directory
Soft (Utah)✅ Undone✅ Preserved✅ Preserved
Mixed✅ Undone❌ Cleared✅ Preserved
Hard✅ Undone❌ Cleared❌ Cleared

Test Coverage:

  • File: tests/positive_fixtures/git_undo_last_commit.shx
  • Tests standalone statement usage in a git workflow

git.currentBranch()

Returns the name of the currently checked-out git branch as a string.

// Get and display the current branch
let branch: string = git.currentBranch();
console.log("Currently on branch: ${branch}");

// Use in conditional logic
let branch: string = git.currentBranch();
if (branch == "main") {
console.log("On production branch - be careful!");
}

// Use in deployment scripts
let currentBranch: string = git.currentBranch();
console.log("Deploying from branch: ${currentBranch}");

Generated Bash:

# git.currentBranch() becomes:
branch=$(git rev-parse --abbrev-ref HEAD)

Test Coverage:

  • File: tests/positive_fixtures/git_current_branch.shx
  • Tests variable assignment with branch name

git.isClean()

Returns a boolean indicating whether the working directory has no uncommitted changes. Returns true if clean (no modifications, no untracked files), false otherwise.

// Check if working directory is clean
let clean: boolean = git.isClean();
if (clean) {
console.log("Working directory is clean");
} else {
console.log("Working directory has uncommitted changes");
}

// Guard a deployment
let isClean: boolean = git.isClean();
if (!isClean) {
console.log("Error: commit or stash your changes before deploying");
exit(1);
}
console.log("Working directory clean - proceeding with deploy");

// Combine with branch check
let branch: string = git.currentBranch();
let clean: boolean = git.isClean();
if (branch == "main" && clean) {
console.log("Ready to release from main");
}

Generated Bash:

# git.isClean() becomes:
clean=$([ -z "$(git status --porcelain)" ] && echo "true" || echo "false")

# In an if condition:
if [ "$([ -z "$(git status --porcelain)" ] && echo "true" || echo "false")" = "true" ]; then
echo "Working directory is clean"
fi

Test Coverage:

  • File: tests/positive_fixtures/git_is_clean.shx
  • Tests boolean result in variable assignment and if-condition usage

git.resetToCommit(hash)

Performs a hard reset to a specific commit hash. This is a destructive operation — all uncommitted changes and commits after the target will be lost.

// Reset to a specific commit hash
git.resetToCommit("abc123def");

// Reset using a variable
let targetCommit: string = "a1b2c3d";
git.resetToCommit(targetCommit);

// Reset with confirmation
let shouldReset: boolean = console.promptYesNo("Reset to previous release?");
if (shouldReset) {
git.resetToCommit("v2.0.0");
console.log("Reset complete");
}

Generated Bash:

# git.resetToCommit("abc123") with a string literal becomes:
git reset --hard "abc123"

# git.resetToCommit(commitHash) with a variable becomes:
git reset --hard ${commitHash}
warning

git.resetToCommit() uses git reset --hard, which permanently discards all uncommitted changes and all commits after the target. Use git.undoLastCommit() for a safer alternative when you only need to undo the most recent commit.

Test Coverage:

  • File: tests/positive_fixtures/git_reset_to_commit.shx
  • Tests both string literal and variable argument usage
  • Negative test: tests/negative_fixtures/git_wrong_args.shx — verifies that calling without arguments fails

git.status()

Returns the short-format status of the working directory as a string.

let status: string = git.status();
console.log("Repository status: ${status}");

Generated Bash:

# git.status() becomes:
status=$(git status --short)

Practical Examples

Pre-deploy Safety Check

let branch: string = git.currentBranch();
let clean: boolean = git.isClean();

if (branch != "main") {
console.log("Error: deployments must be from main branch");
exit(1);
}

if (!clean) {
console.log("Error: working directory is not clean");
exit(1);
}

console.log("All checks passed - deploying...");

Undo, Fix, and Recommit Workflow

console.log("Starting commit correction workflow...");
git.undoLastCommit();
console.log("Last commit undone - changes are staged");
console.log("After making corrections, commit again");

Safe Reset with Confirmation

let shouldReset: boolean = console.promptYesNo("Hard reset to this commit?");
if (shouldReset) {
git.resetToCommit("abc123");
console.log("Reset complete");
} else {
console.log("Reset cancelled");
}

Use Cases

  • Version control automation — scripted git workflows
  • CI/CD pipeline integration — branch checks, clean-state validation
  • Release management — tag-based resets, branch verification
  • Repository maintenance — automated commit corrections
  • Deployment guards — ensuring clean state before deploy