GIT distributed version control system
GIT overview
Section titled “GIT overview”Git is a distributed version control system. Unlike Subversion, this means whole copies of the repository can exist in multiple locations. In practice there is usually the notion of a central repository.
Hosted solutions
Section titled “Hosted solutions”Stash has been renamed to Bitbucket Server, it is a self-hosted option.
Remote repositories
Section titled “Remote repositories”Remote repositories are git repositories that you can push changes to, or pull changes from. It is possible to have multiple remote repositories.
When a repo is initially cloned, a remote named origin is tracked that will point to the original repo.
To list all the remote repositories, run
git remoteTo see all the URLs of the remote repositories, run
git remote -vTo find out the URL of the origin repo, run
git config remote.origin.urlIt will print out the URL.
To change the remote URL for the remote named origin:
git remote set-url origin git@example.com:magicmonster/example.gitSetting your username and email
Section titled “Setting your username and email”This can be configured globally or per repository
To change it for the current repo, set the config values user.name and user.email
git config user.email email@example.comgit config user.name "Joe Bloggs"To change it for your user, use the —global option.
git config --global user.email email@example.comMigrating from Subversion
Section titled “Migrating from Subversion”See migrating to git
Ignoring files
Section titled “Ignoring files”Add a .gitignore which contains a list of file patterns that git should ignore. See the
gitignore documentation for detailed info.
SSH keys
Section titled “SSH keys”gitolite, github, and bitbucket all support SSH keys. If you don’t already have a keypair, create one
using ssh-keygen, then you can use it for both authentication and identification.
Branching
Section titled “Branching”Branching is different in git to subversion. You can have local only branches, which allows for different workflows.
Branch Creation
Section titled “Branch Creation”Local branch creation
Section titled “Local branch creation”Switch to your source branch, then checkout and create your new branch. In the following example feature/foo
is the original branch, and feature/foofix is the new branch.
git checkout feature/foogit checkout -b feature/foofixfatal: Failed to lock ref for update: Not a directory
Section titled “fatal: Failed to lock ref for update: Not a directory”error: unable to resolve reference refs/heads/feature/foo/fix: Not a directory fatal: Failed to lock ref for update: Not a directoryThis happened when trying to create a branch named feature/foo/fix. This is not allowed if a basename
or parent branch called feature/foo already exists.
Remote branch creation
Section titled “Remote branch creation”If you are using a hosted solution, you can do this via the UI.
After it has been created, check it out to your local. In the following example it is assumed your branch is named ‘quickfix’.
git checkout -b quickfix origin/quickfixTo create a remote branch from an existing local branch named feature/quickfix, you need to push it.
git push origin feature/quickfixBranch cleanup
Section titled “Branch cleanup”Remove invalid remote tracking branches
Section titled “Remove invalid remote tracking branches”The remote origin branch may have been removed, but your local branch still refers to it. This could happen when a pull request has been merged.
git remote prune originThis will prune references to invalid remote origin branches.
Show merged branches
Section titled “Show merged branches”If a branch has been merged, it makes sense to delete it. I do this for feature branches that have been merged into master.
First list the branches that have been merged
git branch --mergedDelete a local branch
Section titled “Delete a local branch”git branch -d fooReset branch
Section titled “Reset branch”Sometimes you do not want to push your changes to the remote branch. You can reset your local branch with the following command:
git checkout quickfixgit reset --hard origin/quickfixMerging
Section titled “Merging”Switch to the target branch, then merge commits from the source branch.
git checkout targetgit merge sourcewhere source and target are branch names.
Pushing
Section titled “Pushing”There is a difference between author and committer. This can happen when you are merging commits authored by people on different branches. There may be special hooks added to the remote git repo that checks your pushes and may reject them. If you are using IntelliJ, use the command line instead to see the error message. e.g. Bitbucket can have hooks that checks that the name and email is valid within the organisation.
Export repo
Section titled “Export repo”If you are interested in an export of only the source code, use the git archive subcommand.
To access a remote repo, use the remote option.
git archive --remote git@example.com:example/example.git --output example.tar master