git图形化工具GitKraken的使用——Push与Pull

Push

git push命令用来将本地分支的更新推送到远端:

$ git push <remote-name> <本地分支名>:<远程分支名>

1、这里一般远程分支名称和本地分支名称保持一样的,所以就省略远程分支名,例如:

$ git push origin develop

如果远程主机不存在此分支,则会被新建。

2、如果省略本地分支,则表示删除指定的远程分支:

$ git push origin :develop
# 等同于
$ git push origin --delete develop 

带参数push

例如之前用到的:

$ git push -u origin develop

这样就可以直接使用 git push,这是因为 -u 指定了 git push 的默认行为,可以设置其默认行为,有下面几个行为可选:

  • nothing:push操作无效,除非显式指定远程分支,例如 git push origin develop
  • current:push当前分支到远程同名分支,如果远程同名分支不存在则自动创建同名分支
  • upstream:push当前分支到它的上游分支,也就是在上一节说到的远程跟踪分支,如果没有会自动创建
  • simple:simple和upstream是相似的,只有一点不同,simple必须保证有一个与本地分支同名的上游分支,否则会拒绝push操作
  • matching:push所有本地和远程两端都存在的同名分支

在git版本2.0之后 git push 的默认行为是 simple,所以说本地分支还没有与远程分支建立追踪关系之前执行 git push 会报下面的信息:

$ git push
fatal: The current branch test has no upstream branch.
To push the current branch and set the remote as upstream, use

    git push --set-upstream origin test

GitKraken中这里点击push是加了-u参数

git图形化工具GitKraken的使用——Push与Pull_第1张图片

Pull

Push 搞清楚后,来看下 Pull

$ git pull <远程主机名> <远程分支名>:<本地分支名>

一般我们操作都会切换到要操作的分支,所以冒号后面的本地分支名可以省略:

$ git pull origin develop

如果本地分支和远程分支建立了追踪关系,可以直接使用 git pull

当没有指定当前分支的上游分支的时候,即没有建立追踪关系,这时候如果 git pull 是不成功的:

$ git pull
There is no tracking information for the current branch.
Please specify which branch you want to merge with.
See git-pull(1) for details.

    git pull  

If you wish to set tracking information for this branch you can do so with:

    git branch --set-upstream-to=origin/ develop

git pull 的默认操作是 git fetch + git merge,比如说:

$ git pull origin develop

# 等价于

$ git fetch origin develop
$ git merge origin/develop

git fetch

# 完整的语法
$ git fetch <远程主机名> <远程分支名>:<本地分支名> # 如果取回所有分支,则分支名可以省略

这个命令用来将远程主机的更新拉取到本地,所拉取的更新,在本地用 <主机名>/<分支名> 来读取,即远程跟踪分支,比如 origin/develop,之前说过远程分支与远程跟踪分支的区别,远程跟踪分支就像是一个指针,指向远程分支的commit。执行git fetch,把远程跟踪分支和远程分支同步。

这里说起来比较抽象,可以从log记录查看查看,比如说远程master分支超前我们本地master一个版本,现在在本地master分支上分别执行 git log -2git log origin/master -2

$ git log -2
commit 73b2a14d33f9a04c9278e596f9a3f7efa015126a
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:44:32 2017 +0800

    c7

commit e59ab7119605bd8489d1536f05c6c230e9303f69
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:32:12 2017 +0800

    c6
$ git log origin/master -2
commit 73b2a14d33f9a04c9278e596f9a3f7efa015126a
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:44:32 2017 +0800

    c7

commit e59ab7119605bd8489d1536f05c6c230e9303f69
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:32:12 2017 +0800

    c6

现在两个指针都是在“c7”这个提交,接下来执行 git fetch

$ git fetch
remote: Counting objects: 3, done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
From https://github.com/wuchongzi/test1
   73b2a14..bdffd16  master     -> origin/master

再来看一下log:

$ git log origin/master -2
commit bdffd1601dcfa48d222d73abdfcf9342a9a5e37f
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:47:19 2017 +0800

    c8

commit 73b2a14d33f9a04c9278e596f9a3f7efa015126a
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:44:32 2017 +0800

    c7
$ git log -2
commit 73b2a14d33f9a04c9278e596f9a3f7efa015126a
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:44:32 2017 +0800

    c7

commit e59ab7119605bd8489d1536f05c6c230e9303f69
Author: wuchongpc .chong313@gmail.com>
Date:   Mon Jun 26 14:32:12 2017 +0800

    c6

可以看到 origin/master 已经与远程同步了

git pull

如果直接使用 git pull,这里会涉及到 merge 合并操作,之前说过merge的时候有几种模式,ff模式和 –no-ff 模式,这里不做介绍

git图形化工具GitKraken的使用——Push与Pull_第2张图片

综上所述,我们在开发的时候,比如说我在develop上拉了一个分支来开发新的功能,在开发完成后需要合并到develop上,在合并前,我们需要先切换到develop上fetch下,看其他人有没有更新develop

参考文章

Git push与pull的默认行为

git fetch和git pull之间的区别

你可能感兴趣的:(git,git)