HowToGit

David Maluenda Niubó edited this page Jun 20, 2018 · 28 revisions
Scipion Logo

We manage our development through issues tracking in Scipion GitHub project.
A nicer view of the Scipion issues is provided by Waffle.io

Table of Contents

Basic GIT documentation

Configuration

Setup your name and email

git config --global user.name "Your Name"
git config --global user.email "your@email.domain"

Setup some aliases

git config --global alias.co checkout
git config --global alias.br branch
git config --global alias.ci commit
git config --global alias.st status

Some others handful aliases for using the git-flow methodology.

# To create a new feature branch and publish to origin
git config --global alias.new-feature '!git checkout -b $1 master \
&& git push -u origin $1 #'
# To create a hotfix branch (now from v1.0)
git config --global alias.new-hotfix '!git checkout -b $1 v1.0 \
&& git push -u origin $1 #'

Branches

List all branches:

 git branch -a

Create a new branch and move to it:

 git checkout -b NEW_BRANCH

Then you can publish it to origin:

 git push -u origin NEW_BRANCH

Deleting a branch

Locally delete a branch

 git branch -d OLD_BRANCH
This must be done in a different branch than OLD_BRANCH

The previous command does not allow to locally remove unless the OLD_BRANCH has been merged to another branch. If you want, anyway to locally remove the branch do

 git branch -D oldBranch

To delete the branch remotely (after delete it locally):

 git push origin :OLD_BRANCH

Everybody else has to "update" the list of branches in the origin, so that they also get it deleted:

 git remote prune origin

Remote branch

To create a local branch at the status of a remote branch:

git pull
git checkout -b newlocalbranchname origin/remotebranchname

To create a branch and also set to track the remote branch:

git pull
git checkout -t origin/branch-name [-b newlocalbranch]

Submit a bugfix (with branch creation)

git checkout -b newBranchWithBugFix
git commit -m "Your comment" yourFiles
git push -u origin newBranchWithBugFix

Compare differences

To see differences between branch A and B:

git diff --name-status A..B

To see differences in a particular file between branch A and B:

git diff A B myFile

List the files that are changed between the local and the official repository

git diff origin/branch --name-only

List the files that are changed between two branches

git diff branch1 branch2  --name-only

Apply the differences from one branch into another

Let’s say that there is a file in branch2 with some differences with respect to branch 1. Then you want to take these differences and put them in branch 1. From branch 1, you must do

git diff branch1..branch2 yourFile > patchFile
git apply patchFile

If you run the git diff without file, then all changes between the two branches are dumped into the patchFile.

Tags

To create a tag:

git tag -a TAG_NAME -m "TAG MESSAGE"

You can submit to a shared server in the same way as a branch:

git push origin TAG_NAME

To delete a tag:

git tag -d TAG_NAME
git push origin :TAG_NAME

Stashing

Often, when you’ve been working on a part of your project, things end in a messy state. You want to switch branches for a while in order to work on something else. The problem is, you don’t want to do a commit of half-done work (just to be able to get back to this point later). The answer to this issue is the git stash command:

$ git stash

Now you can easily switch branches and do work elsewhere: your changes are stored on your stack. To see which stashes you’ve stored, you can use:

git stash list:

You can reapply the one you just stashed by using the command shown in the help output of the original stash command:

git stash pop

Merging

Undo a merge in the middle of it

Let’s say you are in the middle of a merging, and you regret from the changes you have already been introducing. Files that are not related to the merging conflicts are unaffected by this command.

git merge --abort

Avoid merge commits

If you want to avoid merge commits follow this link

In summary use:

git pull --rebase

or make it the default behavior in the config.

Commits

Checkout a commit by date

In case of looking for a commit by date, the repository can be moved by:

git co `git rev-list -n 1 --before="2011-06-21 13:37" master`

Check which commits have not been pushed yet

git log origin/master..master

[[Undo a commit]] == Revert the changes introduced by a commit

If you have committed and pushed some changes, you may undo them by

git revert [commitHash]

Other useful commands

git grep
  • Look for specified patterns in the tracked files in the work tree.

git blame
  • Show what revision and author last modified each line of a file.

Git-Flow

Since January-2016, we started to follow the git-flow development methodology using git.

Summarizing, there are two main branches: master and devel. New branches should be opened from devel for each new feature that will be included in the next release. Feature-branches should be merged back through Pull Requests in GitHub to allow peer-review and discussions. Master branch should always contain a released status. When we are ready for a new release, we should create a release-branch from devel and only commit bug-fixes to it. When this release-branch is merged (also through Pull Request) to master, it means a new release that should be tagged in master.

The following image illustrates very well this workflow and a very nice explanation can be found here.

Git-Flow

Gitting in Scipion

Fork I2PC/scipion

Look for the fork icon (top-right) and make a Fork on your account o institutional account. image::https://help.github.com/assets/images/help/repository/fork_button.jpg[ForkIcon]

Clone your fork

git clone git@github.com:YourUserNameHere/scipion.git --origin privatescipion

This should bring your repo to your machine with the remote name "privatescipion". Feel free to use a different name. It’s yours!

Delete all branches, except master.

You can keep them, but to avoid confusions, you might want to start with a branchless repo. Well, I guess you need to keep one: Keep master.

Add a I2PC/scipion remote

git remote add I2PC https://github.com/I2PC/scipion.git

This adds a second remote name I2PC. Again, feel free to name it your way. In order to catch the branches list from the new repo,

git pull --all

Checkout I2PC/devel branch.

Once you have 2 remotes you have to be more specific when checking out branches from a remote To checkout devel, from I2PC type:

git checkout -b devel I2PC/devel
Tip
To check the upstreams (where your local branch will push to) of your branches type:
git branch -vv

Start your branch from I2PC/devel.

Now, when you need a branch to work on something new, that branch should go to your "privatescipion" but start from, usually, I2PC/devel.

git checkout -b mynewfeature devel

now you can work locally as usual with your commits, etc.

Pushing your branch to your own repo

Whenever you want to send changes, you must send them to your remote: git push --set-upstream privatescipion mynewfeature

Sending changes back to I2PC

Let’s update your "mynewfeature" branch with possible devel changes.

git checkout devel
git pull
git checkout -
git merge devel

Resolve conflicts if any. And push the branch again to your privatescipion with: git push

Finally, just create a PR across forks using as base I2PC/devel

Other useful resources

Clone this wiki locally
You can’t perform that action at this time.
You signed in with another tab or window. Reload to refresh your session. You signed out in another tab or window. Reload to refresh your session.
Press h to open a hovercard with more details.