git pull VS git fetch git rebase

2019-01-04 15:49发布

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?

2条回答
戒情不戒烟
2楼-- · 2019-01-04 15:59

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)

查看更多
一夜七次
3楼-- · 2019-01-04 16:10

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.

查看更多
登录 后发表回答