My git rebase workflow for team

Here are the branches for most complicated scenario where multiple users work concurrently on public feature-XX branch:

1) long running public 'master' contains production code and each commit is a new release
2) long running public 'develop' containing work that will target for the upcoming release
3) public 'feature-XX' branch for work that a couple of developers work on to be included to develop branch at some point
4) local feature-XX tracking branch knows where its corresponding remote origin/feature-XX is, you can use git fetch/pull or push command without the need to specify every time origin and feature-XX)
5) local my-feature-XX branch for local commits with history commits modifications via rebase

Least complicated scenario (assuming that local master is a tracking branch of origin/master and my-feature -XX local branch will be eventually merged onto master). Here are the branches for such scenario:

 1) master
 2) my-feature-XX

Here we will talk about the first most complicated case with the rules of thumbs:

  1. you should newer work directly on master (nor develop branch) so that fetch or pull will not cause any conflicts
  2. work most of the time on your local my-feature-XX branch, systematically fetch changes from upstream origin/my-feature and rebase frequently my-feature-XX onto latest origin/my-feature or alternatively pull feature-XX tracking branch and rebase my-feature-XX onto that feature-XX
  3. rebased local my-feature-XX in the next step can be merged to tracking feature-XX branch
  4. for short-lived branch changes such as my-feature-XX use fast-forward merge or alternatively ‘git merge –squash my-feature-XX’ (both causing commit history graph to be visualized as one line)
  5. for long-lived branches like feature-XX and develop use no fast-forward option for visibility purposes (to create an explicit merge commit joining two separate branches in history graph)
  6. as soon as merged changes in feature-XX branch are pushed to origin/feature-XX then you should not re-write feature-XX history via rebase what can cause breakage for other users
  7. if feature-XX is completed and ready to be integrated with public develop branch then if you want to rewrite history you need to create a copy of feature-XX, rebase the copy  interactively and merge that copy to develop branch
  8. in the last step after you rebased your changes onto public branch e.g. develop, you can create PULL REQUEST to send your changes for review INTEGRATION MANAGER. Such coordinator (only one person for authoritative repo) will pull changes from your public branch, review them and will merge them to the destination public branch.

Note that workflow is different from purely merge workflow using git commit, git pull and git push.

Git merge vs rebase

Note that every time you want to bring upstream changes to your local branch and there are conflicts then you will need to create an additional merge commit when ‘git checkout my-feature-XX && git merge origin/feature-XX’, resolve conflict and required to ‘git add && git commit -m “merged changed from master”‘. On the other hand, if you do ‘git rebase origin/feature-XX’ there will not be such additional commit (after conflict resolution do ‘git add && git –rebase continue’). So in short rebasing avoid keeps history clean avoids merge commits. However, do not rebase after you pushed to public repo. If you push your code to public branch make sure no-body pulls from that branch otherwise your subsequent rebase followed by push (-f as forced) would cause breakage on others side.

Note alternatively, instead of introducing tracking feature-XX branch and my-feature-XX you could create only tracking  feature-XX, develop there and use ‘pull –rebase’ when getting upstream data. Then push the data.

Here are the command for the git rebase workflow for teams following principle: rebase local branch changes and merge these rebased local commit changes to public branch:

Commands:

