======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
git config --global init.defaultBranch main
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 ======
* Checkout the branch the new branch is based on
* Then create branch
git branch
* Create a ranch and check it out in one command
git checkout -b
=== Deleting Branches ===
* Delete remote branch, if it exists
* Then delete the local branch
git push -d
git branch -d
To force delete an unmerged branch
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]]