======Git====== A general guide for the distributed version control system Git. * {{ :wiki:git-cheatsheet-en-dark.pdf | Git cheatsheet}} This guide shows the Git commands, but for ease of use these can be wrapped in shell functions. See [[powershell_git|Powershell Git]]. ===Initial Git configuration=== git config --global user.name "Your Name Here" git config --global user.email your@email.com git config --global core.excludesFile ~/.gitignore Check the configuration git config --list === Initializing or Cloning a Repo === Start by initializing a new repo or cloning an existing one. ===Initialize new repository === Since a project that is just starting tends to be rudimentary it makes sense to initially create the repo with an empty master branch and then immediately create a //working// branch where the initial work will begin. Once the project gets further along and hits certain milestones the changes can be merged into the master branch. * ''--allow-empty'' allows a commit to the repo without any files added. Below is an example using Powershell to only run commands if there is not an existing Git repo configured. **git-init.ps1** param( [Parameter(Mandatory=$true)] [String]$email ) if (-not(Test-Path -Path ".\.git")) { git init --initial-branch=main git config --global user.name "John Doe" git config --global user.email $email git config --global core.excludesFile ~/.gitignore git commit --allow-empty -m "Initial commit for bootstrapping the repo" git checkout -b working } git-init.ps1 -email "jdoe@gmail.com" == Sample .gitignore == .gitignore .vscode *.pyc __pycache__/ **/.working/* * [[git_init|Git Init]] == Setup remote repositories for Github and the like == git remote add === Clone Existing Repo === git clone =====Typical Workflow===== * Clone an existing repo or initialize a new one * Edit some source code. * Stage (new, changed and deleted) the changes. * Commit to the local repo. * Fetch changes from remote repo and merge them into working files. * Push changes out to remote repo. git diff HEAD git add -u git commit -m "wip" git fetch git merge / git push -u # Alternatively, push all branches git push --all ====== Seeing Changes ====== See what's new or modified in the working directory. git status List files that were part of the specified commit. Alias ''gls'' git ls-tree --full-tree --name-only -r $commit Show the details, including changes made, for the specified commit. git show $commit See the changes between the current working directory and the last commit (HEAD) or some other commit (e.g. HEAD~1). git diff HEAD * ''git diff'': Show differences between your working directory and the index. * ''git diff –cached'': Show differences between the index and the most recent commit. * ''git diff HEAD'': Show the differences between your working directory and the most recent commit. * ''git diff --name-only '': Show the files that changed between two commits. ==== History ==== git log ====== Branches ====== git checkout -b === Deleting Branches === git push -d git branch -d ====== Remotes ====== Push branch to remote repo git push -u ====== Squashing Commits ====== To tidy up a messy trail of commits ====Squash last n commits to one==== git reset --soft HEAD~n && git commit -m 'new commit message' git push --force ====== Archive/Dump/Extract to zip ====== git archive --format=zip -o $zip_file $commit [file(s) to archive] Example wrapper function in Powershell function git-extract([Parameter(Mandatory=$true)][string]$commit, [Parameter(Mandatory=$true)][string]$path) { $temp_file="$env:temp\git-dump.zip"; git archive -o $temp_file $commit; Expand-Archive -path $temp_file -destinationpath $path } ===== Extract specific file(s) from specific commits and put in a specified path ===== ==== Example in Powershell ==== $archive='c:\path\to\archive.zip'; git archive --format=zip -o $archive; Expand-Archive $archive -DestinationPath 'c:\path\to\destination' ====== git-extract ====== Using Powershell, extract the files from a specified commit to a destination folder. param( [Parameter(Mandatory=$true)] [String]$commit, [Parameter(Mandatory=$true)] [String]$DestPath ) $archive="$env:temp\$([System.IO.Path]::GetRandomFileName()).zip" git archive --format=zip $commit -o $archive Expand-Archive -Path $archive -DestinationPath $DestPath -Force === Example Usage === git-extract head $env:temp\foobar ====== Secondary Commands ====== Get URL for remote repo. git config --get remote.origin.url ====== Related ====== * [[Github]] * [[Powershell Git]] * [[https://www.conventionalcommits.org/|Conventional Commits]] * [[Handy Git Commands]]