Differences between revisions 26 and 32 (spanning 6 versions)
Revision 26 as of 2016-12-08 13:18:45
Size: 2935
Editor: ZekeKaufman
Comment:
Revision 32 as of 2017-02-06 19:55:11
Size: 5770
Editor: ZekeKaufman
Comment:
Deletions are marked like this. Additions are marked like this.
Line 11: Line 11:
'''''Very first thing to do.'''''
Add this line to your {{{.cshrc}}} or {{{.bashrc}}} file.
{{{
## bash
export PATH=/usr/pubsw/packages/git-annex/current/bin:$PATH

## csh
setenv PATH "/usr/pubsw/packages/git-annex/current/bin":"$PATH"
}}}
Line 17: Line 27:
For additional examples of git specifics setting (e.g. default editor, color settings), see the following page: https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration
For additional git specifics setting:

[[
https://git-scm.com/book/en/v2/Customizing-Git-Git-Configuration|Customizing-Git]]
Line 20: Line 33:
Line 21: Line 35:
Line 22: Line 37:
## CVS
$> cvs checkout dev

## git
Line 25: Line 44:
Or check out a specific branch:
Line 26: Line 46:
{{{
## CVS
$> cvs checkout -r stable6 dev
Line 27: Line 50:
Checkout the stable branch:
{{{

$> git clone /space/freesurfer/repo/freesurfer
$> cd freesurfer
$> git checkout stable6
## git
$> git clone -b stable6 /space/freesurfer/repo/freesurfer
}}}
Line 33: Line 54:
or, Additional information and examples:
Line 35: Line 56:
$> git clone -b stable6 /space/freesurfer/repo/freesurfer <optional_directory_name>
}}}
[[https://git-scm.com/book/en/v2/Git-Basics-Getting-a-Git-Repository#Cloning-an-Existing-Repository|Cloning-an-Existing-Repository]]

[[https://www.atlassian.com/git/tutorials/setting-up-a-repository/git-clone|Cloning-an-Existing-Repository]]
Line 40: Line 62:
{{attachment:git-image-50.jpeg}}
Line 41: Line 64:
Commit a modified source code file:
||'''cvs'''||{{{cvs commit -m "Added new capabilities." <file_name>}}}||
||<|2>'''git'''||{{{git commit -m "Added new capabilities." <file_name>}}}||
||{{{git push}}}||
=== Updating your code ===
Line 46: Line 66:
Modify and commit a data file:
||'''cvs'''||{{{cvs commit <file_name>}}}||
||<|5>'''git'''||{{{git annex unlock <file_name>}}}||
||{{{git annex add <file_name>}}}||
||{{{git commit <file_name>}}}||
||{{{git push}}}||
In CVS, when we want the most up-to-date version of the code, we issue a '''{{{cvs update}}}''' command. This will update our files to the latest version, restore any missing files, and warn us of any conflicts. The nearest equivalent in git is the '''{{{git pull}}}''' command. This will update our local repository and update all the necessary files to the most recent version. ''It is good practice to always issue a '''{{{git pull}}}''' command before starting to work on any files.''

{{{
$> git pull
}}}

One major difference between '''{{{cvs update}}}''' and '''{{{git pull}}}''' command is that '''{{{git pull}}}''' will not restore any missing files (i.e. files that we deleted locally). In git, if we want to restore locally deleted files, we need to take the additional step of issuing a '''{{{git checkout}}}''' command. For example:

{{{
$> rm README
$> git pull
$> git status

    deleted: README.txt

$> git checkout README.txt
}}}

Additional information and examples:

[[https://www.atlassian.com/git/tutorials/syncing/git-pull|git-pull]]

=== Commit a change ===

Git and CVS can be virtually identical when it comes to committing changes. The primary difference is that git requires the additional step of pushing to the central repository. This means issuing the '''{{{git push}}}''' command after committing all your changes:

{{{
$> git commit -m "Fixed a bug." <file_name>
$> git commit -m "More debug information" <file_name>
$> git commit -m "Implemented a new feature." <file_name>
$> git push
}}}

''Always issue a '''{{{git push}}}''' command after committing all your changes''

Additional information and examples:

[[https://www.atlassian.com/git/tutorials/saving-changes|Saving changes]]

[[https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository|Recording changes to the repository]]

=== Adding/Removing a file ===

Adding and removing files in CVS and git is also a very similar operation. Use the '''{{{git rm}}}''' and '''{{{git add}}}''' command in the same way you would use the '''{{{cvs rm}}}''' and '''{{{cvs add}}}''' command. Just remember to commit the change, followed by a '''{{{git push}}}'''. For example,

Adding a file:
{{{
$> git add <file_name>
$> git commit -m "initial add of new file." <file_name>
$> git push
}}}

Removing a file:
{{{
$> git rm <file_name>
$> git commit -m "Removing obsolete file." <file_name>
$> git push
}}}

Additional information and examples:

[[https://www.atlassian.com/git/tutorials/saving-changes/git-add|git-add]]

[[https://git-scm.com/book/en/v2/Git-Basics-Recording-Changes-to-the-Repository#Tracking-New-Files|Tracking-New-Files]]

=== Start working here ===

This page is provided for FreeSurfer developers to assist in the CVS -> git transition.

This page is not meant to be a comprehensive guide for using git. Git is a feature loaded version control system which at times can be a bit of a hurdle to learn. The following site However, when used in its simplest form it is very similar to most all other version control systems, including CVS. Below are many of the basic CVS commands used by FreeSurfer developers the git equivalent of that command. The Atlassian and git-scm are great resources for those who want to dig deeper and and learn more about git and its features.

Initial Git Setup

Very first thing to do. Add this line to your .cshrc or .bashrc file.

## bash
export PATH=/usr/pubsw/packages/git-annex/current/bin:$PATH

## csh
setenv PATH "/usr/pubsw/packages/git-annex/current/bin":"$PATH"

When we start out using git we want to set a few of our configuration settings. We only need to do this one time:

$> cd ~
$> git config --global user.name "Zeke Kaufman"
$> git config --global user.email zkaufman@nmr.mgh.harvard.edu

For additional git specifics setting:

Customizing-Git

Checkout out the main branch

When working with CVS, we would checkout out the FreeSurfer repository using the cvs checkout dev command. In git we 'clone' repositories. This gives us a local version of the repository which we can work with:

## CVS 
$> cvs checkout dev

## git
$> git clone /space/freesurfer/repo/freesurfer

Or check out a specific branch:

## CVS
$> cvs checkout -r stable6 dev

## git
$> git clone -b stable6 /space/freesurfer/repo/freesurfer

Additional information and examples:

Cloning-an-Existing-Repository

Cloning-an-Existing-Repository

Daily Workflow

Updating your code

In CVS, when we want the most up-to-date version of the code, we issue a cvs update command. This will update our files to the latest version, restore any missing files, and warn us of any conflicts. The nearest equivalent in git is the git pull command. This will update our local repository and update all the necessary files to the most recent version. It is good practice to always issue a git pull command before starting to work on any files.

$> git pull

One major difference between cvs update and git pull command is that git pull will not restore any missing files (i.e. files that we deleted locally). In git, if we want to restore locally deleted files, we need to take the additional step of issuing a git checkout command. For example:

$> rm README
$> git pull
$> git status

    deleted:    README.txt

$> git checkout README.txt

Additional information and examples:

git-pull

Commit a change

Git and CVS can be virtually identical when it comes to committing changes. The primary difference is that git requires the additional step of pushing to the central repository. This means issuing the git push command after committing all your changes:

$> git commit -m "Fixed a bug." <file_name>
$> git commit -m "More debug information" <file_name> 
$> git commit -m "Implemented a new feature." <file_name> 
$> git push

Always issue a git push command after committing all your changes

Additional information and examples:

Saving changes

Recording changes to the repository

Adding/Removing a file

Adding and removing files in CVS and git is also a very similar operation. Use the git rm and git add command in the same way you would use the cvs rm and cvs add command. Just remember to commit the change, followed by a git push. For example,

Adding a file:

$> git add <file_name>
$> git commit -m "initial add of new file." <file_name>
$> git push

Removing a file:

$> git rm <file_name>
$> git commit -m "Removing obsolete file." <file_name>
$> git push

Additional information and examples:

git-add

Tracking-New-Files

Start working here

git annex copy --to origin <file_name>

Add a data file:

cvs

cvs add <file_name>

cvs commit <file_name>

git

git annex add <file_name>

git commit <file_name>

git push

git annex copy --to origin <file_name>

Remove data file:

cvs

rm <file_name>

cvs rm <file_name>

cvs commit -m "Removing <file_name>" <file_name>

git

git rm <file_name>

git commit -m "Removing <file_name>" <file_name>

Undo 1 commit (before push):

git

git reset --soft HEAD~1

Undo 2 commits:

git

git reset --soft HEAD~2