Update tutorial with Octopus usage.
Making an Octopus is simply a natural extension of merging just one branch into the current branch. Signed-off-by: Junio C Hamano <junkio@cox.net>
This commit is contained in:
parent
63f1aa6c72
commit
6f60300b54
@ -859,7 +859,12 @@ All of them have plus `+` characters in the first column, which
|
|||||||
means they are now part of the `master` branch. Only the "Some
|
means they are now part of the `master` branch. Only the "Some
|
||||||
work" commit has the plus `+` character in the second column,
|
work" commit has the plus `+` character in the second column,
|
||||||
because `mybranch` has not been merged to incorporate these
|
because `mybranch` has not been merged to incorporate these
|
||||||
commits from the master branch.
|
commits from the master branch. The string inside brackets
|
||||||
|
before the commit log message is a short name you can use to
|
||||||
|
name the commit. In the above example, 'master' and 'mybranch'
|
||||||
|
are branch heads. 'master~1' is the first parent of 'master'
|
||||||
|
branch head. Please see 'git-rev-parse' documentation if you
|
||||||
|
see more complex cases.
|
||||||
|
|
||||||
Now, let's pretend you are the one who did all the work in
|
Now, let's pretend you are the one who did all the work in
|
||||||
`mybranch`, and the fruit of your hard work has finally been merged
|
`mybranch`, and the fruit of your hard work has finally been merged
|
||||||
@ -1356,4 +1361,101 @@ fast forward. You need to pull and merge those other changes
|
|||||||
back before you push your work when it happens.
|
back before you push your work when it happens.
|
||||||
|
|
||||||
|
|
||||||
|
Bundling your work together
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
It is likely that you will be working on more than one thing at
|
||||||
|
a time. It is easy to use those more-or-less independent tasks
|
||||||
|
using branches with git.
|
||||||
|
|
||||||
|
We have already seen how branches work in a previous example,
|
||||||
|
with "fun and work" example using two branches. The idea is the
|
||||||
|
same if there are more than two branches. Let's say you started
|
||||||
|
out from "master" head, and have some new code in the "master"
|
||||||
|
branch, and two independent fixes in the "commit-fix" and
|
||||||
|
"diff-fix" branches:
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git show-branch
|
||||||
|
! [commit-fix] Fix commit message normalization.
|
||||||
|
! [diff-fix] Fix rename detection.
|
||||||
|
* [master] Release candidate #1
|
||||||
|
---
|
||||||
|
+ [diff-fix] Fix rename detection.
|
||||||
|
+ [diff-fix~1] Better common substring algorithm.
|
||||||
|
+ [commit-fix] Fix commit message normalization.
|
||||||
|
+ [master] Release candidate #1
|
||||||
|
+++ [diff-fix~2] Pretty-print messages.
|
||||||
|
------------
|
||||||
|
|
||||||
|
Both fixes are tested well, and at this point, you want to merge
|
||||||
|
in both of them. You could merge in 'diff-fix' first and then
|
||||||
|
'commit-fix' next, like this:
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git resolve master diff-fix 'Merge fix in diff-fix'
|
||||||
|
$ git resolve master commit-fix 'Merge fix in commit-fix'
|
||||||
|
------------
|
||||||
|
|
||||||
|
Which would result in:
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git show-branch
|
||||||
|
! [commit-fix] Fix commit message normalization.
|
||||||
|
! [diff-fix] Fix rename detection.
|
||||||
|
* [master] Merge fix in commit-fix
|
||||||
|
---
|
||||||
|
+ [master] Merge fix in commit-fix
|
||||||
|
+ + [commit-fix] Fix commit message normalization.
|
||||||
|
+ [master~1] Merge fix in diff-fix
|
||||||
|
++ [diff-fix] Fix rename detection.
|
||||||
|
++ [diff-fix~1] Better common substring algorithm.
|
||||||
|
+ [master~2] Release candidate #1
|
||||||
|
+++ [master~3] Pretty-print messages.
|
||||||
|
------------
|
||||||
|
|
||||||
|
However, there is no particular reason to merge in one branch
|
||||||
|
first and the other next, when what you have are a set of truly
|
||||||
|
independent changes (if the order mattered, then they are not
|
||||||
|
independent by definition). You could instead merge those two
|
||||||
|
branches into the current branch at once. First let's undo what
|
||||||
|
we just did and start over. We would want to get the master
|
||||||
|
branch before these two merges by resetting it to 'master~2':
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git reset --hard master~2
|
||||||
|
------------
|
||||||
|
|
||||||
|
You can make sure 'git show-branch' matches the state before
|
||||||
|
those two 'git resolve' you just did. Then, instead of running
|
||||||
|
two 'git resolve' commands in a row, you would pull these two
|
||||||
|
branch heads (this is known as 'making an Octopus'):
|
||||||
|
|
||||||
|
------------
|
||||||
|
$ git pull . commit-fix diff-fix
|
||||||
|
$ git show-branch
|
||||||
|
! [commit-fix] Fix commit message normalization.
|
||||||
|
! [diff-fix] Fix rename detection.
|
||||||
|
* [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
|
||||||
|
---
|
||||||
|
+ [master] Octopus merge of branches 'diff-fix' and 'commit-fix'
|
||||||
|
+ + [commit-fix] Fix commit message normalization.
|
||||||
|
++ [diff-fix] Fix rename detection.
|
||||||
|
++ [diff-fix~1] Better common substring algorithm.
|
||||||
|
+ [master~1] Release candidate #1
|
||||||
|
+++ [master~2] Pretty-print messages.
|
||||||
|
------------
|
||||||
|
|
||||||
|
Note that you should not do Octopus because you can. An octopus
|
||||||
|
is a valid thing to do and often makes it easier to view the
|
||||||
|
commit history if you are pulling more than two independent
|
||||||
|
changes at the same time. However, if you have merge conflicts
|
||||||
|
with any of the branches you are merging in and need to hand
|
||||||
|
resolve, that is an indication that the development happened in
|
||||||
|
those branches were not independent after all, and you should
|
||||||
|
merge two at a time, documenting how you resolved the conflicts,
|
||||||
|
and the reason why you preferred changes made in one side over
|
||||||
|
the other. Otherwise it would make the project history harder
|
||||||
|
to follow, not easier.
|
||||||
|
|
||||||
[ to be continued.. cvsimports ]
|
[ to be continued.. cvsimports ]
|
||||||
|
Loading…
Reference in New Issue
Block a user