Git基本操做

前面的话

  git有数以百计的命令,咱们基本上不可能使用全部的命令。当咱们在命令行工具中敲入git并回车时,git实际上已经把一些经常使用的命令列了出来,绝大多数时间里用到的也就是这几个命令。本文将详细介绍Git的基本操做html

 

取得仓库

  有两种取得Git项目仓库的方法。第一种是在现存的目录下,经过导入全部文件来建立新的Git仓库。第二种是从已有的Git仓库克隆出一个新的镜像仓库来vue

【初始化新仓库】git

  要对现有的某个项目开始用Git管理,只需到此项目所在的目录,执行:github

$ git init

  初始化后,在当前目录下会出现一个名为.git的目录,全部Git须要的数据和资源都存放在这个目录中。不过目前,仅仅是按照既有的结构框架初始化好了里边全部的文件和目录,但尚未开始跟踪管理项目中的任何一个文件正则表达式

  若是当前目录下有几个文件想要归入版本控制,首先须要先用git add命令告诉Git开始对这些文件进行跟踪shell

$ git add a.txt

  执行上面的命令,没有任何显示,这就对了。Unix的哲学是“没有消息就是好消息”,说明添加成功编程

  要注意的是,全部的版本控制系统,其实只能跟踪文本文件的改动,好比TXT文件,网页,全部的程序代码等等,Git也不例外。版本控制系统能够告诉你每次的改动,好比在第5行加了一个单词“Linux”,在第8行删了一个单词“Windows”。而图片、视频这些二进制文件,虽然也能由版本控制系统管理,但无法跟踪文件的变化,只能把二进制文件每次改动串起来,也就是只知道图片从100KB改为了120KB,但到底改了啥,版本控制系统不知道,也无法知道api

  不幸的是,Microsoft的Word格式是二进制格式,所以,版本控制系统是无法跟踪Word文件的改动的,前面咱们举的例子只是为了演示,若是要真正使用版本控制系统,就要以纯文本方式编写文件服务器

  由于文本是有编码的,好比中文有经常使用的GBK编码,日文有Shift_JIS编码,若是没有历史遗留问题,强烈建议使用标准的UTF-8编码,全部语言使用同一种编码,既没有冲突,又被全部平台所支持网络

  使用Windows的同窗要特别注意,千万不要使用Windows自带的记事本编辑任何文本文件。缘由是Microsoft开发记事本的团队使用了一个很是弱智的行为来保存UTF-8编码的文件,他们自做聪明地在每一个文件开头添加了0xefbbbf(十六进制)的字符,你会遇到不少难以想象的问题,好比,网页第一行可能会显示一个“?”,明明正确的程序一编译就报语法错误等等,都是由记事本的弱智行为带来的

  而后使用命令git commit告诉Git,把文件提交到仓库

$ git commit -m 'wrote a file'

  -m后面输入的是本次提交的说明,能够输入任意内容,固然最好是有意义的,这样就能从历史记录里方便地找到改动记录

  git commit命令执行成功后会提示,1个文件被改动,插入了2行内容

【克隆现有仓库】

  若是想对某个开源项目出一份力,能够先把该项目的Git仓库复制一份出来,这就须要用到git clone命令。若是熟悉其余的VCS好比Subversion,可能已经注意到这里使用的是clone而不是checkout。这是个很是重要的差异,Git收取的是项目历史的全部数据(每个文件的每个版本),服务器上有的数据克隆以后本地也都有了。实际上,即使服务器的磁盘发生故障,用任何一个克隆出来的客户端均可以重建服务器上的仓库,回到当初克隆时的状态

  克隆仓库的命令格式为git clone [url]。好比,要克隆VUE的Git代码仓库 vue,能够用下面的命令:

$ git clone git://github.com/vuejs/vue.git

  这会在当前目录下建立一个名为vue的目录,其中包含一个.git的目录,用于保存下载下来的全部版本记录,而后从中取出最新版本的文件拷贝。若是进入这个新建的vue目录,会看到项目中的全部文件已经在里边了,准备好后续开发和使用。若是但愿在克隆的时候,本身定义要新建的项目目录名称,能够在上面的命令末尾指定新的名字

