Reference - Git commands

Version control systems allow you to track all changes made to your codebase and enables you to do things like reverting to an old version of code, developing features separately without affecting other people's changes etc. There are many version control tools like Git, SVN/subversion etc. Git is a very popular version control system out there. It is a distributed version control system, ie - every user will have their own seprate copy of code and can continue development even if there is no connectivity to server. From Salesforce development perspective, using version control systems like git became more important than earlier with Salesforce DX(SFDX).

Basics

This article assumes that you know basics of git. Once you are familiar with basics, you can use this reference article to quickly find common git commands. If you want to go through basics of git please checkout this git guide.


#GIT Basic Commands
#Creating new repo
git init [project-name]
#Cloning existing repo
git clone [url]
#List all new/modified files that needs to be committed
git status
#Shows difference in files that is not yet staged
git diff
#Add particular file for staging
git add [file]
#Add all files for staging
git add .
OR
git add -A
#Show difference between staging and latest local file
git diff --staged
#Show difference with a commit
git diff HEAD
git diff HEAD^
git diff HEAD~6
#Show difference between commits
git diff HEAD^..HEAD
git diff sha1..sha2
git diff master featureBranch
git diff --since=2.month.ago --until=1.week.ago
#Show all changes to a single file by lines with date
git blame index.html --date short
#Unstage file with preserved content
git reset [file]
#Committing file
git commit -m "Message"
#Adding and committing file in one shot
git commit -am "Message"
#List all branches
git branch
git branch -r #shows remote branches
git remote show origin #Shows more details about each local and remote branch
git remote prune origin #Cleans up deleted remote branches
#Create new branch
git branch [branch-name]
#Checking out/Switching to specific branch
git checkout [branch-name]
#Creating and Checking out a branch in one step
git checkout -b [branch-name]
#Creating a branch and checking out from a different branch
git checkout -b myfeature develop
#Merging specific branch's commits into the current branch
git merge [branch]
#Adding remote link
git remote add origin ssh://git@stash.ddhive.com:7999/test/test.git
git remote rm origin
git remote rename origin newname
#List all remotes
git remote -v
#Publishing branch to remote repo
git push -u origin [branch-name]
#Pushing tags to remote
git push <remote> --tags
#Deleting branch locally
git branch -d [branch-name] --> If changes are fully merged
git branch -D [branch-name] --> Force deleting even if changes are not fully merged
#Deleting branch from remote
git push origin --delete [branch-name]
OR
#git push origin :[branch-name]
#Delete file and stage deletion
git rm [filename]
#Remove from version control and preserve locally
git rm --cached [filename]
#Move/rename file and prepare for commit
git mv [oldname] [newname]
#Temporarily stash all modified tracked files
git stash
#Restores latest stashed files
git stash pop
#OR
git stash apply + git stash drop
#Lists all stashed changesets
git stash List
#Delete most recent stashed changeset
git stash drop
#Putting to stash and applying back
git stash save
or
git stash save "message to stash"
or
git stash save --keep-index #To stash and keep staged files as such
or
git stash save --include-untracked #To stash and keep untracked files also
git stash apply
or
git stash apply stashName
git stash branch branchName stashName # to create branch from stash
git stash show stashName # to get details of stash
git stash clear # clear all stashes
#Enabling color
git config --global color.ui true
#Listing all config
git config --list
#List version history
git log
#One line log
git log --pretty=oneline
#Log with change details
git log --oneline -p
#Log with how many lines inserted/remoted
git log --oneline --stat
#Log with graphical branching
git log --oneline --grph
#Filtering logs with time range
git log --since=2.month.ago --until=1.week.ago
#List version history in graphical manner
git log --graph
#Creating alias for log
git config --global alias.mylog "log --pretty=format:'%h %s [%an]' --graph"
git mylog
#Alias for status
git config --global alias.st status
git st
#List version history of a particular file
git log --follow [filename]
git diff [first-branch]...[second-branch]
#Show changes on a particular commit
git show [commit]
#Reset head to a particular commit, preserving changes locally
git reset [commit]
#Resets head and discards all history
git reset --hard [commit]
#Reset last two commits
git reset --hard HEAD^^
#Undo last commit and put the changes back to staging
git reset --soft HEAD^
#Amending last commit
git commit -amend -m "New message"
#Downloads all history of a particular branch
git fetch [branch-name]
#Download history and incorporate to local branch
git pull
git pull --rebase #does fetch + rebase. It is better.
git push
#Resetting head to an old point
git reset --hard 6ae0aa9c5cb678
#Clearing untracked files after hard reset
git clean -f -d
#Ignoring changes to two files
git checkout -- file1.txt file2.html
#Merging feature branch to develop branch
$ git checkout develop
#Switched to branch 'develop'
$ git merge --no-ff myfeature
#Updating ea1b82a..05e9557
#(Summary of changes)
$ git branch -d myfeature
#Deleted branch myfeature (was 05e9557).
$ git push origin develop
#Creating release branch from develop
$ git checkout -b release-1.2 develop
#Switched to a new branch "release-1.2"
$ ./bump-version.sh 1.2
#Files modified successfully, version bumped to 1.2.
$ git commit -a -m "Bumped version number to 1.2"
#[release-1.2 74d9424] Bumped version number to 1.2
#1 files changed, 1 insertions(+), 1 deletions(-)
#Merging changes to master and tagging
$ git checkout master
#Switched to branch 'master'
$ git merge --no-ff release-1.2
#Merge made by recursive.
#(Summary of changes)
$ git tag -a 1.2
#Merging same changes to develop
$ git checkout develop
#Switched to branch 'develop'
$ git merge --no-ff release-1.2
#Merge made by recursive.
#(Summary of changes)
#Deleting release branch
$ git branch -d release-1.2
#Creating hotfix branch and merging to master and develop branches
$ git checkout -b hotfix-1.2.1 master
#$ ./bump-version.sh 1.2.1
$ git commit -a -m "Bumped version number to 1.2.1 and applied fixes"
$ git checkout master
$ git merge --no-ff hotfix-1.2.1
$ git tag -a 1.2.1
$ git checkout develop
$ git merge --no-ff hotfix-1.2.1
#List Tags
git tag
#Checkout particular tag code
git checkout v0.1
#Creating new tag
git tag -a v0.2 -m "v0.2"
#Pushing tags to remote
git push --tags
#Rebase applies local commits after remote commits. This avoids a merge commit
#Rebasing master with remote master
git fetch
git rebase origin/master
#If conflict is there fix it, git add, then
git rebase --continue
#Manipulating last 3 commits using rebase
git rebase -i HEAD~3
#Then below options
# p, pick = use commit
# r, reword = use commit, but edit the commit message
# e, edit = use commit, but stop for amending
# s, squash = use commit, but meld into previous commit
# f, fixup = like "squash", but discard this commit's log message
# x, exec = run command (the rest of the line) using shell
# d, drop = remove commit
#Clone entire repo & rewriting history
git clone repoName filterRepo
git filter-branch --tree-filter anyShellCOmmand #[takes each commit, runs command, recommits]
git filter-branch --tree-filter anyShellCOmmand -- --all # to run in all commits and all branches
git filter-branch --tree-filter 'rm -f passwords.txt'
git filter-branch --tree-filter 'find . -name "*.mp4" -exec rm {} \;'
#or run below command to operate in staging are with git command
git filter-branch --index-filter 'git rm --cached --ignore-unmatch passwords.txt' --prune-empty -- --all
#To remove empty commits
git filter-branch -f --prune-empty -- --all
#Line endings
Unix /n
git config --global core.autocrlf input
Windows /n/r
git config --global core.autocrlf true
#Sample .gitAttributes
* text=auto
*.rb text
*.js text
*.bat text eol=crlf
*.sh text eol=lf
*.png binary
git cherry-pick commitId
git cherry-pick --edit commitId # to edit commit message
git cherry-pick --no-commit commit1 commit2 # pick multiple and stage
git cherry-pick -x commitId # keep same SHA
git cherry-pick --signoff commitId # adds name of cherry-picker
#Submodules
git submodule add remoteRepoName
#Any new local commits to submodule should be pushed to submodule remote and main repo remote seprately
#Any new user need to run below after clone
git submodule init
git submodule update # should be be used to refresh the repo anytime
#submodule update brings repo to headless state. To fix run below,
git checkout master
git merge hashShownInHeadlessState
#To abort push if submodule is not pushed
git push --recurse-submodules=check
#To automatically push submodules
git push --recurse-submodules=on-demand
#Alias it as below
git config --global alias.pushall "push --recurse-submodules=on-demand"
#Git stores backup in reflogs (Only available locally)
git reflog #-> to see backup. even after hard reset
or
git log --walk-reflogs #-> gives more details
view raw Git Commands.sh hosted with ❤ by GitHub

Explanation

You need to have a very high level idea about git to use this reference article. Just search in the page to find commands for common operations like cloning repo, creating branch, committing code, reverting code, stashing code etc.


How to use

Install Git CLI corresponding to your operating system from git website. Start running commands from above command reference.

Please note that if you do not want to use command line git, you can always depend on git clients like Github Desktop, SourceTree, TortoseGit, GitKraken and more others


No comments:

Post a Comment