rm -rf git-rebase-workflow-for-team
mkdir git-rebase-workflow-for-team
cd git-rebase-workflow-for-team
git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git repo-initial-setup
cd repo-initial-setup
echo "master: initial create project structure" > file.txt
git add file.txt
git commit -m "master: initial create project structure" file.txt
git push origin master # push changes to remote repo and create origin/master and local master
git checkout -b develop # create local develop branch
git push origin develop
git checkout -b feature-XX
git push origin feature-XX
cd ..
#u1
git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git u1
cd u1
git checkout --track origin/feature-XX #create local feature-XX branch tracking remote origin/feature-XX, git pull and fetch do not require specifying feature-XX
git checkout -b my-feature-XX
echo "feature-XX: u1 impl" >> file.txt
git commit -am "feature-XX: u1 impl XX" #always commit before rebase
git fetch origin #update origin/feature-XX
git rebase origin/feature-XX #rebase is great for local branches to clean up history and put our work on top of lastest public version, resolve conflicts if any, here none
#perform local peer review
#u2
cd ..
git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git u2
cd u2
git checkout --track origin/feature-XX
git checkout -b my-feature-XX
echo "feature-XX: u2 impl" >> file.txt
git commit -am "feature-XX: u2 impl XX"
echo "feature-XX: u2 fix for impl" >> file.txt
git commit -am "feature-XX: u2 fix for impl XX" 
git checkout feature-XX
git pull # no conflicts as no local changes in feature-XX
git checkout my-feature-XX
git rebase feature-XX #alternative to git rebase origin/feature-XX but requiring first to pull in feature-XX
git checkout feature-XX
git merge --squash my-feature-XX # alternative to squash changes as a diff and update index instead of git rebase with squash
git commit -am "feature-XX: u2 finished impl XX" #required to commit changes from merge --squash
git push # not needed to add origin feature-XX for tracking branches
cd ..
#u1
cd ../u1
git checkout my-feature-XX
echo "feature-XX: u1 remove swearwords after review" >> file.txt
git commit -am "feature-XX: u1 remove swearwords XX"
echo "feature-XX: u1 correct identation after review" >> file.txt
git commit -am "feature-XX: u1 correct identation XX"
git fetch origin # load changes from remote to orgin/feature-XX
git rebase origin/feature-XX #first rebase onto public changes then
git rebase -i origin/feature-XX #or alternatively
#git rebase -i HEAD~2 # squash corrections into one correction commit after review, update first message to replace pick with squash for indentation commit; update second message to include only 'feature-XX: u1 correct after code review'
git checkout feature-XX
git pull #there should not be any conflicts as development was in my-feature-XX
git merge my-feature-XX # use fast-forward for short-lived feature branches
git push
#create pull request to merge feature-XX to develop (using no-ff)
# or AS INTEGRATION MANAGER merge manually using --no-ff
git checkout develop
git merge --no-ff feature-XX #accept commit message without changes
git push
git log --decorate --abbrev-commit
git 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
git branch -d my-feature-XX # delete local my-feature-XX branch
git push origin :feature-XX # delete remote feature-XX branch
Results:
$ mkdir git-rebase-workflow-for-team
$ cd git-rebase-workflow-for-team
$ git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git repo-initial-setup
Cloning into 'repo-initial-setup'...
warning: You appear to have cloned an empty repository.
Checking connectivity... done.
$ cd repo-initial-setup/
$ echo "master: initial create project structure" > file.txt
$ git add file.txt
$ git commit -m "master: initial create project structure" file.txt
[master (root-commit) bb87fa5] master: initial create project structure
 1 file changed, 1 insertion(+)
 create mode 100644 file.txt
$ git push origin master # push changes to remote repo and create origin/master and local master
Counting objects: 3, done.
Writing objects: 100% (3/3), 279 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 * [new branch] master -> master
$ git branch -a
* master
 remotes/origin/master
$ git checkout -b develop # create local develop branch
Switched to a new branch 'develop'
$ git branch -a
* develop
 master
 remotes/origin/master
$ git push origin develop
Total 0 (delta 0), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 * [new branch] develop -> develop
$ git branch -a
* develop
 master
 remotes/origin/develop
 remotes/origin/master
$ git checkout -b feature-XX
Switched to a new branch 'feature-XX'
$ git push origin feature-XX
Total 0 (delta 0), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 * [new branch] feature-XX -> feature-XX
$ git branch -a
 develop
* feature-XX
 master
 remotes/origin/develop
 remotes/origin/feature-XX
 remotes/origin/master
