git学习 #2:git基本操作
本文出自   http://blog.csdn.net/shuangde800
 
---------------------------------------------------------------------------------
---------------------------------------------------------------------------------
在工作目录中初始化新仓库
要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行:
$ git init
 如果当前目录下有几个文件想要纳入版本控制,需要先用 git add 命令告诉 Git 开始对这些文件进行跟踪,然后提交:
$ git add *.c
$ git add README
$ git commit -m 'initial project version'
 从现有仓库克隆
格式: git clone [url]。比如,要克隆 Ruby 语言的 Git 代码仓库 Grit,可以用下面的命令:
$ git clone git://github.com/schacon/grit.git
这会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录,然后从中取出最新版本的文件拷贝。如果进入这个新建的 grit 目录,你会看到项目中的所有文件已经在里边了,准备好后续的开发和使用。如果希望在克隆的时候,自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
唯一的差别就是,现在新建的目录成了 mygrit,其他的都和上边的一样。
Git 支持许多数据传输协议。之前的例子使用的是 git:// 协议,不过你也可以用 http(s):// 或者user@server:/path.git 表示的 SSH 传输协议。我们会在第四章详细介绍所有这些协议在服务器端该如何配置使用,以及各种方式之间的利弊。
记录每次更新到仓库
工作目录文件的两种状态:已跟踪或未跟踪。
已跟踪的文件是指本来就被纳入版本控制管理的文件,在上次快照中有它们的记录,工作一段时间后,它们的状态可能是未更新,已修改或者已放入暂存区。而所有其他文件都属于未跟踪文件。它们既没有上次更新时的快照,也不在当前的暂存区域。初次克隆某个仓库时,工作目录中的所有文件都属于已跟踪文件,且状态为未修改。
在编辑过某些文件之后,Git 将这些文件标为已修改。我们逐步把这些修改过的文件放到暂存区域,直到最后一次性提交所有这些暂存起来的文件,如此重复。所以使用 Git 时的文件状态变化周期如图 2-1 所示。
检查当前文件状态
$ git status
跟踪新文件
使用命令 git add 开始跟踪一个新文件。所以,要跟踪 README 文件,运行:
$ git add README
git add 的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area,同时未曾跟踪过的文件标记为需要跟踪。这样就好理解后续 add 操作的实际意义了
.gitignore的格式规范如下:
- 所有空行或者以注释符号 #开头的行都会被 Git 忽略。
- 可以使用标准的 glob 模式匹配。(所谓的 glob 模式是指 shell 所使用的简化了的正则表达式)
- 匹配模式最后跟反斜杠(/)说明要忽略的是目录。
- 要忽略指定模式以外的文件或目录,可以在模式前加上惊叹号(!)取反。
*)匹配零个或多个任意字符;[abc] 匹配任何一个列在方括号中的字符(这个例子要么匹配一个 a,要么匹配一个 b,要么匹配一个 c);问号(?)只匹配一个任意字符;如果在方括号中使用短划线分隔两个字符,表示所有在这两个字符范围内的都可以匹配(比如 [0-9] 表示匹配所有 0 到 9 的数字)。
     我们再看一个 .gitignore 文件的例子:
