git pull VS git fetch git rebase
Another question said git pull
is like a git fetch
+ git merge
.
But what is the difference between git pull
VS git fetch
+ git rebase
?
It should be pretty obvious from your question that you're actually just asking about the difference between git merge
and git rebase
.
So let's suppose you're in the common case - you've done some work on your master branch, and you pull from origin's, which also has done some work. After the fetch, things look like this:
- o - o - o - H - A - B - C (master)
P - Q - R (origin/master)
If you merge at this point (the default behavior of git pull), assuming there aren't any conflicts, you end up with this:
- o - o - o - H - A - B - C - X (master)
/
P - Q - R --- (origin/master)
If on the other hand you did the appropriate rebase, you'd end up with this:
- o - o - o - H - P - Q - R - A' - B' - C' (master)
|
(origin/master)
The content of your work tree should end up the same in both cases; you've just created a different history leading up to it . The rebase rewrites your history, making it look as if you had committed on top of origin's new master branch ( R
), instead of where you originally committed ( H
). You should never use the rebase approach if someone else has already pulled from your master branch.
Finally, note that you can actually set up git pull
for a given branch to use rebase instead of merge by setting the config parameter branch.<name>.rebase
to true. You can also do this for a single pull using git pull --rebase
.
In reply to your first statement 'git pull is like a git fetch + git merge.',
"In its default mode, git pull is shorthand for git fetch followed by git merge FETCH_HEAD" More precisely, git pull runs git fetch with the given parameters and calls git merge to merge the retrieved branch heads into the current branch"
(Ref: https://git-scm.com/docs/git-pull)
For your second statement/question: 'But what is the difference between git pull VS git fetch + git rebase' Again, from same source:
"With --rebase, it runs git rebase instead of git merge."
Now, if you wanted to ask the difference between fetch and merge, that is answered here too: https://git-scm.com/book/en/v2/Git-Branching-Rebasing (the difference between altering the way version history is recorded and what not)
上一篇: Git:repo包含一个空目录