$ git clone git://github.com/vuejs/vue.git myvue

  Git支持许多数据传输协议。以前的例子使用的是git://协议,不过也能够用http(s)://或者user@server:/path.git表示的SSH传输协议

 

仓库更新记录

  如今手上已经有了一个真实项目的Git仓库,并从这个仓库中取出了全部文件的工做拷贝。接下来,对这些文件做些修改,在完成了一个阶段的目标以后,提交本次更新到仓库

  工做目录下面的全部文件都不外乎这两种状态:已跟踪或未跟踪。已跟踪的文件是指原本就被归入版本控制管理的文件,在上次快照中有它们的记录,工做一段时间后,它们的状态多是未更新,已修改或者已放入暂存区。而全部其余文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工做目录中的全部文件都属于已跟踪文件,且状态为未修改

  在编辑过某些文件以后,Git将这些文件标为已修改。咱们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交全部这些暂存起来的文件,如此重复。因此使用Git时的文件状态变化周期以下图所示

【检查当前文件状态】

  要肯定哪些文件当前处于什么状态,能够用git status命令

$ git status

  若是在取得仓库以后当即执行此命令,会看到相似这样的输出

  这说明如今的工做目录至关干净。换句话说,全部已跟踪文件在上次提交后都未被更改过。此外,上面的信息还代表,当前目录下没有出现任何处于未跟踪的新文件,不然Git会在这里列出来。最后,该命令还显示了当前所在的分支是master,这是默认的分支名称

  如今建立一个新文件README,保存退出后运行git status会看到该文件出如今未跟踪文件列表中

  在状态报告中能够看到新建的README文件出如今“Untracked files”下面。未跟踪的文件意味着Git在以前的快照(提交)中没有这些文件;Git不会自动将之归入跟踪范围,除非告诉它“我须要跟踪该文件”,于是不用担忧把临时文件什么的也纳入版本管理。不过如今的例子中,咱们确实想要跟踪管理README这个文件

【跟踪新文件】

  使用命令git add开始跟踪一个新文件。因此,要跟踪README文件,运行

$ git add README.txt

  使用命令git add .会批量跟踪全部工做目录下未被跟踪的文件

$ git add .

  此时再运行git status命令,会看到README文件已被跟踪,并处于暂存状态:

  只要在“Changes to be committed”这行下面的,就说明是已暂存状态。若是此时提交,那么该文件此时此刻的版本将被留存在历史记录中

  以前咱们使用git init后就运行了git add命令,开始跟踪当前目录下的文件。在git add后面能够指明要跟踪的文件或目录路径。若是是目录的话,就说明要递归跟踪该目录下的全部文件

  其实git add的潜台词就是把目标文件快照放入暂存区域,也就是add file into staged area,同时不曾跟踪过的文件标记为须要跟踪

【暂存已修改文件】

  如今咱们修改下以前已跟踪过的文件README.txt,将其内容修改成hello 回车换行 world

  而后再次运行status命令,会看到这样的状态报告:

  文件README.txt出如今 “Changes not staged for commit” 这行下面,说明已跟踪文件的内容发生了变化,但尚未放到暂存区。要暂存此次更新,须要运行git add命令

  git add命令是个多功能命令,根据目标文件的状态不一样,此命令的效果也不一样:能够用它开始跟踪新文件,或者把已跟踪的文件放到暂存区,还能用于合并时把有冲突的文件标记为已解决状态等

  如今运行git add将README.txt放到暂存区,而后再看看git status的输出:

  如今README.txt文件已暂存,下次提交时就会记录到仓库。假设此时,想要在README.txt里再加条注释,从新编辑存盘后,准备好提交。不过且慢,再运行git status看看:

  实际上Git只不过暂存了运行git add命令时的版本,若是如今提交,那么提交的是添加注释前的版本,而非当前工做目录中的版本。因此,运行git add以后又作了修订的文件,须要从新运行git add把最新版本从新暂存起来

