The steps below is for creating symlinks in the system root, targeting the config files in this repo.
Specifically, it'll create these symlinks:
# In root: ~/
.bash_profile@ --> gitconfig/.bash_profile
.bashrc@ --> gitconfig/.bashrc
.git_aliases@ --> gitconfig/.git_aliases
.gitconfig@ --> gitconfig/.gitconfig
.vim@ --> gitconfig/.vim
.vimrc@ --> gitconfig/.vimrcgit clone https://github.com/EvitanRelta/gitconfig
cd gitconfig
bash init.sh- Run Git Bash as administrator
- Execute
export MSYS=winsymlinks:nativestrict
(this will allow creation of symlinks used ininit.sh) - Do the steps in the
On Linuxsection above
Based on: https://stackoverflow.com/a/40914277
Aborts the current rebase/merge/cherry-pick/revert command.
# Alias for:
in_prog_cmd="$(git get-in-prog-cmd)"
&& echo "Aborting $in_prog_cmd..."
&& eval "git $in_prog_cmd --abort"Fuzzy add filenames.
Prefix and suffix each filename with * to match every file that contains the
keyword.
# Alias for:
fuzzy_filenames=$(echo "$@" | sed -E "s/([^ ]+)/\*\\1\*/g")
git add "$fuzzy_filenames"Negative add. Adds everything except the specified file(s).
# Alias for:
git add -A
git reset [file_paths]
# Usage:
git addn ./file1 ./dir/file2Deletes branch both locally and on remote.
# Alias for:
git branch -d [branch_name]
git push -d origin [branch_name]# Alias for:
git commit --amend --no-editClones repo into a non-empty dir.
(Force flag force overwrites any local files that conflicts with the repo files)
# Alias for (w/o force flag):
mkdir -p [clone_to_path]
cd [clone_to_path]
git init
git remote add origin [github_repo_url]
git fetch
git checkout -t origin/master
# Alias for (force flag):
# Force overwrite any conflicting files
...
git checkout -tf origin/master
# Example usage:
git clone-nonempty -f https://github.com/EvitanRelta/my-repo .Open all unmerged files in VSCode editor via the code command.
For example, if FILE1, PATH/TO/FILE2 and ../FILE3 are unmerged,
this command runs:
code "FILE1"
code "PATH/TO/FILE2"
code "../FILE3"Continues the current rebase/merge/cherry-pick/revert command.
# Alias for:
in_prog_cmd="$(git get-in-prog-cmd)"
&& echo "Continuing $in_prog_cmd..."
&& eval "git $in_prog_cmd --continue"Continues the current rebase/merge/cherry-pick/revert command while preventing the prompt for editing the commit message.
(similar to --no-edit flag for git commit)
# Alias for:
in_prog_cmd="$(git get-in-prog-cmd)"
&& echo "Continuing $in_prog_cmd (no edit)..."
&& eval "git -c core.editor=true $in_prog_cmd --continue"Adds all unstaged changes, then continues the current rebase/merge/cherry-pick/revert command while preventing the prompt for editing the commit message.
# Alias for:
git add -A
git cone# Alias for:
git add -A
git commit [flags/parameters]# Alias for:
git add -A
git commit --amend --no-editDeletes the current branch, checking out to previous branch.
# Alias for:
current_branch=$(git get-current-branch)
git checkout -
git branch -D $current_branchPrints the diff of staged files.
# Alias for:
git diff --staged [flags/parameters]Dumps any unstaged changes.
(Force flag dumps staged changes too)
:/is to select all files, including files not in the current directory (eg. "../../file.ext")
# Alias for (w/o force flag):
git restore :/
git clean -df :/
# Alias for (force flag):
git reset
git restore :/
git clean -df :/Commit-fixup targeting [commit_hash].
# Alias for:
git commit --fixup=[commit_hash]Fast-forwards current branch to corresponding branch on [remote].
# Alias for:
current_branch=$(git get-current-branch)
git fetch [remote]
git merge --ff-only [remote]/$current_branchFor when you accidentally type git twice.
# Alias for:
git [commands/flags/parameters]Displays Git commit graph.
# Alias for:
git log \
--graph \
--abbrev-commit \
--decorate \
--all \
--format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(auto)%d%C(reset)'Links local repo to [github_repo_url], by setting remote origin to url and set-upstream push.
(Force flag force-pushes local repo to remote)
# Alias for (w/o force flag):
git remote add origin [github_repo_url]
git remote set-url origin [github_repo_url]
git push -u origin master
# Alias for (force flag):
...
git push -uf origin masterMerge (no fast-forward) current branch (ie. [branch_name]) to master, and deletes it locally.
# Alias for:
git checkout master
git merge --no-ff --no-edit [branch_name]
git branch -D [branch_name]# Alias for:
git stash pop [flags/parameters]Pulls all remote branches.
-s skip-flag skips pulling [ignore_branch_name] remote branches.
# Alias for:
git fetch -p # Update + prune remote branches
echo "From $(git remote get-url origin)"
for remote_branch in `git branch -r | grep -v " -> " | grep "origin/"`; do
branch=${remote_branch#origin/}
git fetch
--update-head-ok # Allows changes to current branch/HEAD
origin "$branch:$branch" # Updates branch
2>&1 # Fix 'fetch' not outputting to 'grep'
| grep -v "From" # Removes repeated "From [REMOTE_URL]"
git branch --quiet -u "$remote_branch" "$branch" # Sets upstream, as 'git fetch' doesn't
done
# '-s' skip-flag implementation too complicated to showPulls and overwrite current local branch.
# Alias for:
git fetch
git reset --hard "origin/$(git branch --show-current)"Pulls (and checkout to) a PR's branch. The [username]:[branch] is given in
the GitHub's PR description.
If no remote with a URL containing [username] exists, create a new remote
named [username] (or [optional_remote_name] if given) with a URL based on
origin remote.
(eg. If origin https://github.com/EvitanRelta/repo then the URL will be https://github.com/[username]/repo)
If a remote exists, but it's name isn't equal to [optional_remote_name], then
that remote is renamed to [optional_remote_name].
For example, for the PR description:
"afiqzu wants to merge 1 commit into CS3219-AY2324S1:assignment-5 from afiqzu:assignment-5"
[username]:[branch] = afiqzu:assignment-5
# Given this scenario:
$ git remote -v
oldremote https://github.com/EvitanRelta/repo
origin https://github.com/myorigin/repogit pull-pr EvitanRelta:pr-branch
# is alias for:
git fetch oldremote
git checkout -b oldremote-pr-branch oldremote/pr-branchgit pull-pr EvitanRelta:pr-branch newremote
# is alias for:
git remote rename oldremote newremote
git fetch newremote
git checkout -b newremote-pr-branch newremote/pr-branchgit pull-pr NewUser:pr-branch newremote
# is alias for:
git remote add newremote https://github.com/NewUser/repo
git fetch newremote
git checkout -b newremote-pr-branch newremote/pr-branchPush (and setup to track) to the same branch-name on origin.
# Alias for:
current_branch=$(git get-current-branch)
git push -u origin $current_branchPush all commits until (and including) [commit] to the origin branch of
the same name.
# Alias for:
current_branch="$(git get-current-branch)"
git push origin "[commit]:$current_branch"Alias for rebase.
But if no -i or --interactive is given, it will pass the interactive flag along with a noop editor.
(this is to force autosquash, which for some reason doesn't run without interactive)
# Alias for (if interactive flag given):
git rebase [flags/parameters]
# Alias for (if no interactive flag given):
GIT_SEQUENCE_EDITOR=: git rebase -i [flags/parameters]Rebase the current branch onto [new_base] starting from (and including) [inclusive_from_commit].
(similar to git rebase [new_base] but only picking commits from HEAD up to [inclusive_from_commit])
(uses the re alias instead of rebase, to force autosquash)
# Alias for:
current_branch=$(git get-current-branch)
git re --onto [new_base] [inclusive_from_commit]~ $current_branchExactly the same as rebase, but preserves the author & committer dates of commits.
# Alias for:
git -c rebase.instructionFormat='%s%nexec GIT_COMMITTER_DATE=\"%cD\" git commit --amend --no-edit' rebase [same-options-as-rebase]
# Usage:
git rebase-preserve -i --rebase-merges @~5Rebases a single commit (with --rebase-merges flag) without opening interactive editor.
[interactive_command] is the pick/edit/reword/fix etc. command in the interactive editor.
# Alias for:
git rebase -i --rebase-merges [commit_hash]~
# Then replacing the 'pick' of the oldest commit to [interactive_command]
# Example ussage:
git rebun edit HEAD~3
git rebun e 2ea1622
git rebun reword HEAD~4Commit using the last undone (via undoc alias) commit's message.
# Alias for:
git commit -c [last_undone_commit] --no-editReplaces [branch] (ie. "that" branch) with current branch, then force deletes
current branch while checking out to [branch].
# Alias for:
current_branch=$(git get-current-branch)
git checkout [branch]
git reset --hard "$current_branch"
git branch -D "$current_branch"Replaces current branch (ie. "this" branch) with [branch], then force deletes [branch].
# Alias for:
git reset --hard [branch]
git branch -D [branch]Shows the changes of the commit that the current rebase has stopped at.
# Alias for:
stopped_commit_hash="$(git get-stopped-hash)"
git show "$stopped_commit_hash" [flags/parameters]Shows the changes of the commit that the current rebase has stopped at, specifically only for the currently unmerged files.
# Alias for:
unmerged_paths="$(git get-unmerged-paths)"
git show-stopped -- "$unmerged_paths"Changes the author/commiter names and emails of the previous commit.
# Alias for:
GIT_AUTHOR_NAME="[name]" GIT_AUTHOR_EMAIL="[email]" GIT_COMMITTER_NAME="[name]" GIT_COMMITTER_EMAIL="[email]" git commit --amend --no-editChanges the author/commiter dates of the previous commit.
# Alias for:
GIT_COMMITTER_DATE="[committer-date]" git commit --date="[author-date]" --amend --no-edit
# Usage:
git spoof-dates "Fri Dec 2 18:53:50 2022 +0800" "Fri Dec 2 18:54:09 2022 +0800"# Alias for:
git status [flags/parameters]Stashes staged changes, leaving behind unstaged changes.
# Alias for:
git stash-unstaged --quiet
git stash -u [flags/parameters]
git stash pop --quiet "stash@{1}"Stashes unstaged (and untracked) changes, leaving behind staged changes.
# Alias for:
git commit --quiet -m "TEMP (staged changes)"
git stash -u [flags/parameters]
git undocUndo/Uncommit the last commit, keeping the commit's changes as staged.
(Force flag doesn't keep the commit's changes)
Also saves the last undone commit's hash to undoc_hash.temp to be used by the
redoc alias.
# Alias for (w/o force flag):
git reset --soft HEAD~
# Alias for (force flag):
git reset --hard HEAD~Must be on a merge commit.
Restore the deleted branch from the merge commit, and undo the merge commit.
(effectively undoing git merge-this)
# Alias for:
git restore-deleted-branch HEAD
git undoc -f
git checkout -Checks if branch [branch] exists.
(Used in conditional statements for other aliases)
# Alias for:
git show-ref --quiet "refs/heads/[branch]"
# Usage:
if git branch-exists my-branch; then
...Gets current branch name.
(Used in other aliases)
# Alias for:
git rev-parse --abbrev-ref HEADGets current commit hash.
(Used in other aliases)
# Alias for:
git rev-parse HEADIf is currently rebasing, merging, cherry-picking or reverting, outputs rebase, merge, cherry-pick or revert respectively.
If not, exit with error, and output "Not currently rebasing, merging or cherry-picking" to stderr.
(Used to infer the continue/abort/etc. commands for rebasing/merging/cherry-picking/etc)
# Alias for:
if git is-rebasing; then
echo rebase
elif git is-merging; then
echo merge
elif git is-cherry-picking; then
echo cherry-pick
elif git is-reverting; then
echo revert
else
>&2 echo "Not currently rebasing, merging, cherry-picking nor reverting"
exit 1
fiGets the hash of the commit that the current rebase has stopped at.
(Used in other aliases)
# Alias for:
cat .git/rebase-merge/stopped-shaGets all the unmerged file paths, relative to the current dir.
For example, user is in /A/, unmerged file at /B/FILE, return ../B/FILE.
(Used in other aliases)
# Alias for:
git diff --name-only --diff-filter=U
# Then convert to be relative to current dir.Checks if there's any unmerged paths, which somehow can occur when .git/MERGE_HEAD doesn't exist.
(eg. during merge conflicts after applying a stash)
(Used in git get-in-prog-cmd)
# Alias for:
git ls-files --unmerged | grep -q .
# Usage:
if git has-unmerged; then
...Checks if [older_commit/branch] is an ancestor of [newer_commit/branch].
(Used in conditional statements for other aliases)
# Alias for:
git merge-base --is-ancestor [older_commit/branch] [newer_commit/branch]
# Usage:
if git branch-exists origin/master HEAD; then
...Checks if is currently cherry-picking, by checking if the .git/CHERRY_PICK_HEAD file exists.
(Used in git get-in-prog-cmd)
# Usage:
if git is-cherry-picking; then
...Checks if is currently merging, by checking if the .git/MERGE_HEAD file exists.
(Used in git get-in-prog-cmd)
# Usage:
if git is-merging; then
...Checks if is currently rebasing, by checking if the .git/rebase-merge folder exists.
(Used in git get-in-prog-cmd)
# Usage:
if git is-rebasing; then
...Checks if is currently reverting, by checking if the .git/REVERT_HEAD file exists.
(Used in git get-in-prog-cmd)
# Usage:
if git is-reverting; then
...Restores a locally-deleted branch from a merge commit, and returns [branch_name].
Infers the deleted [branch_name] from the merge commit's subject.
(expects the merge commit's subject to be in the form: "Merge branch '[branch_name]' ...")
# Alias for:
git branch [branch_name] [merge_commit_hash]^2
echo [branch_name]