待解决的问题:
如何查看merge的记录,貌似将dev的修改合并到master之后,不论master还是dev中使用log查看,只能看到提交的记录,没有看到merge记录
1、git的配置
git有许多的配置,使用git config xxx命令进行配置,配置可以作用于全局或者某个仓库或者某个文件。
配置用户名和密码:
git config --global user.name "xxx"
git config --global user.email "xxx"
密码不能这样直接设置,需要修改相应的文件
git config --global core.editor xxx
配置使用的文本编辑器
设置差异比较工具,见3
–global就表示全局的,不加表示仓库的
2、gitignore的编写
在git管理器的目录下,创建.gitignore文件,里面写入要忽略的内容,用于忽略不需要跟踪的文件,如编译生成的文件等,这个很常用的,
里面使用glob方式匹配需要的文件,特别的:
(1)其中以/结尾表示文件夹
(2)#代表相当于// 注释
(3)!XXX 表示xxx文件除外,对于忽略目录时,又不想其中某个子文件被忽略需要
3、windows下设置 beyond compare 3 为 git 的对比工具。
首先需要先安装 beyond compare 3 工具,切记需要安装安装版的,不要搞绿色版的。
mac下使用 Kaleidoscope,具体步骤请看
http://www.cnblogs.com/ayseeing/p/4453685.html
git查看有哪些对比工具可以设置命令:
$ git difftool --tool-help
然后再设置对比工具,如:
$ git config --global diff.tool bc3
#表示beyond compare 3
$ git config --global difftool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"
设置默认的合并工具设置和对比工具类似:
$ git config --global merge.tool bc3
$ git config --global mergetool.bc3.path "c:/program files/beyond compare 3/bcomp.exe"
也可以直接修改.gitconfig文件,直接增加如下:
[diff]
tool = bc3
[difftool “bc3”]
path = d:/program files/beyond compare 3/bcomp.exe
[merge]
tool = bc3
[mergetool “bc3”]
path = d:/program files/beyond compare 3/bcomp.exe
具体地址根据个人电脑配置。
设置好后,使用命令是 git difftool 而不是之前的 git diff 了。
* 3、git diff 的使用:*
git diff 比较当前文件和暂存区文件的差异,这没太大用
git diff --stat
查看简单的diff结果
比较时的操作主要有两种:
当前版本的与其他版本,任意两个版本
git diff xxx 当前版本与另外版本之间的差异,如下
git diff test
与分支test当前版本的差异
git diff HEAD
比较当前工作版本与HEAD的差别
git diff --staged
git diff --cached
这两个一样,比较暂存区与上次提交时的快照HEAD之间的差异
git diff Axx Bxx 比较Axx与Bxx之间的差异,可以是版本间,也可以是分枝间,如:
git diff dev master
比较dev与master当前版本的差异
git diff dev...master
比较dev与master分开之后,master分支上的change
git diff HEAD^HEAD
上次和上上次
git diff SHA1 SHA2
两个历史版本
还可以比较本地和远程服务器之间的差异,后面学到再涉及:
4、添加
git add xxx
有几个作用,创建新文件后使用此命令将其加入到跟踪文件集,并且添加到暂存区中。另一个是对已跟踪的文件,将其修改添加到暂存区中。 还有..
git add . 添加所有文件
对于空文件夹,add 不起作用,无法添加
5、提交
git commit -m 'xxxx'
提交并输入massage,不加-m参数,git会弹出文本编辑器来要求输入,
注意这样的提交只是将暂存区域的内容提交了,未暂存的修改是没有提交的。
加上-a参数,就会将未暂存的修改一起提交。
git commit -a -m 'xxxx'
如果不输入-m参数,会进入提交信息编写界面,编写界面提交信息后退出,windows上的退出方法是,按esc,输入: ,再输入wq,这样就保存好了提交信息,并退出了。
6、移除文件
从工作目录中移除,使用文件管理器或者其他应用删除除,或者git bash下面的rm xxx
命令
如果文件未被跟踪,删除之后会从未跟踪列表中消失,没有其他记录。
如果文件已被跟踪,会删除文件并添加添加一条删除记录,自然的,这样也会删除跟踪。
git rm xxx
只删除跟踪区文件,未跟踪不管,如果文件有任何修改,则无法删除。删除文件, 并添加一条删除记录。
只从git版本控制系统中移除,即不再跟踪改文件,使用
git rm --cached xxx
不管是已提交还是修改了的,都会移除跟踪。然后会有一条删除记录。
其它的,
git rm -r xxx
对于删除目录
git rm log/\*.log
使用glob匹配删除的文件,自然的,\表示会匹配子文件的路径,否则只处理当前文件夹下的。
* 7、移动文件*
git mv file_from file_to
重命名也就相当于移动,因为有暂存提交等记录,相当于执行了三条命令
mv README.txt README $ git rm README.txt $ git add README
8、查看历史、log
git log
会按时间从近到远列出所有的提交,包括
校验和、提交者、时间、提交信息
通过它的参数进行过滤,得出想要的信息,比如同时显示差异,某个人的,近几次的,产生合并的
主要分两类,
一种是控制格式、长短等
如下:
选项 说明
-n 表示显示最近n次的提交
-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(后跟指定格式)。
其中,
–pretty 进一层的筛选控制
有: oneline short full fuller等
git log --pretty=oneline
ca82a6dff817ec66f44342007202690a93763949 changed the version number......
只用一行显示一次提交
git log --pretty=format:"%h - %an, %ar : %s"
ca82a6d - Scott Chacon, 11 months ago : changed the version number
…….
指定log显示的格式,占位符含义如下
选项 说明
%H 提交对象(commit)的完整哈希字串
%h 提交对象的简短哈希字串
%T 树对象(tree)的完整哈希字串
%t 树对象的简短哈希字串
%P 父对象(parent)的完整哈希字串
%p 父对象的简短哈希字串
%an 作者(author)的名字
%ae 作者的电子邮件地址
%ad 作者修订日期(可以用 -date= 选项定制格式)
%ar 作者修订日期,按多久以前的方式显示
%cn 提交者(committer)的名字
%ce 提交者的电子邮件地址
%cd 提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
另一种是过滤:
选项 说明
-n 仅显示最近的 n 条提交
--grep 根据提交信息中的关键字过滤(自然的)
--since, --after 仅显示指定时间之后的提交。
--until, --before 仅显示指定时间之前的提交。
--author 仅显示指定作者相关的提交。
--committer 仅显示指定提交者相关的提交。
例子:
git log --pretty="%h - %s" --author=gitster --since="2008-10-01" \ --before="2008-11-01" --no-merges -- t/
5610e3b - Fix testcase failure when extended attribute
.....
使用图形化的工具查看log
由于多分支,加上多提交等,git的log会比较复杂,使用专门的针对log的图形化工具来看有比较方便的地方。
输入gitk即可启动默认的查看工具
如图上半个窗口显示的是历次提交的分支祖先图谱,下半个窗口显示当前点选的提交对应的具体差异。
log的终于完了,实际上还有好多log参数没有涉及
二、撤销操作
编写代码或其它编辑过程中,总是会有各种的撤销需要,自然git要有相应的支持。
修改最后一次提交
当我们提交完了之后才发现刚才提交写了错别字,或者忘了提交几个文件,想要撤销刚才的提交操作,可以使用一些相关命令重新提交,最终只产生一次提交。
git commit --amend
重新填写提交信息,会打开提交信息编辑窗口,里面以填入已有的上次写好的编辑信息,改之即可。
此命令会进入git自带的编辑器(可修改), 按C开始输入信息,输入完成之后按ESC退出编辑,退出之后在英文状态下输入:,在输入wq保存退出
$ git commit -m 'initial commit'
$ git add forgotten_file
$ git commit --amend
对于修改了某个文件但没有暂存,因此没有提交,在做任何新的修改之前,可以使用这个命令,将其加到暂存区后,再提交。
取消已暂存的文件, 将其从暂存区返回到已修改未暂存的区域中
git reset HEAD xxxx
取消对文件的修改
git checkout -- xxxx
这个命令是只对修改未暂存的文件有效,对其它是无效的。
这个命令也是危险的因为它意味着这个修改将在文件系统中永久丢失。如果只是想回退版本,同时保留刚才的修改以便将来继续工作,可以用下章介绍 的 stashing 和分支来处理,应该会更好些。
重要的:在git中,一般情况下,任何提交过得东西都可以恢复,你可能失去数据的,仅限于那些没提交过的才不能恢复。
貌似需要
git checkout . 撤销所有本地未提交的修改,git checkout – xxx是用于撤销某个文件的。
* 撤销commit*
只撤销commit操作,保留修改的数据,即将上次的从提交区放到未提交的区
git reset HEAD~
三、远程仓库的使用
git的同一个本地仓库(项目),可以对应多个远程的仓库。比如在github一个仓库,在国内的oschina有一个镜像备份等(竟然还有这种,git也真是只有想不到,没有做不到了),远程仓库有些只能读,有些可以写。自然有增删改查操作,可以增删关联的远成仓库,本地命令等等,以及管理不同远程仓库的不同分支(远程库的分支也是由本地操作进而管理的),定义是否跟踪这些分支等等。
在克隆完某个项目后,至少可以看到一个名为 origin 的远程库,Git 默认使用这个名字来标识你所克隆的原始仓库。
增加一个远程仓库
git remote add pb git://github.com/paulboone/ticgit.git
删除一个关联的远程仓库
git remote rm XXX
重命名远程仓库的本地名
git remote rename Axx Bxxx
查看远程仓库的信息
git remote 会列出当前关联的所有远程仓库的名称
git remote -v 会在列出的名称后面加上地址
git remote show [remote-name]会显示更加详细的信息
包括没有同步到本地的分支,远程仓库中已删除或者有改动的分支,推送时本地分支默认推送到哪个服务器分支,git pull时哪些分支将被自动合并。
四、添加tag
同大多数svn一样,git允许为某一时间节点上的版本打上tag,tag默认打在当前head指向的提交版本上,同意一个版本可以打上多个的tag。
添加:
git tag -a v0.1 -m "version 0.1 released" 3628164
较为完整的
-a 表示tag
-m 表示提示信息
最后加上数字表示打到某个版本上
git tag -s v0.1 -m "version 0.1 released" 3628164
其中的a换成s,表示用私匙将标签对象签名,
删除:
git tag -d v0.1
从远程删除:
git push origin :refs/tags/v0.9
有格式
显示标签内容:
git show [tagname]
显示tagname该标签对应的标签信息和所属的提交信息,
验证标签
git tag -v [tag-name]
需要一定配置
分享标签
默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行git push origin [tagname]
即可:
一次推送所有标签使用
git push origin --tags
五 技巧和窍门
1、输入几个字母后双击tab,git会给与相应的提示,也就是自动完成的提示
2、别名
用其他字符串代替某条命令,起到快捷输入的作用
比如:
git config --global alias.last 'log -1 HEAD'
这样之后输入git last就和输入 git log -1 HEAD 一样了
注意上面的别名前面默认加了git ,如果想要不加,使用
git config --global alias.visual "!gitk"
即可
第一篇, 完