【忽略某些文件】

  通常咱们总会有些文件无需归入Git的管理,也不但愿它们总出如今未跟踪文件列表。一般都是些自动生成的文件,好比日志文件,或者编译过程当中建立的临时文件等。咱们能够建立一个名为.gitignore的文件,列出要忽略的文件模式

  第一行告诉Git忽略全部以.o或.a结尾的文件。通常这类对象文件和存档文件都是编译过程当中出现的,咱们用不着跟踪它们的版本

  第二行告诉Git忽略全部以波浪符(~)结尾的文件,许多文本编辑软件都用这样的文件名保存副本

  此外,可能还须要忽略log,tmp或者pid目录,以及自动生成的文档等等。要养成一开始就设置好.gitignore文件的习惯,以避免未来误提交这类无用的文件

  文件 .gitignore 的格式规范以下:

  一、全部空行或者以注释符号 # 开头的行都会被 Git 忽略

  二、可使用标准的glob模式匹配

  三、匹配模式最后跟反斜杠(/)说明要忽略的是目录

  四、要忽略指定模式之外的文件或目录,能够在模式前加上叹号(!)取反

  所谓的glob模式是指shell所使用的简化了的正则表达式。星号(*)匹配零个或多个任意字符;[abc]匹配任何一个列在方括号中的字符(这个例子要么匹配一个a,要么匹配一个b,要么匹配一个c);问号(?)只匹配一个任意字符;若是在方括号中使用短划线分隔两个字符,表示全部在这两个字符范围内的均可以匹配(好比[0-9]表示匹配全部0到9的数字)

# 此为注释 – 将被 Git 忽略
# 忽略全部 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的全部文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
# ignore all .txt files in the doc/ directory
doc/**/*.txt

【查看已暂存和未暂存的更新】

  实际上git status的显示比较简单,仅仅是列出了修改过的文件,若是要查看具体修改了什么地方,能够用git diff命令

  如今,它已经能回答咱们的两个问题了:当前作的哪些更新尚未暂存?有哪些更新已经暂存起来准备好了下次提交?git diff会使用文件补丁的格式显示具体添加和删除的行

  假如再次修改README文件后暂存,运行status命令将会看到:

  要查看还没有暂存的文件更新了哪些部分,不加参数直接输入git diff:

  若要看已经暂存起来的文件和上次提交时的快照之间的差别,能够用git diff--cached命令  

  [注意]单单git diff不过是显示尚未暂存起来的改动,而不是此次工做和上次提交之间的差别。因此有时候一会儿暂存了全部更新过的文件后,运行git diff后却什么也没有,就是这个缘由

【提交更新】

  如今的暂存区域已经准备稳当能够提交了。在此以前,请必定要确认还有什么修改过的或新建的文件尚未git add过,不然提交的时候不会记录这些还没暂存起来的变化。因此,每次准备提交前,先用git status看下,是否是都已暂存起来了,而后再运行提交命令git commit:

$ git commit

  这种方式会启动文本编辑器以便输入本次提交的说明,编辑器会显示相似下面的文本信息

  能够看到,默认的提交消息包含最后一次运行git status的输出,放在注释行里,另外开头还有一空行,供你输入提交说明。彻底能够去掉这些注释行,不过留着也不要紧,多少能帮助回想起此次更新的内容有哪些。退出编辑器时,Git会丢掉注释行,将说明内容和本次更新提交到仓库

  另外也能够用-m参数后跟提交说明的方式,在一行命令中提交更新

  如今已经建立了第一个提交!能够看到,提交后它会提示,当前是在哪一个分支(master)提交的,本次提交的完整SHA-1校验和是什么(714666c),以及在本次提交中,有多少文件修订过,多少行添改和删改过

  [注意]提交时记录的是放在暂存区域的快照,任何还未暂存的仍然保持已修改状态,能够在下次提交时归入版本管理。每一次运行提交操做,都是对项目做一次快照,之后能够回到这个状态,或者进行比较

