What's the difference between git merge
and git rebase
?
相关问题
- Why does recursive submodule update from github fa
- Extended message for commit via Visual Studio Code
- Emacs shell: save commit message
- Can I organize Git submodules in a flat hierarchy?
- Upload file > 25 MB on Github
相关文章
- 请教Git如何克隆本地库?
- GitHub:Enterprise post-receive hook
- Git Clone Fails: Server Certificate Verification F
- SSIS solution on GIT?
- Is there a version control system abstraction for
- ssh: Could not resolve hostname git: Name or servi
- Cannot commit changes with gitextensions
- git: retry if http request failed
Suppose originally there were 3 commits,
A
,B
,C
:Then developer Dan created commit
D
, and developer Ed created commitE
:Obviously, this conflict should be resolved somehow. For this, there are 2 ways:
MERGE:
Both commits
D
andE
are still here, but we create merge commitM
that inherits changes from bothD
andE
. However, this creates diamond shape, which many people find very confusing.REBASE:
We create commit
R
, which actual file content is identical to that of merge commitM
above. But, we get rid of commitE
, like it never existed (denoted by dots - vanishing line). Because of this obliteration,E
should be local to developer Ed and should have never been pushed to any other repository. Advantage of rebase is that diamond shape is avoided, and history stays nice straight line - most developers love that!I really love this excerpt from 10 Things I hate about git (it gives a short explanation for rebase in its second example):
And then we have
which is a good description.
1. uncensored in the original
For easy understand can see my figure.
Rebase will change commit hash, so that if you want to avoid much of conflict, just use rebase when that branch is done/complete as stable.
Personally I don't find the standard diagramming technique very helpful - the arrows always seem to point the wrong way for me. (They generally point towards the "parent" of each commit, which ends up being backwards in time, which is weird).
To explain it in words:
For reasons I don't understand, GUI tools for Git have never made much of an effort to present merge histories more cleanly, abstracting out the individual merges. So if you want a "clean history", you need to use rebase.
I seem to recall having read blog posts from programmers who only use rebase and others that never use rebase.
Example
I'll try explaining this with a just-words example. Let's say other people on your project are working on the user interface, and you're writing documentation. Without rebase, your history might look something like:
That is, merges and UI commits in the middle of your documentation commits.
If you rebased your code onto master instead of merging it, it would look like this:
All of your commits are at the top (newest), followed by the rest of the
master
branch.(Disclaimer: I'm the author of the "10 things I hate about Git" post referred to in another answer)
While the accepted and most upvoted answer is great, I additionally find it useful trying to explain the difference only by words:
merge
rebase
summary: When possible, rebase is almost always better. Making re-integration into the main branch easier.
Because? ➝ your feature work can be presented as one big ‘patch file’ (aka diff) in respect to the main branch, not having to ‘explain’ multiple parents: At least two, coming from one merge, but likely many more, if there were several merges. Unlike merges, multiple rebases do not add up. (another big plus)
Git rebase is closer to a merge. The difference in rebase is:
So that means that all your local commits are moved to the end, after all the remote commits. If you have a merge conflict, you have to solve it too.