Git Review Workflow Project
Deliver one small change through a branch, review, local exchange and integration. Keep the resulting file content and history both checkable.
How it works
A repair desk needs a collection reminder while retaining the existing inspection note. The project creates a feature branch, records one focused file, pushes to the local remote and integrates with --ff-only after inspecting the diff. The final assertion checks both files on the remote main branch. No hosted review or real delivery is implied.
Run the disposable lab
Use Windows PowerShell 5.1 or later and Git 2.28 or later. The reviewed CLI is Git for Windows 2.53.0.windows.2. These are PowerShell examples, not Git Bash commands. Save the download as workflow-project.ps1 in a separate empty learning folder and run it in a separate process: powershell -NoProfile -ExecutionPolicy Bypass -File .\workflow-project.ps1. The execution-policy option applies to that process, not your machine policy.
The script creates bhylu-git-workflow-project and refuses an existing folder. It supplies two fictional seed files and repository-local settings, then runs the lesson commands. The literal separator is quoted as '--' so PowerShell passes it through the guard. A guard function named git calls the real CLI and stops on unexpected failures; Expect-GitFailure checks deliberately refused operations. Child-process configuration isolates your personal Git settings. File transports are allowed only for owned local remotes; internet transports are disabled in this lab. No hosting account, Apache or MySQL service is required. There is no Git playground. Leave the generated folder for inspection; choose another empty parent to run again.
Example
# Bhylu Git lab: Review Workflow Project
# Run in a separate PowerShell process, in an empty learning folder.
# Existing lab folders are refused; nothing is pushed to an internet host.
$ErrorActionPreference = 'Stop'
$script:GitExe = (Get-Command git -CommandType Application | Select-Object -First 1).Source
$script:LabRoot = Join-Path (Get-Location) 'bhylu-git-workflow-project'
if (Test-Path -LiteralPath $script:LabRoot) { throw 'Lab folder already exists. Choose another empty parent folder.' }
New-Item -ItemType Directory -Path $script:LabRoot | Out-Null
$env:GIT_CONFIG_NOSYSTEM = '1'
$env:GIT_CONFIG_GLOBAL = Join-Path $script:LabRoot 'empty-global-config'
[IO.File]::WriteAllText($env:GIT_CONFIG_GLOBAL, '')
$env:GIT_TERMINAL_PROMPT = '0'
$env:GIT_EDITOR = 'true'
$env:GIT_SEQUENCE_EDITOR = 'true'
$env:GIT_AUTHOR_DATE = '2026-01-10T10:00:00+00:00'
$env:GIT_COMMITTER_DATE = $env:GIT_AUTHOR_DATE
function git {
& $script:GitExe -c protocol.allow=never -c protocol.file.allow=always @args
if ($LASTEXITCODE -ne 0) { throw "Git exited with code $LASTEXITCODE" }
}
function Expect-GitFailure {
& $script:GitExe -c protocol.allow=never -c protocol.file.allow=always @args
if ($LASTEXITCODE -eq 0) { throw 'Expected Git to refuse this operation' }
}
function Assert-Equal($Actual, $Expected) {
if ((($Actual | Out-String).Trim()) -cne (($Expected | Out-String).Trim())) { throw "Expected [$Expected], got [$Actual]" }
}
function Write-LabFile([string]$Name, [string]$Text) {
$target = [IO.Path]::GetFullPath((Join-Path (Get-Location) $Name))
if (!$target.StartsWith($script:LabRoot + [IO.Path]::DirectorySeparatorChar, [StringComparison]::OrdinalIgnoreCase)) { throw 'Path outside lab' }
[IO.Directory]::CreateDirectory([IO.Path]::GetDirectoryName($target)) | Out-Null
[IO.File]::WriteAllText($target, ($Text.Replace('\n', "`n") + "`n"), (New-Object Text.UTF8Encoding($false)))
}
function New-LabRepo([string]$Name) {
New-Item -ItemType Directory -Path $Name | Out-Null
Push-Location $Name
try {
git init --initial-branch=main
git config --local user.name 'Repair Lab'
git config --local user.email 'repair@example.invalid'
git config --local core.autocrlf false
git config --local commit.gpgSign false
git config --local tag.gpgSign false
git config --local core.hooksPath (Join-Path $script:LabRoot 'empty-hooks')
Write-LabFile 'notes.md' 'Inspect hinge'
Write-LabFile 'tasks.txt' 'desk=open'
git add '--' notes.md tasks.txt
git commit -m 'Record initial repair plan'
} finally { Pop-Location }
}
Push-Location $script:LabRoot
try {
New-LabRepo 'desk'
Set-Location desk
git init --bare --initial-branch=main ../shared.git
git remote add origin ../shared.git
git push -u origin main
git switch -c collection-guide
Write-LabFile 'collection.md' 'Bring the item label and repair receipt'
git add '--' 'collection.md'
git commit -m 'Add collection guide'
Assert-Equal (git diff --name-only main...HEAD) @('collection.md')
git push -u origin collection-guide
git switch main
git merge --ff-only collection-guide
git push origin main
Assert-Equal (git --git-dir=../shared.git show main:collection.md) @('Bring the item label and repair receipt')
Assert-Equal (git --git-dir=../shared.git show main:notes.md) @('Inspect hinge')
Assert-Equal (git status --porcelain=v1) @('')
Write-Output 'Verified: workflow-project'
} finally { Pop-Location }
Focus on the lesson commands
This excerpt omits the seed repository and guard helpers. Use the complete download to run it.
git init --bare --initial-branch=main ../shared.git
git remote add origin ../shared.git
git push -u origin main
git switch -c collection-guide
Write-LabFile 'collection.md' 'Bring the item label and repair receipt'
git add '--' 'collection.md'
git commit -m 'Add collection guide'
Assert-Equal (git diff --name-only main...HEAD) @('collection.md')
git push -u origin collection-guide
git switch main
git merge --ff-only collection-guide
git push origin main
Assert-Equal (git --git-dir=../shared.git show main:collection.md) @('Bring the item label and repair receipt')
Assert-Equal (git --git-dir=../shared.git show main:notes.md) @('Inspect hinge')
Assert-Equal (git status --porcelain=v1) @('')
Expected result
Remote main contains the collection guide and original inspection note. The local working tree is clean.
The complete script ends with Verified: workflow-project only after its checks pass. Object IDs, temporary paths and progress output can differ.
The exercise demonstrates a complete Git path for a non-diverged feature. Extend it by introducing concurrent work, reviewing a conflict and checking that neither contributor’s file disappears. A real release additionally needs application tests, review authorization and an explicit deployment workflow.