【跳过使用暂存区域】

  尽管使用暂存区域的方式能够精心准备要提交的细节,但有时候这么作略显繁琐。Git提供了一个跳过使用暂存区域的方式,只要在提交的时候,给git commit加上-a选项,Git就会自动把全部已经跟踪过的文件暂存起来一并提交,从而跳过git add步骤

  跳过git add步骤,不等于彻底不使用git add。由于git commit -a是将全部跟踪过的文件暂存起来并提交,只是省略了暂存这一步。但一个未跟踪状态的文件须要使用git add命令来使其变成已跟踪状态

  关于git commit -a 与git commit -am的区别的详细信息移步至此

【移除文件】

  要从Git中移除某个文件,就必需要从已跟踪文件清单中移除(确切地说,是从暂存区域移除),而后提交。能够用git rm命令完成此项工做,并连带从工做目录中删除指定的文件,这样之后就不会出如今未跟踪文件清单中了

  若是只是简单地从工做目录中手工删除文件,运行git status时就会在“Changes not staged for commit”部分(也就是未暂存清单)看到

  运行git rm记录这次移除文件的操做

   由上图可知,直接从工做目录中手工删除文件a.txt,虽然文件被删除,但其快照仍然处于未暂存区域,这时就须要使用git rm将a.txt从暂存区域移除

  最后提交的时候,该文件就再也不归入版本管理了。若是删除以前修改过而且已经放到暂存区域的话,则必需要用强制删除选项-f(即force的首字母),以防误删除文件后丢失修改的内容

  另一种状况是,咱们想把文件从Git仓库中删除(亦即从暂存区域移除),但仍然但愿保留在当前工做目录中。换句话说,仅是从跟踪清单中删除。好比一些大型日志文件或者一堆.a编译文件,不当心归入仓库后,要移除跟踪但不删除文件,以便稍后在.gitignore文件中补上,用--cached选项便可:

$ git rm --cached a.txt

  如下代码会递归删除当前目录及其子目录中全部 ~ 结尾的文件

$ git rm \*~

  如下代码会删除全部被跟踪,但在工做目录被删除的文件

$ git rm $(git ls-files --deleted)

【移动文件】

  不像其余的VCS系统,Git并不跟踪文件移动操做。若是在Git中重命名了某个文件,仓库中存储的元数据并不会体现出这是一次更名操做。不过Git很是聪明,它会推断出究竟发生了什么

  要在Git中对文件更名,能够这么作:

$ git mv file_from file_to

 

查看提交历史

  在提交了若干更新以后,又或者克隆了某个项目,想回顾下提交历史,可使用git log命令查看

  接下来的例子会用我专门用于演示的 simplegit 项目,运行下面的命令获取该项目源代码:

git clone git://github.com/schacon/simplegit-progit.git

  而后在此项目中运行git log,应该会看到下面的输出:

  默认不用任何参数的话,git log会按提交时间列出全部的更新,最近的更新排在最上面

  每次更新都有一个SHA-1校验和、做者的名字和电子邮件地址、提交时间,最后缩进一个段落显示提交说明

  git log有许多选项,下表列出了一些经常使用的选项及其释义

选项         说明
-p            按补丁格式显示每一个更新之间的差别
--word-diff       按 word diff 格式显示差别
--stat          显示每次更新的文件修改统计信息
--shortstat       只显示 --stat 中最后的行数修改添加移除统计
--name-only       仅在提交信息后显示已修改的文件清单
--name-status     显示新增、修改、删除的文件清单
--abbrev-commit   仅显示 SHA-1 的前几个字符,而非全部的 40 个字符
--relative-date   使用较短的相对时间显示(好比,“2 weeks ago”)
--graph        显示 ASCII 图形表示的分支合并历史
--pretty        使用其余格式显示历史提交信息可用的选项包括oneline,short,full,fuller 和format(后跟指定格式)
--oneline        `--pretty=oneline --abbrev-commit` 的简化用法

  接下来介绍些最经常使用的选项

  咱们经常使用-p选项展开显示每次提交的内容差别,用-2则仅显示最近的两次更新

  该选项除了显示基本信息以外,还在附带了每次commit的变化。当进行代码审查,或者快速浏览某个搭档提交的commit的变化的时候,这个参数就很是有用了

  某些时候,单词层面的对比,比行层面的对比,更加容易观察。Git提供了--word-diff选项。咱们能够将其添加到git log -p命令的后面,从而获取单词层面上的对比。在程序代码中进行单词层面的对比经常是没什么用的。不过须要在书籍、论文这种很大的文本文件上进行对比的时候,这个功能就显出用武之地了

  如上图所示,这里并无日常看到的添加行或者删除行的信息。这里的对比显示在行间。新增长的单词被{+ +}括起来,被删除的单词被[- -]括起来。在进行单词层面的对比的时候,可能但愿上下文(context)行数从默认的3行,减为1行,那么可使用-U1选项。上面的例子中,咱们就使用了这个选项

  另外,git log还提供了许多摘要选项能够用,好比--stat,仅显示简要的增改行数统计:

  每一个提交都列出了修改过的文件,以及其中添加和移除的行数,并在最后列出全部增减行数小计。 还有个经常使用的--pretty选项,能够指定使用彻底不一样于默认格式的方式展现提交历史。好比用oneline将每一个提交放在一行显示,这在提交数很大时很是有用。另外还有short,full和fuller能够用,展现的信息或多或少有些不一样

  最有意思的是format,能够定制要显示的记录格式,这样的输出便于后期编程提取分析

  下表中列出了经常使用的格式占位符写法及其表明的意义