$cd ..
#u1
$ git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git u1
Cloning into 'u1'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
Checking connectivity... done.
$ cd u1
$ git branch -a
* master
 remotes/origin/HEAD -> origin/master
 remotes/origin/develop
 remotes/origin/feature-XX
 remotes/origin/master
$ git checkout --track origin/feature-XX #create local feature-XX branch tracking remote origin/feature-XX, git pull and fetch do not require specifying feature-XX
Branch feature-XX set up to track remote branch feature-XX from origin.
Switched to a new branch 'feature-XX'
SG0212148@H8470305328627 /cygdrive/c/dev/git-rebase-workflow-for-team/repo-initial-setup/u1
$ git branch -a
* feature-XX
 master
 remotes/origin/HEAD -> origin/master
 remotes/origin/develop
 remotes/origin/feature-XX
 remotes/origin/master
$ git checkout -b my-feature-XX
Switched to a new branch 'my-feature-XX'
$ git branch -a
 feature-XX
 master
* my-feature-XX
 remotes/origin/HEAD -> origin/master
 remotes/origin/develop
 remotes/origin/feature-XX
 remotes/origin/master
$ echo "feature-XX: u1 impl" >> file.txt
$ git commit -am "feature-XX: u1 impl XX" #always commit before rebase
[my-feature-XX 751b4b3] feature-XX: u1 impl XX
 1 file changed, 1 insertion(+)
$ git fetch origin #update origin/feature-XX
$ git rebase origin/feature-XX #always rebase onto lastest public version, resolve conflicts if any, here none
Current branch my-feature-XX is up to date.
$cd ..
#u2
$ git clone https://github.com/bmwieczorek/git-rebase-workflow-for-team.git u2
Cloning into 'u2'...
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
Checking connectivity... done.
$ cd u2/
$ git checkout --track origin/feature-XX
Branch feature-XX set up to track remote branch feature-XX from origin.
Switched to a new branch 'feature-XX'
$ git checkout -b my-feature-XX
Switched to a new branch 'my-feature-XX'
$ echo "feature-XX: u2 impl" >> file.txt
$ git commit -am "feature-XX: u2 impl XX"
[my-feature-XX 26fe171] feature-XX: u2 impl XX
 1 file changed, 1 insertion(+)
$ echo "feature-XX: u2 fix for impl" >> file.txt
$ git commit -am "feature-XX: u2 fix for impl XX"
[my-feature-XX d5543da] feature-XX: u2 fix for impl XX
 1 file changed, 1 insertion(+)
$ git checkout feature-XX
Switched to branch 'feature-XX'
Your branch is up-to-date with 'origin/feature-XX'.
$ git pull # no conflicts as no local changes in feature-XX
Already up-to-date.
$ git checkout my-feature-XX
Switched to branch 'my-feature-XX'
$ git rebase feature-XX
Current branch my-feature-XX is up to date.
$ git checkout feature-XX
Switched to branch 'feature-XX'
Your branch is up-to-date with 'origin/feature-XX'.
$ git merge --squash my-feature-XX # squash changes as a diff and update index
Updating bb87fa5..d5543da
Fast-forward
Squash commit -- not updating HEAD
 file.txt | 2 ++
 1 file changed, 2 insertions(+)
$ git status
On branch feature-XX
Your branch is up-to-date with 'origin/feature-XX'.
Changes to be committed:
 (use "git reset HEAD <file>..." to unstage)
 modified: file.txt
$ git commit -am "feature-XX: u2 finished impl XX"
[feature-XX 97fc417] feature-XX: u2 finished impl XX
 1 file changed, 2 insertions(+)
$ git log --decorate --abbrev-commit
commit 97fc417 (HEAD -> feature-XX)
Author: Bartosz Wieczorek <bmwieczorek@gmail.com>
Date: Tue Feb 23 22:29:31 2016 +0100
 feature-XX: u2 finished impl XX
commit bb87fa5 (origin/master, origin/feature-XX, origin/develop, origin/HEAD, master)
Date: Tue Feb 23 22:06:50 2016 +0100
 master: initial create project structure
