• 使用git remote指令可以查看远程仓库的名字,加上-v可以显示仓库地址,添加一个新远程仓库可以使用git remote add <reponame> <url>来实现。
  • 从远程仓库抓取数据使用git fetch <reponame>即可,git clone会默认将远程仓库归于origin名下,git fetch每次更新可以认为是将远程仓库的内容和当前仓库的内容做一个并集。git fetch是将远程主机的最新内容拉到本地,用户在检查了以后决定是否合并到工作本机分支中。而git pull 则是将远程主机的最新内容拉下来后直接合并,即:git pull = git fetch + git merge,这样可能会产生冲突,需要手动解决。**
  • 在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先。
  • 当使用 git commit 新建一个提交对象前,Git 会先计算每一个子目录(本例中就是项目根目录)的校验和,然后在 Git 仓库中将这些目录保存为树(tree)对象。之后 Git 创建的提交对象,除了包含相关提交信息以外,还包含着指向这个树对象(项目根目录)的指针,如此它就可以在将来需要的时候,重现此次快照的内容了。
  • 多次提交后的commit对象之间的关系如下图所示:

  • Git 中的分支,其实本质上仅仅是个指向 commit 对象的可变指针。Git 会使用 master 作为分支的默认名字。在若干次提交后,你其实已经有了一个指向最后一次提交对象的 master 分支,它在每次提交的时候都会自动向前移动。

  • 创建新分支——git branch <branch name>

  • Git通过HEAD指针指向当前分支,可以认为是当前分支的别名。

  • 切换分支——git checkout <branch name>

  • Git 中的分支实际上仅是一个包含所指对象校验和(40 个字符长度 SHA-1 字串)的文件,所以创建和销毁一个分支就变得非常廉价,速度自然非常快。

  • 新建并切换到该新分支——git checkout -b <branch name>

  • Git在合并分支时,如果master分支所在的提交对象是要并入某一分支的上游,Git 只需把 master 分支指针直接右移。换句话说,如果顺着一个分支走下去可以到达另一个分支的话,那么 Git 在合并两者时,只会简单地把指针右移,因为这种单线的历史分支不存在任何需要解决的分歧,所以这种合并过程可以称为快进(Fast forward)。

  • 删除分支——git branch -d <branch name>
  • 如果合并的两个分支有公共祖先但是不能像上面提到的采用fast forward方式合并的话,Git 会用两个分支的末端(C4 和 C5)以及它们的共同祖先(C2)进行一次简单的三方合并计算,如下图所示:

  • 可以看到,Git 没有简单地把分支指针右移,而是对三方合并后的结果重新做一个新的快照,并自动创建一个指向它的提交对象(C6)。这个提交对象比较特殊,它有两个祖先(C4 和 C5)。

  • 合并分支时遇到冲突可以使用git status查看含有冲突的文件,想要正常合并则需要先处理完冲突的部分,之后再手动git add <file>

  • 查看所有分支——git branch

  • 查看各个分支最后一个提交对象的信息——git branch -v

  • 查看与当前分支合并过的所以分支——git branch --merged

  • 查看未与当前分支合并的分支——git branch --no-merged

  • 强制删除还未合并过的分支——git branch -D <branch name>

  • 远程分支的格式为(远程仓库名)/(分支名)

  • 假设你们团队有个地址为 git.ourcompany.com 的 Git 服务器。如果你从这里克隆,Git 会自动为你将此远程仓库命名为 origin,并下载其中所有的数据,建立一个指向它的 master 分支的指针,在本地命名为 origin/master,但你无法在本地更改其数据。接着,Git 建立一个属于你自己的本地 master 分支,始于 originmaster 分支相同的位置,你可以就此开始工作,如下图所示:

所以说,实际上我们每次克隆远程仓库时,实际上是建立你自己的本地分支 master 和远程分支 origin/master,并且将它们都指向 origin 上的 master 分支。可以这样理解,origin/master分支负责与服务器交互(相当于远程服务器中内容的备份),本地分支负责本地的代码管理,每次push/pull是本地与服务器交互,fetch则是本地的origin/master更新到代码托管平台服务器上的最新代码。

  • 同步远程服务器上的数据到本地——git fetch origin。该命令首先找到 origin 是哪个服务器,从上面获取你尚未拥有的数据,更新你本地的数据库,然后把 origin/master 的指针移到它最新的位置上。
  • 推送本地分支到远程仓库——git push <remote repo name> <branch name>,如果想要把推送的分支取个另外的名字,可以这样:git push origin <old branch name>:<new branch name>
  • 从远程分支 checkout 出来的本地分支,称为 跟踪分支 (tracking branch)。跟踪分支是一种和某个远程分支有直接联系的本地分支。在跟踪分支里输入 git push,Git 会自行推断应该向哪个服务器的哪个分支推送数据。同样,在这些分支里运行 git pull 会获取所有远程索引,并把它们的数据都合并到本地分支中来。
  • git fetch操作后想要将内容合并到当前分支,使用git merge即可,可以认为,git pull等价于git fetch + git merge
  • 如果想要复制一份远程的内容分支到本地来修改可以用git checkout来实现,即git checkout -b <branch name> <remote branch name>
  • 删除远程分支——git push <remote repo name> : <branch name>有种方便记忆这条命令的方法:记住我们不久前见过的 git push [远程名] [本地分支]:[远程分支] 语法,如果省略 [本地分支],那就等于是在说“在这里提取空白然后把它变成[远程分支]”。
  • 关于git rebase这个危险的操作,用到的时候再查资料参考。