选项        说明
%H         提交对象(commit)的完整哈希字串
%h         提交对象的简短哈希字串
%T         树对象(tree)的完整哈希字串
%t         树对象的简短哈希字串
%P         父对象(parent)的完整哈希字串
%p         父对象的简短哈希字串
%an        做者(author)的名字
%ae        做者的电子邮件地址
%ad        做者修订日期(能够用 -date= 选项定制格式)
%ar        做者修订日期,按多久之前的方式显示
%cn        提交者(committer)的名字
%ce        提交者的电子邮件地址
%cd        提交日期
%cr        提交日期,按多久之前的方式显示
%s         提交说明  

  做者(author)和提交者(committer)之间究竟有何差异,其实做者指的是实际做出修改的人,提交者指的是最后将此工做成果提交到仓库的人。因此,当你为某个项目发布补丁,而后某个核心成员将你的补丁并入项目时,你就是做者,而那个核心成员就是提交者

【限制输出长度】

  除了定制输出格式的选项以外,git log还有许多很是实用的限制输出长度的选项,也就是只输出部分提交信息。好比使用-2,它只显示最近的两条提交,实际上,这是-<n>选项的写法,其中的n能够是任何天然数,表示仅显示最近的若干条提交。不过实践中咱们是不太用这个选项的,Git在输出全部提交时会自动调用分页程序(less),要看更早的更新只需翻到下页便可

  另外还有按照时间做限制的选项,好比--since和--until。下面的命令列出全部最近两周内的提交

$ git log --since=2.weeks

  能够给出各类时间格式,好比说具体的某一天(“2008-01-15”),或者是多久之前(“2 years 1 day 3 minutes ago”)

  还能够给出若干搜索条件,列出符合的提交。用--author选项显示指定做者的提交,用--grep选项搜索提交说明中的关键字。(请注意,若是要获得同时知足这两个选项搜索条件的提交,就必须用--all-match选项。不然,知足任意一个条件的提交都会被匹配出来)

  另外一个真正实用的git log选项是路径(path),若是只关心某些文件或者目录的历史提交,能够在git log 选项的最后指定它们的路径。由于是放在最后位置上的选项,因此用两个短划线(--)隔开以前的选项和后面限定的路径名

  下表还列出了其余经常使用的相似选项

选项              说明
-(n)             仅显示最近的 n 条提交
--since, --after      仅显示指定时间以后的提交
--until, --before     仅显示指定时间以前的提交
--author          仅显示指定做者相关的提交
--committer        仅显示指定提交者相关的提交

【使用图形化工具查阅提交历史】

  有时候图形化工具更容易展现历史提交的变化,随Git一同发布的gitk就是这样一种工具。它是用Tcl/Tk写成的,基本上至关于git log命令的可视化版本,凡是git log能够用的选项也都能用在gitk上。在项目工做目录中输入gitk命令后,就会启动下图所示的界面

  上半个窗口显示的是历次提交的分支祖先图谱,下半个窗口显示当前点选的提交对应的具体差别

 

