In this post we will see how we can follow a git workflow and collaborate project development.
Aim
Build a website for Imperial College of Engineering (IEC). (from 3 Idiots ;)
Team
unckle-bob [role = project owner, maintainer]
sibtainmasih [role = contributor]
+ many others (including you :)
Steps
1. unckle-bob creates a new repository on github.
Repository name = ice-website
Description = Dummy website project for Imperial College of Engineering from 3 Idiots
Select initialize this repository with README
2. sibtainmasih forks this repository.
Search for ice-website, go to repository's page and click on fork. Now he is having a fork under his name.
3. sibtainmasih clone's his repository
$ git clone https://github.com/sibtainmasih/ice-website.git
Cloning into 'ice-website'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
Checking connectivity... done.
Then he sets config for user.name and user.email
4. sibtainmasih prepares skeleton file structure, commits changes and pushes them to his repo.
$ git log --oneline --decorate --all
77bfa0c (HEAD -> master) Add home file
59c9189 Add index file
a9780bf (origin/master, origin/HEAD) Initial commit
$ git push
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 647 bytes | 0 bytes/s, done.
Total 6 (delta 1), reused 0 (delta 0)
To https://github.com/sibtainmasih/ice-website.git
a9780bf..77bfa0c master -> master
5. unckle-bob takes responsibility of adding courses.html page.
He clones his repository, commits a course.html file and pushes to unckle-bob/ice-website.
sibtainmasih will see not see these changes in his forked repository.
6. Meanwhile sibtainmasih adds few more commits and then creates a Pull Request (PR).
He clicks on Create pull request. It takes to comparing changes page which warns that can't automatically merge due to conflicts.
He continues, clicks on Create Pull Request, provides title, details and completes that. It ends in a warning suggesting branch has conflicts which must be resolved by someone who has write access i.e. unckle-bob
Hold On! As a contributor it is your responsibility to resolve the conflict(s) before making a pull request. Therefore sibtainmasih does the following.
A) Configure a remote upstream to project's central repository -
$ git remote add upstream https://github.com/unckle-bob/ice-website.git
B) Fetch upstream -
$ git fetch upstream
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 4), reused 12 (delta 4), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/unckle-bob/ice-website
* [new branch] master -> upstream/master
C) Check commit history -
D) Merge local master with upstream/master -
$ git merge upstream/master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
Check which file(s) have conflicts,
$ git status -s
UU README.md
A courses.html
A m_c_a.html
resolve that and do $ git commit
Finally see merged commit history
E) Push changes
$ git push
F) And then create a PR. This will now show a green able to merge text -.
7. unckle-bob reviews the PR and merges in main project repository.
This will show that there is no conflict and the pull request can be merged.
unckle-bob clicks on Merge pull request & the history is properly interlaced.
Aim
Build a website for Imperial College of Engineering (IEC). (from 3 Idiots ;)
Team
unckle-bob [role = project owner, maintainer]
sibtainmasih [role = contributor]
+ many others (including you :)
Steps
1. unckle-bob creates a new repository on github.
Repository name = ice-website
Description = Dummy website project for Imperial College of Engineering from 3 Idiots
Select initialize this repository with README
2. sibtainmasih forks this repository.
Search for ice-website, go to repository's page and click on fork. Now he is having a fork under his name.
3. sibtainmasih clone's his repository
$ git clone https://github.com/sibtainmasih/ice-website.git
Cloning into 'ice-website'...
remote: Counting objects: 4, done.
remote: Compressing objects: 100% (4/4), done.
remote: Total 4 (delta 0), reused 4 (delta 0), pack-reused 0
Unpacking objects: 100% (4/4), done.
Checking connectivity... done.
Then he sets config for user.name and user.email
4. sibtainmasih prepares skeleton file structure, commits changes and pushes them to his repo.
$ git log --oneline --decorate --all
77bfa0c (HEAD -> master) Add home file
59c9189 Add index file
a9780bf (origin/master, origin/HEAD) Initial commit
$ git push
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (5/5), done.
Writing objects: 100% (6/6), 647 bytes | 0 bytes/s, done.
Total 6 (delta 1), reused 0 (delta 0)
To https://github.com/sibtainmasih/ice-website.git
a9780bf..77bfa0c master -> master
5. unckle-bob takes responsibility of adding courses.html page.
He clones his repository, commits a course.html file and pushes to unckle-bob/ice-website.
sibtainmasih will see not see these changes in his forked repository.
6. Meanwhile sibtainmasih adds few more commits and then creates a Pull Request (PR).
He clicks on Create pull request. It takes to comparing changes page which warns that can't automatically merge due to conflicts.
He continues, clicks on Create Pull Request, provides title, details and completes that. It ends in a warning suggesting branch has conflicts which must be resolved by someone who has write access i.e. unckle-bob
Hold On! As a contributor it is your responsibility to resolve the conflict(s) before making a pull request. Therefore sibtainmasih does the following.
A) Configure a remote upstream to project's central repository -
$ git remote add upstream https://github.com/unckle-bob/ice-website.git
B) Fetch upstream -
$ git fetch upstream
remote: Counting objects: 12, done.
remote: Compressing objects: 100% (8/8), done.
remote: Total 12 (delta 4), reused 12 (delta 4), pack-reused 0
Unpacking objects: 100% (12/12), done.
From https://github.com/unckle-bob/ice-website
* [new branch] master -> upstream/master
C) Check commit history -
D) Merge local master with upstream/master -
$ git merge upstream/master
Auto-merging README.md
CONFLICT (content): Merge conflict in README.md
Automatic merge failed; fix conflicts and then commit the result.
Check which file(s) have conflicts,
$ git status -s
UU README.md
A courses.html
A m_c_a.html
resolve that and do $ git commit
Finally see merged commit history
E) Push changes
$ git push
F) And then create a PR. This will now show a green able to merge text -.
7. unckle-bob reviews the PR and merges in main project repository.
This will show that there is no conflict and the pull request can be merged.
unckle-bob clicks on Merge pull request & the history is properly interlaced.
Remember - There is not autosync. You need to setup upstream and merge/resolve conflicts to make your PRs readily merge-able.
That's it ! This is how git helps to do development in collaboration with other team members.