What is a Git Branch ?
About
This page talks about Branch management in Git.
For Git, a branch is:
- that represents a commit chain
Example of commit log (or log):
CA1--CA2--CA3 <-- Branch A (last commit CA3)
/
C1--C2--C3 <-- master (last commit C3)
\
CB1--CB2 <-- Branch B (last commit CB2)
- A commit represents the state of your file system at a point in time.
- Because the commit log is a directed acyclique graph, each leaf commit is a branch
What is a Head ?
The term “branch head” (or just “head”) reference to the most recent commit on a branch.
In the example above, the branch head of:
- the branch A is the commit CA3
- the branch B is the commit CB2
If you are not on a last commit, you are no more on a branch, you are in a detached mode
Name
The identification of branch may have a / or a space
- With a slash, you're referring to a remote-tracking branch (local)
remote/name
- With a space, , you're referring to a remote branch (branch on a remote machine over the network)
remote name
A branch name is just a ref (A name attached to a commit sha).
Type
Local
A local branch is a branch that exists only on your computer.
A local tracking branch is a local branch that is tracking another branch.
Remote Tracking
- A remote-tracking branch is a local copy of a remote branch.
Remote
See remote branch
Tag
Fork
See:
Usage / Strategy
Creating two features branch:
- heart glasses
- cowboy hat
Each feature is added back to the master individually. So if glasses are finished before the cowboy hat, no problem.
More see Git - Workflow (Branching Strategy)
Example of lifecycle
Example of workflow
# Create a feature branch
git checkout -b feature-myfeature develop
# Merge your work
git checkout develop
git merge --no-ff feature-myfeature
# Delete your branch
git branch -d feature-myfeature
# Integrate your work into the master repo
git push origin develop
Management
The git docs/git-branch.html command lists, creates, or delete branches.
Working / Current
The working or current branch is the branch actually in the working tree.
More… see current
Rename
Create
Update
Keeping your branch current with a parent branch (master for instance)
When merging two branches, Git check the commit sha of the branche ref and add the missing's one accordingly.
Example:
Update the master / main branch
- Switch to the local copy of master
git checkout master
git fetch origin
:: git fetch upstream
git merge origin/master
:: git merge usptream/master
Update the branch (Rebase)
- Go to the branch (ie checkout the files for this branch from the repository)
git checkout branchName
git rebase master
Ctrl + T shortcut on IDEA
Fetch
fetch all the remote branches from origin
git fetch origin
List
- Branch in a server: Remote tracking
git branch --remotes
# or
git branch -r
Checkout
Check out an existing branch
Remote Checkout
cd path/to/git/repository
git fetch origin
git checkout brancheName
git checkout brancheName
Switched to a new branch 'brancheName'
Branch 'brancheName' set up to track remote branch 'brancheName' from 'origin'.
The branch is now a remote tracking branch (a local branch that tracks the remote branch
where:
- fetch synchronize the local and remote repo
- What is a Git Checkout? change the working branch
From a tag
See Git - Tag
Switch
- Switch does not require a clean index and working tree (i.e. no differences compared to HEAD)
- The working tree and the index are updated to match the branch.
- All new commits are added to the tip of this branch.
git switch
Example:
- After working in the wrong branch, switching to the correct branch would be done using:
git switch -m mytopic
where m performs a three-way merge
In case of modification
Stash
git stash # keep the modification in a stash branch
git pull # get the last one
git stash pop # Destash the modification
Revert to head
Revert to the head of the upstream/master branch
git reset --hard upstream/master
Switch
git checkout branchName
Switched to branch 'branchName'
Share
When you want to share a branch with the world, you need to push it up to a remote that you have write access to.
git push <remote> <branch>
Delete
- delete branch locally
git branch -d branchName
- delete a branch remotely with push
git push origin --delete branchName