撤销操做

  任什么时候候,都有可能须要撤消刚才所作的某些操做。接下来,介绍一些基本的撤消操做相关的命令。请注意,有些撤销操做是不可逆的,因此请务必谨慎当心,一旦失误,就有可能丢失部分工做成果

【修改最后一次提交】

  有时候咱们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操做,可使用--amend选项从新提交:

$ git commit --amend

  此命令将使用当前的暂存区域快照提交。若是刚才提交完没有做任何改动,直接运行此命令的话,至关于有机会从新编辑提交说明,但将要提交的文件快照和以前的同样

  启动文本编辑器后,会看到上次提交时的说明,编辑它确认没问题后保存退出,就会使用新的提交说明覆盖刚才失误的提交

  若是刚才提交时忘了暂存某些修改,能够先补上暂存操做,而后再运行 --amend 提交:

$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend

  上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容

【取消已经暂存的文件】

  下面将演示如何取消暂存区域中的文件,以及如何取消工做目录中已修改的文件。查看文件状态的时候就提示了该如何撤消,因此不须要死记硬背

  来看下面的例子,有两个修改过的文件,咱们想要分开提交,但不当心用git add.全加到了暂存区域。该如何撤消暂存其中的一个文件呢?其实,git status的命令输出已经告诉了咱们该怎么作:

  在“Changes to be committed”下面,括号中有提示,可使用git reset HEAD <file>...的方式取消暂存

【取消对文件的修改】

  若是以为刚才对a.txt的修改彻底没有必要,该如何取消修改,回到以前的状态(也就是修改以前的版本)呢?git status一样提示了具体的撤消方法,接着上面的例子,如今未暂存区域看起来像这样:

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   a.txt

  在第二个括号中,咱们看到了抛弃文件修改的命令

  能够看到,该文件已经恢复到修改前的版本

  这条命令有些危险,全部对文件的修改都没有了,由于咱们刚刚把以前版本的文件复制过来重写了此文件。因此在用这条命令前,请务必肯定真的再也不须要保留刚才的修改。若是只是想回退版本,同时保留刚才的修改以便未来继续工做,之后会介绍

【总结】

  当文件被提交后(git commit),就没法撤销了,只能使用--amend命令来修改提交说明,或增长要提交的文件

  当文件被提交前,若是想恢复文件内容,若是文件处于暂存区(stage),则须要先使用git reset HEAD <file>的方式取消暂存,而后再使用git checkout -- <file>的方式来恢复文件内容

 

使用远程仓库

  要参与任何一个Git项目的协做,必需要了解该如何管理远程仓库。远程仓库是指托管在网络上的项目仓库,可能会有好多个,其中有些你只能读,另外有些能够写。同他人协做开发某个项目时,须要管理这些远程仓库,以便推送或拉取数据,分享各自的工做进展。管理远程仓库的工做,包括添加远程库,移除废弃的远程库,管理各式远程库分支,定义是否跟踪这些分支等等

【查看当前的远程库】

  要查看当前配置有哪些远程仓库,能够用git remote命令,它会列出每一个远程库的简短名字。在克隆完某个项目后,至少能够看到一个名为origin的远程库,Git默认使用这个名字来标识你所克隆的原始仓库:

 

  也能够加上 -v 选项(v为--verbose的简写,中文意思是冗长的),显示对应的克隆地址:

  若是有多个远程仓库,此命令将所有列出

$ cd grit
$ git remote -v
bakkdoor  git://github.com/bakkdoor/grit.git
cho45     git://github.com/cho45/grit.git
defunkt   git://github.com/defunkt/grit.git
koke      git://github.com/koke/grit.git
origin    git@github.com:mojombo/grit.git

  这样一来,就能够很是轻松地从这些用户的仓库中,拉取他们的提交到本地。请注意,上面列出的地址只有origin用的是SSH URL连接,因此也只有这个仓库我能推送数据上去

