Authors :
- Simone Bna ([email protected])
- Eric Pascolo ([email protected])
Version : Cineca Parallel Summer School 2018
Follow the steps below to configure git on your machine.
-
0.0.1 Is git installed on your machine?
git apt install git (Deb example)
-
0.0.2 Configure username and email for your remote hub account
git config --global user.name "Name Surname" git config --global user.email "[email protected]”
-
0.0.3 Configure your favorite editor
git config --global core.editor vim
-
0.0.4 Show all git settings
git config --list
In this exercise we learn the basic git commands, how to set-up multiple remote repos and how to manage branches workflow.
-
1.1.1 Create a local empty repository
mkdir ex1_1 cd ex1_1 git init
-
1.1.2 Create a README file in the repo
touch README.md
-
1.1.3 Add a new file to the staging area
git add README.md
-
1.1.4 Commit your changes
git commit -m "commit description"
-
1.1.5 Create a directory into the repo
mkdir my_software
-
1.1.6 Try to commit "my_software", is it allowed?
git add my_software git commit -m "commit directoy"
-
1.1.7 --CHECK-- Use git status to check the repo status
git status
-
1.1.8 Create local_configuration file in "my_software"
cd my_software touch local_configuration.cfg
-
1.1.9 Add a .gitignore file to avoid to commit the "local_configuration.cfg" file
touch .gitignore echo "local_configuration.cfg" >> .gitignore git statuts -u # show untracked not ignored file git add .gitignore git commit -m"create gitignore file"
-
1.1.10 --CHECK-- if directory my_software is now commited
git ls-tree --full-tree -r master
-
1.1.11 Use git log to view the history of the repo, how many commits are there?
git log
-
1.1.12 Use git ls-files to add multiple files to the repository
cd my_software touch main.py io.py log.py git ls-files -o # show list of untrucked files git add $(git ls-files -o) # don't worry, ignored files will be not processed git commit -m "create message"
-
1.1.13 Use git tag to identify the first code version
git tag v0.1 -m "code version 0.1"
-
1.1.14 Change main.py and commit, check with git diff the difference between HEAD and the previous commit (HEAD^)
echo "print(\"Hello World\")" >> main.py git add main.py git commit -m "create Hello World software" git diff HEAD HEAD^
In this exercise we continue to work with the previous local repository.
-
1.2.1 Create a remote empty repository
-
1.2.2 Check if your local repo has remote repos linked
git remote -v
-
1.2.3 Copy the remote repo URL and link it with the local repo, call it ORIGIN
git remote add origin your_url
-
1.2.4 Sync local and ORIGIN with push command
git push origin master
-
1.2.5 --CHECK-- if syncronization is completed, can you see tag in ORIGIN?
-
1.2.6 Push the tag to ORIGIN
git push origin --tags
-
1.2.7 --CHECK-- if syncronization is really completed
-
1.2.8 Create a new remote repo for BACKUP and add it to the local repo
git remote add backup url_backup_repo
-
1.2.9 --CHECK-- if the local repo is linked with ORIGIN and BACKUP
git remote -v
-
1.2.10 Push the local repo to BACKUP
git push --tags backup master
-
1.3.1 Create DEV branch
git checkout -b dev
-
1.3.2 --CHECK-- how many branches exists in local repository
git branch
-
1.3.3 Modify io.py file and commit it
echo "print(\" I'm IO \")" >> io.py git add io.py git commit -m "change io.py"
-
1.3.4 Return to Master branch, modify main.py and commit it
git checkout master echo "print(\" I'm main \")" >> main.py git add main.py git commit -m "change main.py"
-
1.3.5 Return to dev branch, change log.py and commit it
git checkout dev echo "print(\" I'm LOG \")" >> log.py git add log.py git commit -m "change log.py"
-
1.3.6 Return to master and merge it with DEV branch
git checkout master git merge dev
-
1.3.7 Show the branches diagram with git log
git log --all --graph --decorate --oneline
-
1.3.8 Reset the last commit in order to try rebase of branches instead of merge
git reset --hard HEAD^
-
1.3.9 Use git rebase
git rebase dev
-
1.3.10 --CHECK-- use git log to see the new diagram of branches, observe the difference between rebase and merge
git log --all --graph --decorate --oneline
This exercise will be done in groups. Create a group of 3 persons (max 4) and define who is the Team Leader (TL). The other members are simply other developer (OD). In the first part of the exercise we work with only a single branch (master branch); in the second part we introduce the dev branch to simulate a real developer's workflow.
- 2.1.1 TL forks the CINECA git_course repo into the TL's remote repo.
- 2.1.2 ODs fork the TL's remote repo in their public remote repo.
- 2.1.3 TL and OD clone their remote repos locally
- 2.1.4 TL adds as REMOTES the OD's remote repos
- 2.1.5 ODs add as REMOTES the TL's remote repo
- 2.1.6 --CHECK-- if history is syncronized on all repos
- 2.1.7 Each member changes a different file
- 2.1.8 Each member pushes and pulls to resync all repos
- 2.1.9 --CHECK-- if all repos are syncronized
- 2.1.10 Tl and ODs change the same line of the same file on their local repos
- 2.1.11 TL commits and pushes his change on his remote repo.
- 2.1.12 ODs pull from TL's remote repo and manage the conflict
- 2.1.13 --CHECK-- if all repos are syncronized
- 2.1.14 ODs change the same line of the same file, commit and push on their remote repos
- 2.1.15 TL pulls from ODs' remote repos, chooses the correct change and manages the conflict
- 2.1.16 --CHECK-- if all repos are syncronized
- 2.2.1 TL creates the branch DEV on the local repo and pushes it on his remote repo. ATTENTION : TL is the only developer that can change the DEV branch
- 2.2.2 ODs pull TL's remote repo and push the new branch on their remote repos.
- 2.2.3 --CHECK-- if all repos have the DEV brach
- 2.2.4 ODs create a new branch on their local repos, the branch name has to be unique and has to contain the feature implemented in this branch.
- 2.2.5 ODs code the feature in the new branch, ODs commit the changes and push on their remote repos.
- 2.2.6 TL pulls the new branches from ODs remote repos, TL rebases the two branches on DEV, TL pushes the changes on his remote repo
- 2.2.7 ODs pull the rebased DEV branch on their local repo and sync with their remote repos
- 2.2.8 --CHECK-- if all repos have the branch DEV rebased with the OD changes