# 此为注释 – 将被 Git 忽略
# 忽略所有 .a 结尾的文件
*.a
# 但 lib.a 除外
!lib.a
# 仅仅忽略项目根目录下的 TODO 文件,不包括 subdir/TODO
/TODO
# 忽略 build/ 目录下的所有文件
build/
# 会忽略 doc/notes.txt 但不包括 doc/server/arch.txt
doc/*.txt
 查看已暂存和未暂存的更新
$ git diff
查看尚未暂存的文件更新了哪些部分,此命令比较的是工作目录中当前文件和暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容。
$ git diff --cached  
看已经暂存起来的文件和上次提交时的快照之间的差异,git diff --staged,效果和git diff --cached 命令相同的,但更好记些。提交更新
每次准备提交前,先用git status 看下,是不是都已暂存起来了,然后再运行提交命令 git commit:
$ git commit这种方式会启动文本编辑器以便输入本次提交的说明。(默认会启用 shell 的环境变量 $EDITOR 所指定的软件,一般都是 vim 或 emacs。当然也可以按照第一章介绍的方式,使用git config --global core.editor 命令设定你喜欢的编辑软件。)$ git commit -m "Story 182: Fix benchmarks for speed"跳过使用暂存区域
只要在提交的时候,给 git commit 加上 -a 选项,就可以自动add跟踪的并有改变的文件
$ git commit -a -m 'added new benchmarks'
 移除文件
$ git rm git status 时就会在 “Changes not staged for commit” 部分.这时要再运行一次git rm filename命令,从已跟踪文件清单中移除。
       -f(译注:即 force 的首字母),以防误删除文件后丢失修改的内容。
       $ git rm --cached readme.txt
比如一些大型日志文件或者一堆 .a 编译文件,不小心纳入仓库后,要移除跟踪但不删除文件,以便稍后在 .gitignore 文件中补上。
$ git rm log/\*.log
这是glob模式。此命令会删除log/目录下的所有以.log结尾的文件。星号 * 之前的反斜杠 \,因为 Git 有它自己的文件模式扩展匹配方式,所以我们不用 shell 来帮忙展开(译注:实际上不加反斜杠也可以运行,只不过按照 shell 扩展的话,仅仅删除指定目录下的文件而不会递归匹配。上面的例子本来就指定了目录,所以效果等同,但下面的例子就会用递归方式匹配,所以必须加反斜杠。) $ git rm \*~会递归删除当前目录及其子目录中所有~结尾的文件
移动(重命名)文件
$ git mv oldname newname
把oldname文件改名为newname查看提交历史
$ git log默认不用任何参数的话,git log会按提交时间列出所有的更新,最近的更新排在最上面。 看git log有许多选项可以帮助你搜寻感兴趣的提交,接下来我们介绍些最常用的。
$ git log   -p-p 选项展开显示每次提交的内容差异-2 则仅显示最近的两次更新.-n显示n条
     --stat,仅显示简要的增改行数统计
     --pretty 选项,可以指定使用完全不同于默认格式的方式展示提交历史。
     oneline 将每个提交放在一行显示,这在提交数很大时非常有用。另外还有 short,full 和 fuller 可以用,展示的信息或多或少有些不同
     $ git log --pretty = oneline
$ git log --pretty = full
$ git log --pretty = fuller 但最有意思的是 format,可以定制要显示的记录格式,这样的输出便于后期编程提取分析,像这样:
$ git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
085bb3b - Scott Chacon, 11 months ago : removed unnecessary test code
a11bef0 - Scott Chacon, 11 months ago : first commit
 表 2-1 列出了常用的格式占位符写法及其代表的意义。
选项   说明
%H  提交对象(commit)的完整哈希字串
%h  提交对象的简短哈希字串
%T  树对象(tree)的完整哈希字串
%t  树对象的简短哈希字串
%P  父对象(parent)的完整哈希字串
%p  父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s  提交说明
 --graph 选项,可以看到开头多出一些 ASCII 字符串表示的简单图形,形象地展示了每个提交所在的分支及其分化衍合情况。
      $ git log --pretty=format:"%h %s" --graph以上只是简单介绍了一些 git log 命令支持的选项。表 2-2 还列出了一些其他常用的选项及其释义。
选项  说明
-p  按补丁格式显示每个更新之间的差异。
--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(后跟指定格式)。
 使用图形化工具查阅提交历史
安装git log的可视化版本工具gitk
$ sudo apt-get install gitk$ gitk
撤消操作
修改最后一次提交
有时候我们提交完了才发现漏掉了几个文件没有加,或者提交信息写错了。想要撤消刚才的提交操作,可以使用--amend选项重新提交:
$ git commit --amend
如果刚才提交时忘了暂存某些修改,可以先补上暂存操作,然后再运行 --amend 提交:
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
上面的三条命令最终只是产生一个提交,第二个提交命令修正了第一个的提交内容。
取消已经暂存的文件
 (use "git reset HEAD <file>..." to unstage)$ git reset HEAD benchmarks.rb
 取消对文件的修改
#   (use "git checkout -- <file>..." to discard changes in working directory)
$ git checkout -- benchmarks.rb
 --amend 重新改写的提交,都可以被恢复(关于数据恢复的内容见第九章)。所以,你可能失去的数据,仅限于没有提交过的,对 Git 来说它们就像从未存在过一样。远程仓库的使用
查看当前的远程库
$ git remote它会列出每个远程库的简短名字,查看当前配置有哪些远程仓库,
在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库
 
$ git remote -v  
显示出克隆项目的地址.如果有多个远程仓库,此命令将全部列出
请注意,上面列出的地址只有 origin 用的是 SSH URL 链接,所以也只有这个仓库我能推送数据上去(我们会在第四章解释原因)。
添加远程仓库
要添加一个新的远程仓库,可以指定一个简单的名字,以便将来引用,运行
$ git remote add [shortname] [url]
例如:$ git remote add pb git://github.com/paulboone/ticgit.git
从远程仓库抓取数据
正如之前所看到的,可以用下面的命令从远程仓库抓取数据到本地:
$ git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,你就可以在本地访问该远程仓库中的所有分支,将其中某个分支合并到本地,或者只是取出某个分支,一探究竟。git pull,目的都是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支
。
推送数据到远程仓库
git push [remote-name] [branch-name]
如果要把本地的 master 分支推送到origin 服务器上(再次说明下,克隆操作会自动使用默认的 master 和 origin 名字),可以运行下面的命令:
$ git push origin master
 只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务查看远程仓库信息
git remote show [remote-name] 查看某个远程仓库的详细信息远程仓库的删除和重命名
重命名删除
$ git remote rename pb paul
$ git remote rm
打标签
列显已有的标签
$ git tag
 查看某个版本的标签:
$ git tag -l 'v1.4.2.*'
 新建标签
轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。
而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。
一般我们都建议使用含附注型的标签,以便保留相关信息;当然,如果只是临时性加注标签,或者不需要旁注额外信息,用轻量级标签也没问题。
含附注的标签
-a (译注:取 annotated 的首字母)指定标签名字$ git tag -a v1.4 -m 'my version 1.4'
 $ git show v1.4
 签署标签
-a 改为 -s (译注: 取signed 的首字母)即可:$ git tag -s v1.5 -m 'my signed 1.5 tag'
 轻量级标签
-a,-s或 -m 选项都不用,直接给出标签名字即可:
        $ git tag v1.4-lw验证标签
git tag -v [tag-name] (译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证:
        $ git tag -v v1.4.2.1后期加注标签
$ git log --pretty=oneline
我们忘了在提交 “updated rakefile” 后为此项目打上版本号 v1.2,没关系,现在也能做。只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)即可:$ git tag -a v1.2 9fceb02分享标签
git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行 git push origin [tagname] 即可:
        $ git push origin v1.5如果要一次推送所有本地新增的标签上去,可以使用 --tags 选项:
$ git push origin --tagsgit学习 #2:git基本操作的更多相关文章
- git学习——<五>git分支
		git学习——<一>git安装 git学习——<二>git配置文件 git学习——<三>git操作 git学习——<四>git版本管理 一.提出问题 今 ... 
- Git学习记录--git仓库
		Git是一款强大的版本控制工具,与svn相比git的分布式提交,本地仓库等在使用时确实比较方便.当然两者之间各有优劣,我在这里不多做比较.由于之前少有接触git,只是零星大致地了解一点,所以找时间系统 ... 
- git 学习(1) ----- git 本地仓库操作
		最近在项目中使用git了,在实战中才知道,以前学习的git 知识只是皮毛,需要重新系统的学一下,读了一本叫 Learn Git in a Month of Lunches 的书籍,这本书通俗易懂,使 ... 
- Git 学习之git 分支(三)
		Git 分支 几乎每一种版本控制系统都以某种形式支持分支.使用分支意味着你可以从开发主线上分离开来,然后在不影响主线的同时继续工作.在很多版本控制系统中,这是个昂贵的过程,常常需要创建一个源代码目录的 ... 
- Git 学习之Git 基础(二)
		Git 基础 读完本章你就能上手使用 Git 了.本章将介绍几个最基本的,也是最常用的 Git 命令,以后绝大多数时间里用到的也就是这几个命令.读完本章,你就能初始化一个新的代码仓库,做一些适当配置: ... 
- Git 学习之git 起步(一)
		起步 本章介绍开始使用 Git 前的相关知识.我们会先了解一些版本控制工具的历史背景,然后试着让 Git 在你的系统上跑起来,直到最后配置好,可以正常开始开发工作.读完本章,你就会明白为什么 Git ... 
- Git 学习之 Git Basics
		最近在用git,但git学习曲线实在是有点高. 好在找到一个文档 https://www.atlassian.com/git/tutorial/,以下就是学习笔记吧! git init git ini ... 
- git 学习记录—— git 中的仓库、文件状态、修改和提交操作等
		最近开始学习使用版本控制工具 git .学习方式主要通过阅读 git 网站上的 Pro git 和动手实践,使用的系统为 Ubuntu16.04LTS,以及 Windows 8.1. 本文主要关注 ... 
- git 学习(4) ----- git rebase
		使用git rebase 的前提是多人协作下的分支开发,如果是单人开发,那就没有必要使用它了,这是由git rebase 的作用所决定的,git rebase 有两大作用:一个是与主分支保持同步,一个 ... 
- Git学习之Git 暂存区
		============================= 修改文件后是否可以直接提交 ============================ (1) 向文件中追加一行内容 $ echo &quo ... 
随机推荐
- 精通 Oracle+Python,第 5 部分:存储过程、Python 编程
			调用数据库存储过程及其他感兴趣的高级 Python 编程功能. 2010 年 3 月发布 对于涉及数据库的软件开发来说,有两种主流开发方法:一种是在应用程序中(对于三层体系结构,也可以是在中间件中)实 ... 
- 转: QtCreator调试程序时GDB崩溃
			这个情况出现在QtCreator的2.5版以上,是由于新版QtCreator至少需要7.2 IIRC版的GDB.可以到:http://builds.qt-project.org/job/gdb-win ... 
- uoj164. 【清华集训2015】V   统计
			坑爹题面:http://uoj.ac/problem/164 正常题面: 对于一个序列支持下列5个操作: 1.区间加x 2.区间减x并与0取max 3.区间覆盖 4.单点查询 5.单点历史最大值查询 ... 
- PC和单片机通过MODBUS RTU通信
			最近研究了一下MODBUS通信,在STC12C5A60S2单片机上实现了MODBUS协议的部分功能,方便上位机从单片机系统上获取数据,比如由单片机获取的温度.湿度.或者控制信号的状态等.有了MODBU ... 
- [BZOJ 1218] [HNOI2003] 激光炸弹 【n logn 做法 - 扫描线 + 线段树】
			题目链接:BZOJ - 1218 题目分析 可以覆盖一个边长为 R 的正方形,但是不能包括边界,所以等价于一个边长为 R - 1 的正方形. 坐标范围 <= 5000 ,直接 n^2 的二维前缀 ... 
- NEURAL NETWORKS, PART 1: BACKGROUND
			NEURAL NETWORKS, PART 1: BACKGROUND Artificial neural networks (NN for short) are practical, elegant ... 
- 用了OneAPM CT,宕机早知道!
			Twitter 的公司网站和移动应用在 1 月 19 日早上出现宕机,导致全球部分地区用户无法正常访问.这次宕机影响了很多用户,英国和印度用户已经无法访问 Twitter .第三方监测机构 DownD ... 
- spring 动态数据源
			1.动态数据源: 在一个项目中,有时候需要用到多个数据库,比如读写分离,数据库的分布式存储等等,这时我们要在项目中配置多个数据库. 2.原理: (1).spring 单数据源获取数据连接过程: ... 
- 2015第44周六tomcat集群了解
			对于WEB应用集群的技术实现而言,最大的难点就是如何能在集群中的多个节点之间保持数据的一致性,会话(Session)信息是这些数据中最重要的一块.要实现这一点,大体上有两种方式,一种是把所有Sessi ... 
- unity3d Human skin real time rendering 真实模拟人皮实时渲染
			先放出结果图片...由于网上下的模型是拼的,所以眼皮,脸颊,嘴唇看起来像存在裂痕,解决方式是加入曲面细分和置换贴图 进行一定隆起,但是博主试了一下fragment shader的曲面细分,虽然细分成功 ... 
