Comp:git

From Theochem
Jump to navigationJump to search

To share your software you can use our gitlab server. Extensive documentation for git is available online, see e.g. git tutorial.

Here are instructions to set up a git repository on disk. This is not only useful to share your software or develop software together, it also lets you keep track of versions of you scripts or programs, and synchronize projects between, e.g., a laptop and a desktop computer.

Create .gitconfig

In your home directory create a file with the name .gitconfig with the content:

 [user]
          name  = Firstname M. Lastname
          email = username@science.ru.nl

This is all that is needed, but more settings can be added:

 [init]
          defaultBranch = main            # change the default branch name "master" to "main"
 [color]
          ui    = auto
 [core]
          pager = more                   # or less
 [diff]
          tool  = vimdiff                 # if you use vi or vim
 [alias]
          log1  = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold green)(%ar)%C(reset) %C(white)%s%C(reset) %C(dim white)- %an%C(reset)%C(bold yellow)%d%C(reset)' --all
          log2  = log --graph --abbrev-commit --decorate --format=format:'%C(bold blue)%h%C(reset) - %C(bold cyan)%aD%C(reset) %C(bold green)(%ar)%C(reset)%C(bold yellow)%d%C(reset)%n          %C(white)%s%C(reset) %C(dim white)- %an%C(reset)' --all

Start a new project

Here we give an example of creating a git repository with a single bash script. First create a directory with the script:

  mkdir hworld
  cd hworld
  

Create a small bash script with the name hw.sh, e.g.:

  #!/bin/bash
  echo "hello world"
  
  chmod +x hw.sh
  ./hw.sh              # see if it works

Next, initialize git

  git init             # this creates a subdirectory .git where git keeps info
  git add hw.sh        # we want to use git to keep track of this file, it will be added to the "staging area"
  git commit -m "feat: initial commit" hw.sh

With the git commit command, git will make a snapshot of the current version of the files that are under its control, i.e., files that have been added with the git add command and have been committed.

  You can get information on git files in a directory with:
  git status           # will show, e.g., when files have been "added", but not "committed"
  git log2             # this shows the history
  git ls-files         # this lists the files that are under git control
  git branch           # if you created the above .gitconfig file the branch will be "main"

Setup a "bare git repository"

To be able to work on this project on another computer it is convenient to set up a "bare git repository":

  cd ~                  # go to your home directory
  mkdir repos           # create a directory for "bare" git repositories
  cd repos
  git init --bare hworld      # creates directory "hworld" with git repo

Now go back to the hworld project to upload the files to the "bare" repository:

  cd ~/hworld
  git remote add origin lilo.science.ru.nl:/home/<your username>/repos/
  git remote -v               # to see the name you just entered

You can change the "remote" repository with

  git remote set-url origin lilo.science.ru.nl:/home/pietje/repos/hworld

If the remote repo is setup properly, you can now copy your git files to it:

  git push --set-upstream origin main               # assuming you use "main" as branch name

Possible workflow

You can now create new files and modify files:

  vi hw.sh                 # modify the script and save it
  git status               # this will show a file under git control has changed
  git diff                 # this will show what has changed
  git difftool hw.sh       # if you set "tool = vimdiff" in ~/.gitconfig you can see the changes in vi
                           # you may have to learn some new vi commands to take full advantage of this
  git add hw.sh            # if you are happy with the change
  git commit               # this will start vi and let you write a commit message, e.g.
                           # fix: corrected a typo

You can repeat this cycle. There are git commands to "undo" a git commit. At the end of the day, after all changes have been committed, you can "push" all files under git control to the bare repository:

  git push

To work on this project on a different computer, you "clone" the project. For example, switch to your laptop

  # make sure to use ssh keys, so you do not need to enter a password to access the git repo
  git clone lilo.science.ru.nl:/home/username/repos/hworld
  cd hworld
  # continue working on hw.sh, create new files, etc.
  git add hw.sh   
  git commit               # commit the new stuff
  git push                 # the "remote" repository will be updated

To continue working on this project on your desktop:

  cd ~/hworld
  git pull

If you had uncommitted changes in files under git control you may get an error message about a "merge conflict". You will need to read about resolving get merge conflict in one of the many online tutorials.

Each "commit" is assigned a "hash" - you see those hashes with git log or git log2, they look like something this: 0869ae0

  git checkout 0869ae0           # find the commit hash with "git log"
  
  git checkout main              # go back to most recent version

At some point you may find it useful to get a deeper understanding of how git actually works, I found this youtube video How to be a git expert useful.