【添加远程仓库】

  添加一个新的远程仓库,能够指定一个名字,以便未来引用,运行git remote add [shortname] [url]

  如今能够用字符串pb指代对应的仓库地址了。好比说,要抓取全部Paul有的,但本地仓库没有的信息,能够运行git fetch pb:

  如今,Paul 的主干分支(master)已经彻底能够在本地访问了,对应的名字是 pb/master,你能够将它合并到本身的某个分支,或者切换到这个分支,看看有些什么有趣的更新

【从远程仓库抓取数据】

  正如以前所看到的,能够用下面的命令从远程仓库抓取数据到本地:

$ git fetch [remote-name]

  此命令会到远程仓库中拉取全部你本地仓库中尚未的数据。运行完成后,你就能够在本地访问该远程仓库中的全部分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟

  若是克隆了一个仓库,此命令会自动将远程仓库归于origin名下。因此,git fetch origin会抓取从你上次克隆以来别人上传到此远程仓库中的全部更新(或是上次fetch以来别人提交的更新)。有一点很重要,fetch命令只是将远端的数据拉到本地仓库,并不自动合并到当前工做分支,只有当你确实准备好了,才能手工合并

  若是设置了某个分支用于跟踪某个远端仓库的分支,可使用git pull命令自动抓取数据下来,而后将远端分支自动合并到本地仓库中当前分支。在平常工做中咱们常常这么用,既快且好。实际上,默认状况下git clone命令本质上就是自动建立了本地的master分支用于跟踪远程仓库中的master分支(假设远程仓库确实有master分支)。因此通常咱们运行git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工做目录中的当前分支

【推送数据到远程仓库】

  项目进行到一个阶段,要同别人分享目前的成果,能够将本地仓库中的数据推送到远程仓库。实现这个任务的命令很简单:git push [remote-name] [branch-name]。若是要把本地的master分支推送到origin服务器上(再次说明下,克隆操做会自动使用默认的master和origin名字),能够运行下面的命令

$ git push origin master

  只有在所克隆的服务器上有写权限,或者同一时刻没有其余人在推数据,这条命令才会如期完成任务。若是在你推数据前,已经有其余人推送了若干更新,那你的推送操做就会被驳回。你必须先把他们的更新抓取到本地,合并到本身的项目中,而后才能够再次推送

【查看远程仓库信息】

  咱们能够经过命令git remote show [remote-name]查看某个远程仓库的详细信息,好比要看所克隆的origin仓库,能够运行:

  除了对应的克隆地址外,它还给出了许多额外的信息。它友善地告诉你若是是在master分支,就能够用git pull命令抓取数据合并到本地。另外还列出了全部处于跟踪状态中的远端分支

  上面的例子很是简单,而随着使用Git的深刻,git remote show给出的信息可能会像这样:

$ git remote show origin
* remote origin
  URL: git@github.com:defunkt/github.git
  Remote branch merged with 'git pull' while on branch issues
    issues
  Remote branch merged with 'git pull' while on branch master
    master
  New remote branches (next fetch will store in remotes/origin)
    caching
  Stale tracking branches (use 'git remote prune')
    libwalker
    walker2
  Tracked remote branches
    acl
    apiv2
    dashboard2
    issues
    master
    postgres
  Local branch pushed with 'git push'
    master:master

  它告诉咱们,运行git push时缺省推送的分支是什么(最后两行)。它还显示了有哪些远端分支尚未同步到本地(第六行的caching分支),哪些已同步到本地的远端分支在远端服务器上已被删除(Stale tracking branches下面的两个分支),以及运行git pull时将自动合并哪些分支(前四行中列出的issues和master分支)

【远程仓库的删除和重命名】

  在新版Git中能够用git remote rename命令修改某个远程仓库在本地的简称,好比想把pb改为paul,能够这么运行:

$ git remote rename pb paul

  [注意]对远程仓库的重命名,也会使对应的分支名称发生变化,原来的pb/master分支如今成了paul/master

  碰到远端仓库服务器迁移,或者原来的克隆镜像再也不使用,又或者某个参与者再也不贡献代码,那么须要移除对应的远端仓库,能够运行git remote rm命令:

$ git remote rm paul
相关文章
相关标签/搜索