$ git 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
* 97fc417 - Tue, 23 Feb 2016 22:29:31 +0100 (21 seconds ago) (HEAD -> feature-XX)
| feature-XX: u2 finished impl XX - Bartosz Wieczorek
| * d5543da - Tue, 23 Feb 2016 22:28:34 +0100 (78 seconds ago) (my-feature-XX)
| | feature-XX: u2 fix for impl XX - Bartosz Wieczorek
| * 26fe171 - Tue, 23 Feb 2016 22:28:27 +0100 (85 seconds ago)
|/ feature-XX: u2 impl XX - Bartosz Wieczorek
* bb87fa5 - Tue, 23 Feb 2016 22:06:50 +0100 (23 minutes ago) (origin/master, origin/feature-XX, origin/develop, origin/HEAD, master)
 master: initial create project structure - Bartosz Wieczorek
$ git push # not needed to add origin feature-XX for tracking branches
Counting objects: 3, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 332 bytes | 0 bytes/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 bb87fa5..97fc417 feature-XX -> feature-XX
$cd ..
#u1
$ cd u1/
$ git checkout my-feature-XX
Already on 'my-feature-XX'
$ echo "feature-XX: u1 remove swearwords after review" >> file.txt
$ git commit -am "feature-XX: u1 remove swearwords XX"
[my-feature-XX e0f2582] feature-XX: u1 remove swearwords XX
 1 file changed, 1 insertion(+)
$ echo "feature-XX: u1 correct identation after review" >> file.txt
$ git commit -am "feature-XX: u1 correct identation XX"
[my-feature-XX 36cc745] feature-XX: u1 correct identation XX
 1 file changed, 1 insertion(+)
$ git fetch origin # load changes from remote to orgin/feature-XX
remote: Counting objects: 3, done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/bmwieczorek/git-rebase-workflow-for-team
 bb87fa5..97fc417 feature-XX -> origin/feature-XX
$ git rebase origin/feature-XX #first rebase onto public changes then
First, rewinding head to replay your work on top of it...
Applying: feature-XX: u1 impl XX
Using index info to reconstruct a base tree...
M file.txt
Falling back to patching base and 3-way merge...
Auto-merging file.txt
CONFLICT (content): Merge conflict in file.txt
error: Failed to merge in the changes.
Patch failed at 0001 feature-XX: u1 impl XX
The copy of the patch that failed is found in: .git/rebase-apply/patch
When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
### 1ST MESSAGE ###
pick 9847bee feature-XX: u1 remove swearwords XX
pick 46cd035 feature-XX: u1 correct identation XX
# Rebase be6f577..46cd035 onto be6f577 (2 command(s))
-->
pick 9847bee feature-XX: u1 remove swearwords XX
squash 46cd035 feature-XX: u1 correct identation XX
### 1ST MESSAGE ###
# This is a combination of 2 commits.
# The first commit's message is:
feature-XX: u1 remove swearwords XX
# This is the 2nd commit message:
feature-XX: u1 correct identation XX
# interactive rebase in progress; onto be6f577
# Last commands done (2 commands done):
# pick 9847bee feature-XX: u1 remove swearwords XX
# squash 46cd035 feature-XX: u1 correct identation XX
# You are currently editing a commit while rebasing branch 'my-feature-XX' on 'be6f577'.
--> feature-XX: u1 correct after code review
$ cat file.txt
master: initial create project structure
<<<<<<< 97fc41777dcba3c342a6d9a932790c20b6c7fe36
feature-XX: u2 impl
feature-XX: u2 fix for impl
||||||| merged common ancestors
=======
feature-XX: u1 impl
>>>>>>> feature-XX: u1 impl XX
$ vim file.txt
$ cat file.txt
master: initial create project structure
feature-XX: u2 impl
feature-XX: u2 fix for impl
feature-XX: u1 impl
$ git add file.txt
$ git rebase --continue
Applying: feature-XX: u1 impl XX
Applying: feature-XX: u1 remove swearwords XX
Using index info to reconstruct a base tree...
M file.txt
Falling back to patching base and 3-way merge...
Auto-merging file.txt
Applying: feature-XX: u1 correct identation XX
Using index info to reconstruct a base tree...
M file.txt
Falling back to patching base and 3-way merge...
Auto-merging file.txt
$ cat file.txt
master: initial create project structure
feature-XX: u2 impl
feature-XX: u2 fix for impl
feature-XX: u1 impl
feature-XX: u1 remove swearwords after review
feature-XX: u1 correct identation after review
$ git log --decorate --abbrev-commit
commit 46cd035 (HEAD -> my-feature-XX)
Date: Tue Feb 23 22:34:12 2016 +0100
 feature-XX: u1 correct identation XX
