Git基础
1 获取Git仓库
第一种:把现有的目录或者项目导入Git中
第二种:从服务器上克隆现有的Git仓库
1.1 在现有目录中初始化现有仓库
进入项目目录输入:
$ git init
若进行版本控制,要开始进行追踪和初次提交:
$ git add *.c
$ git add LICENSE
$ git commit -m 'initial project version'
稍后解释这些命令的含义
1.2克隆现有仓库
克隆命令:
$ git clone https://github.com/libgit2/libgit2 mylibgit //mylibgit 是目标目录,可省
与其他的版本控制的‘checkout’命令不同,Git的‘clone’会对服务器仓库的几乎所有数据进行完整的复制,而不只是复制当前的工作目录
2 在Git仓库中记录变更
2.1 查看当前状态
主要工具:
$ git status
如果在克隆完仓库立即执行,则会显示如下信息:
$ git status
On branch master
nothing to commit, working directory clean
2.2 跟踪新文件
执行以下命令跟踪README文件:
$ git add README
2.3 暂存已修改文件
$ git add CONTRIBUTING.md
git add 命令既可以原来跟踪文件,也可以用来暂存文件,同时也可以做一些其他的事情。可以把它理解为‘添加内容到下一次提交’,而不是‘把这个文件加入到项目中’。
如果在执行git add 之后又对文件进行了修改,需要再一次执行git add命令。
2.4 显示更加简洁的状态信息
$ git status -s
或者
$ git status --short
M README
MM Rakefile
A lib/git.rb
M lib/simplegit.rb
?? LICENSE.txt
??:未跟踪的新文件
A:已暂存的新文件
M:已修改的文件
2.5 忽略文件
如果你想忽略一些自动生成的文件(例如日志文件),这样的情况下你可以创建一个名为.gitignore的文件,在其中列出待匹配文件模式,例如:
$ cat .gitignore
#告诉Git忽略所有以.a .o结尾的文件
*.[oa]
#忽略所有以~结尾的文件
*~
.gitignore 文件中匹配模式的规则如下:
- 空行或以#开始的行会被忽略
- 支持标准的glob模式
- 以斜杠(/)开头的模式可用于禁止递归匹配
- 以斜杠(/)结尾的模式表示目录
- 以感叹号(!)开始的模式表示取反
2.6 查看已暂存和未暂存的变更
查看尚未添加到暂存区的变更:
$ git diff
查看已暂存的内容会进入下一次提交:
$ git diff --staged
如果你更喜欢图形化或外部的diff查看程序,那么还有另外一种方法可以用来浏览差异结构。执行 git difftool,这样就能在emerge、vimdiff等其他软件中查看差异。使用git difftool --tool -help可查看系统中的可用diff工具。
2.7 提交变更
最简单的提交方式就是:
$ git commit
直接在命令行上键入提交的信息:
$ git commit -m "Story 182:Fix benchmarks for speed"
2.8 跳过暂存区
$ git commit -a -m 'added new benchmarks'
2.9 移除文件
$ git rm PROJECTS.md
下次提交的时候这个文件就不存在了,也不会被git跟踪管理
如果你想把文件保留在工作目录,但是从暂存区移除该文件,只需要使用--cached选项即可:
$ git rm --cached README
2.10 移动文件
无论你是使用git的mv命令,还是直接给文件改名,Git都能推断出这是重命名的操作
$ git mv README.md README
3 查看提交历史
$ git log
git log 有很多不同的选项,可以直观的展示所需要的内容。
选项-p,还可以加上-2,最近两次提交所引入的差异:
$ git log -p -2
选项 --stat,可以查看每个提交的简要统计信息
$ git log --stat
另外一个颇为有用的选项是 --pretty,它可以更改日志输出的默认格式
$ git log --pretty==oneline
除了online之外,short、full、和fuller格式选项分别比默认输出减少或增加一些信息。最值得注意的选项是format,它允许你指定自己的输出格式
$ git log --pretty=format:"%h - %an, %ar : %s"
格式选项 | 输出的格式描述 |
%H | 提交对象的散列值 |
%h | 提交对象的简短散列值 |
%T | 树对象的散列值 |
%t | 树对象的简短散列值 |
%P | 父对象的散列值 |
%p | 父对象的简短散列值 |
%an | 作者的名字 |
%ae | 作者的电子邮箱地址 |
%ad | 创作日期(可使用-date=选项指定日期格式) |
%ar | 相对于当前日期的创作日期 |
%cn | 提交者的名字 |
%ce | 提交者的电子邮箱地址 |
%cd | 提交日期 |
%cr | 相当于当前日期的提交日期 |
%s | 提交信息的主题 |
限制提交历史的输出范围
$ git log --since=2.weeks
选项 | 描述 |
-(n) | 只显示最新的n次提交 |
--since,--after | 只输出指定日期之后的提交 |
--until,--before | 只输出指定日期之前的提交 |
--auth | 只输出作者与指定字符串匹配的提交 |
--committer | 只输出提交者与指定字符匹配的提交 |
--grep | 只输出提交信息包含指定字符串的提交 |
-S | 只输出包含“添加或删除指定字符串”的更改的提交 |
4 撤销操作
4.1 撤销已暂存的文件
$ git reset HEAD filename
4.2 撤销对文件的修改
$ git checkout -- 文件名
这是一条很危险的命令,因为上述命令用之前的版本做了覆盖,除非你确信不需要这些文件,否则不要使用这个命令。
5 远程仓库的使用
5.1 显示远程仓库
$ git clone http://github.com/schacon/ticgit
5.2 添加远程仓库
$ git remote add pb https://github.com/paulboone/ticgit
现在你可以在命令行中使用pb字符代替完整的url。比如,要获取Paul拥有而你还没拥有的全部数据,可以执行下面命令:
$ git fetch pb
5.3 从远程仓库获取和拉取数据
$ git fecth [remote-name]
5.4 将数据推送到远程仓库
$ git push origin master
5.5 检查远程仓库
$ git remote show origin
5.6 删除和重命名远程仓库
#重命名
$ git remote rename pb paul
#删除
$ git remote rm paul