pro-git-v1笔记
pro git v1读书笔记
第一章 起步
初次运行Git前的配置
git配置信息有三个级别,分别保存在不同地方,保存在以下三个地方,后面的配置会覆盖前面的配置
/etc/gitconfg
文件:系统级配置,适用于系统中所有用户使用git config --system
进行配置~/.gitconfig
文件:用户级配置,使用git config --global
进行配置.git/config
文件:当前项目git目录中的配置文件,仅针对本项目有效
用户信息
配置用户名称和邮箱地址。每次提交时git都会应用这两条信息,说明谁提交了更新
git config --global user.name "John doe"
git config --global user.email johndoe@example.com
文本编辑器
git需要你输入额外信息时会使用此编辑器。默认是vim或者vim
git config --global core.editor emacs
差异分析工具
在解决合并冲突时使用哪种差异分析工具。
git config --global merge.tool vimdiff
查看配置信息
git config --list
如果看到重复变量名,说明他们来自不同配置文件。git采用最后一个。
查看特定设置时:
git config user.name
获取帮助
git help <verb>
git <verb> --help
man git-<verb>
第二章 git基础
2.1 取得项目的git仓库
有两种取得git项目仓库的方法。一种是在现存的目录下通过导入所有文件来创建新的git仓库。第二种是从已有的git仓库克隆出一个新的镜像仓库来。
在工作目录中初始化新仓库
要对现有的某个项目使用git管理,秩序到此项目所在的目录执行:
git init
如果当前目录下有几个文件想要纳入版本控制,首先要用git add
命令告诉git开始对这些文件进行跟踪,然后提交:
git add *.c
git add README
git commit -m "initial project version"
从现有仓库克隆
如果想对某个开源项目出一份力,可以先把该项目的git仓库复制一份出来,这就需要用到git clone
命令。
git clone git://github.com/schacon/grit.git
记录每次更新到仓库
跟踪新文件
使用git add
开始跟踪一个新文件,要跟踪readme,运行:
git add readme
此时运行git status
会看到readme文件已经被跟踪,并处于暂存状态。
忽略某些文件
一般我们总会有些文件无需纳入git的管理,也不希望它们总出现在未跟踪文件列表。通常都是些自动生成的文件,比如日志文件,或者编译过程中创建的临时文件等。我们可以创建一个.gitignore
文件,列出要忽略的文件模式:
cat .gitignore
*.[oa]
*~
第一行告诉git忽略所有.o
或.a
结尾的文件。一般这类对象文件和存档文件都是编译过程中出现的,我们用不着跟踪他们的版本。第二话告诉git胡洛所有波浪符~
结尾的文件,许多文本编辑软件都是用这样的文件名保存副本。堤外,可能还需要忽略log
,tmp
或者pid
目录,以及自动生成的文档等等。要养成一开始就设置好.gitignore
文件的习惯,一面将来误提交这类无用的文件。.gitignore
的格式规范如下:
- 所有空行或者以注释符号
#
开头的行都会被忽略 - 可以使用标准的glob模式匹配
- 匹配模式最后跟反斜杠
/
说明要忽略的是目录 - 要忽略指定模式以外的文件或目录,可以再模式签加惊叹号
!
取反
如何让git跟踪目录但是不跟踪目录下面的文件
在该目录下添加.gitignore
文件,内容如下:
# Ignore everything in this directory
*
# Except this file
!.gitignore
查看已暂存和未暂存的更新
实际上git status
的显示比较简单,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,可以用
git diff
命令。
加入修改readme
文件后暂存,然后修改aaa.txt
文件后不暂存。运行git status
要查看尚未暂存的文件更新了哪些部分。不加参数直接输入git diff
,此命令比较的是工作目录中当前文件盒暂存区域快照之间的差异,也就是修改之后还没有暂存起来的变化内容
若要看一集暂存起来的文件盒上次提交时的快照之间的差异,可以用git diff --cached
。git1.6.1及更高版本还允许使用
git diff --staged
效果是相同的,但更好记。
提交更新
确保需要提交的文件都git add
之后,允许提交命令
git commit -m "message"
跳过使用暂存区域
在commit时添加-a
选项即可跳过git add
:
git commit -a -m "added aaa.txt"
移除文件
使用git rm <filepath>
可以删除指定文件并在暂存区中进行标记,下一次commit时文件就会从仓库中删除。
如果手动删除文件,同样需要使用git rm <filepath>
,下一次提交时从仓库删除。
如果想要从仓库中移除已经跟踪了的文件,同时要在工作目录保存,需要执行git rm --cached <filepath>
,然后在.gitignore
中添加文件信息,下一次commit则文件从git中排除,同时保存在工作目录下。
查看提交历史
git log
按提交顺序列出所有提交记录
git log -p -2
显示最近两次提交更新。同时显示内容差异
撤销操作
修改最后一次提交
有时候提交完发现漏掉几个文件没有添加,或者提交信息写错了。使用git commit --amend
可以补充遗漏操作并且在记录中只显示一次提交。
git add aaa.txt
git commit -m "add aaa.txt and bbb.txt"
git add bbb.txt
git commit --amend
以上命令产生一次提交记录。
取消已经暂存的文件
如果不小心git add aaa.txt
把文件提交到了暂存区。使用git reset HEAD <filepath>
即可从战存取中清除刚才的记录。
取消对文件的修改
git checkout -- <filepath>
以上命令使用前一个版本的文件覆盖当前的修改。这个命令会丢弃修改,需谨慎运用
将工作目录回滚到最近一次提交
git reset --hard HEAD
远程仓库的使用
查看当前的远程仓库
git remote
可以查看配置的远程仓库。git remote -v
显示仓库对应地址
添加远程仓库
git remote add [shortname] [url]
添加一个新的远程仓库,并制定简单名字,以便将来引用
从远程仓库抓取数据
git fetch [remote-name]
从远程仓库抓取你本地仓库中还没有的数据。运行完成后,你就可以再本地访问该远程仓库中的所有分支,将其中某个分支合并到本地。
如果是克隆了一个仓库,此命令会自动将远程仓库命名为origin,所以git fetch origin
会抓取别人上传到此远程仓库中的所有更新。有一点很重要,需要记住,fetch命令知识将远端的数据拉到本地仓库,并不自动合并到当前工作分支。
如果设置了某个分支用于跟踪某个远端仓库的分支。可以使用git pull
自动抓取数据,然后将远端分支自动合并到本地仓库中当前分支。在日常工作中我们经常这么用,默认情况下git clone
命令本质上就是自动创建了本地的master分支用于跟踪远程仓库中的master分支。所以我们运行git pull
是要从原始克隆的远端仓库中抓取数据后,合并到工作目录中的当前分支。
推送数据到远程仓库
项目进行到一个阶段,要同别人分享目前的成果,可以将本地仓库中的数据推送到远程仓库。实现这个任务的命令很简单:git push [remote-name] [branch-name]
。如:
git push origin master
只有所克隆的服务器上有写权限,并且同一时刻没有其他人在推送数据,这条命令才能如期完成。如果在你推送数据之前,已经有其他人推送了若干更新,那你的推送操作会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。
查看远程仓库信息
我们可以通过命令git remote show [remote-name]
查看某个远程仓库的详细信息,
远程仓库的删除和重命名
git remote rename [old-name] [new-name]
将old-name修改成new-name
git remote rm [romote-name]
删除远程仓库地址信息
打标签
git可以对某一时间点上的版本打上标签。人们在发布某个软件版本如1.0时,经常这么做。
列出已有标签
git tag
命令用于列出所有标签。结果按照字母顺序排列,也可以用指定的搜索模式
列出符合条件的标签:git tag -l 'v1.4.2.*'
新建标签
git使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)。轻量级标签就像是一个不会变化的分支,实际上它就是指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身允许使用GNU Privacy Guard来签署或验证。一般建议使用含附注型的标签,以便保留相关信息。
含附注的标签
创建一个含附注类型的标签非常简单,用-a
指定标签名即可:
git tag -a v1.4 -m 'my version 1.4'
-m
选项指定了对应的标签说明。git会将此说明一同保存在标签对象中。如果没有给出该选项,git会启动文本编辑软件供你输入标签说明。
可以使用git show
查看相应标签的版本信息,并连同显示打标签时的提交对象。
轻量级标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件,要创建这样标签。直接给出标签名字即可。
git tag v1.5
分享标签
默认情况下,git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库,其命令格式如同推送分支,运行git push origin [tagname]
即可