commit 9847bee
Date: Tue Feb 23 22:34:04 2016 +0100
 feature-XX: u1 remove swearwords XX
commit be6f577
Date: Tue Feb 23 22:23:23 2016 +0100
 feature-XX: u1 impl XX
commit 97fc417 (origin/feature-XX)
Date: Tue Feb 23 22:29:31 2016 +0100
 feature-XX: u2 finished impl XX
commit bb87fa5 (origin/master, origin/develop, origin/HEAD, master, feature-XX)
Date: Tue Feb 23 22:06:50 2016 +0100
 master: initial create project structure
$ git 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
* 46cd035 - Tue, 23 Feb 2016 22:34:12 +0100 (12 minutes ago) (HEAD -> my-feature-XX)
| feature-XX: u1 correct identation XX - Bartosz Wieczorek
* 9847bee - Tue, 23 Feb 2016 22:34:04 +0100 (12 minutes ago)
| feature-XX: u1 remove swearwords XX - Bartosz Wieczorek
* be6f577 - Tue, 23 Feb 2016 22:23:23 +0100 (22 minutes ago)
| feature-XX: u1 impl XX - Bartosz Wieczorek
* 97fc417 - Tue, 23 Feb 2016 22:29:31 +0100 (16 minutes ago) (origin/feature-XX)
| feature-XX: u2 finished impl XX - Bartosz Wieczorek
* bb87fa5 - Tue, 23 Feb 2016 22:06:50 +0100 (39 minutes ago) (origin/master, origin/develop, origin/HEAD, master, feature-XX)
 master: initial create project structure - Bartosz Wieczorek
$ git rebase -i HEAD~2 # squash corrections into one correction commit after review
[detached HEAD 4e64156] feature-XX: u1 correct after code review
 Date: Tue Feb 23 22:34:04 2016 +0100
 1 file changed, 2 insertions(+)
Successfully rebased and updated refs/heads/my-feature-XX.
$ git log --decorate --abbrev-commit
commit 4e64156 (HEAD -> my-feature-XX)
Date: Tue Feb 23 22:34:04 2016 +0100
 feature-XX: u1 correct after code review
commit be6f577
Date: Tue Feb 23 22:23:23 2016 +0100
 feature-XX: u1 impl XX
commit 97fc417 (origin/feature-XX)
Date: Tue Feb 23 22:29:31 2016 +0100
 feature-XX: u2 finished impl XX
commit bb87fa5 (origin/master, origin/develop, origin/HEAD, master, feature-XX)
Date: Tue Feb 23 22:06:50 2016 +0100
 master: initial create project structure
$ git 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
* 4e64156 - Tue, 23 Feb 2016 22:34:04 +0100 (17 minutes ago) (HEAD -> my-feature-XX)
| feature-XX: u1 correct after code review - Bartosz Wieczorek
* be6f577 - Tue, 23 Feb 2016 22:23:23 +0100 (28 minutes ago)
| feature-XX: u1 impl XX - Bartosz Wieczorek
* 97fc417 - Tue, 23 Feb 2016 22:29:31 +0100 (22 minutes ago) (origin/feature-XX)
| feature-XX: u2 finished impl XX - Bartosz Wieczorek
* bb87fa5 - Tue, 23 Feb 2016 22:06:50 +0100 (44 minutes ago) (origin/master, origin/develop, origin/HEAD, master, feature-XX)
 master: initial create project structure - Bartosz Wieczorek
$ git checkout feature-XX
Switched to branch 'feature-XX'
Your branch is behind 'origin/feature-XX' by 1 commit, and can be fast-forwarded.
 (use "git pull" to update your local branch)
$ git pull # there should not be any conflicts as local commits were only in local my-feature-XX
$ git merge my-feature-XX # use fast-forward for short lived feature branches
Updating bb87fa5..4e64156
Fast-forward
 file.txt | 5 +++++
 1 file changed, 5 insertions(+)
$ git push
Counting objects: 6, done.
Delta compression using up to 4 threads.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (6/6), 619 bytes | 0 bytes/s, done.
Total 6 (delta 1), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 97fc417..4e64156 feature-XX -> feature-XX
$ git checkout develop
Branch develop set up to track remote branch develop from origin.
Switched to a new branch 'develop'
$ git merge --no-ff feature-XX
Merge made by the 'recursive' strategy.
 file.txt | 5 +++++
 1 file changed, 5 insertions(+)
### MESSAGE ###
Merge branch 'feature-XX' into develop 
$ git push
Counting objects: 1, done.
Writing objects: 100% (1/1), 242 bytes | 0 bytes/s, done.
Total 1 (delta 0), reused 0 (delta 0)
To https://bmwieczorek@github.com/bmwieczorek/git-rebase-workflow-for-team.git
 bb87fa5..941958b develop -> develop
$ git log --decorate --abbrev-commit
commit 941958b (HEAD -> develop, origin/develop)
Merge: bb87fa5 4e64156
Date: Tue Feb 23 22:52:17 2016 +0100
 Merge branch 'feature-XX' into develop
commit 4e64156 (origin/feature-XX, my-feature-XX, feature-XX)
Date: Tue Feb 23 22:34:04 2016 +0100
 feature-XX: u1 correct after code review
commit be6f577
Date: Tue Feb 23 22:23:23 2016 +0100
 feature-XX: u1 impl XX
commit 97fc417
Date: Tue Feb 23 22:29:31 2016 +0100
 feature-XX: u2 finished impl XX
commit bb87fa5 (origin/master, origin/HEAD, master)
Date: Tue Feb 23 22:06:50 2016 +0100
 master: initial create project structure
$ git 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
* 941958b - Tue, 23 Feb 2016 22:52:17 +0100 (9 minutes ago) (HEAD -> develop, origin/develop)
|\ Merge branch 'feature-XX' into develop - Bartosz Wieczorek
| * 4e64156 - Tue, 23 Feb 2016 22:34:04 +0100 (28 minutes ago) (origin/feature-XX, my-feature-XX, feature-XX)
| | feature-XX: u1 correct after code review - Bartosz Wieczorek
| * be6f577 - Tue, 23 Feb 2016 22:23:23 +0100 (38 minutes ago)
| | feature-XX: u1 impl XX - Bartosz Wieczorek
| * 97fc417 - Tue, 23 Feb 2016 22:29:31 +0100 (32 minutes ago)
|/ feature-XX: u2 finished impl XX - Bartosz Wieczorek
* bb87fa5 - Tue, 23 Feb 2016 22:06:50 +0100 (55 minutes ago) (origin/master, origin/HEAD, master)
 master: initial create project structure - Bartosz Wieczorek


Post inspired mainly by http://randyfay.com/content/rebase-workflow-git
Advertisements

Leave a Reply

Fill in your details below or click an icon to log in:

WordPress.com Logo

You are commenting using your WordPress.com account. Log Out / Change )

Twitter picture

You are commenting using your Twitter account. Log Out / Change )

Facebook photo

You are commenting using your Facebook account. Log Out / Change )

Google+ photo

You are commenting using your Google+ account. Log Out / Change )

Connecting to %s