git指令 小记-01
git 三种状态 :
commited(已提交) 已经保存在本地数据库
modified(已修改) 已修改某个文件,但是没有提交保存
staged(已暂存) 把已修改的文件放在下次提交时要保存的清单中
git 管理项目时,文件流转的三个工作区域:
git的本地数据目录;
工作目录;
暂存区域。
基本的git工作流程如下所示:
1 在工作目录中修改某些文件
2 对这些修改了的文件作快照,并保存在暂存区域
3 提交更新,将保存在暂存区域的文件快照转储到git目录中
用户信息
第一个配置的是你个人的用户名称和电子邮件地址。
git config --global user.name 'zhangsan'
git config --global user.email '222@qq.com'
如果使用了--global选项那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。如果要在某个特定的项目中使用其他名字或者电邮,只要去掉--global选项重新配置即可,新的设定保存在当前项目的.git/config的文件里。
查看配置信息
git config --list
也可以直接查阅某个环境变量的设定,只要特定的名字更在后面即可。
git config user.name
获取帮助,要学习config命令可以怎么用:
git help config
查看提交历史
git log
git log -1 则仅显示最近的两次更新
git log -p 显示每次提交的内容差异
git log -p -1 仅显示最近一次更新的内容差异
git log --stat 仅显示简要的增改行数统计
git log --pretty ,可以指定使用完全不同于默认格式的方式展示提交历史。
oneline:将每个提交放在一行显示
short full fuller
demo:git log --pretty=oneline
format:可以定制要显示的记录格式,这样的输出便于后期编程提取分析
git log --pretty=format:"%h - %an, %ar : %s"
%H:提交对象的完整哈希字串 %h:提交对象的简短哈希字串
%T:树对象的完整哈希字串 %t:树对象的简短哈希字串
%P:父对象的完整哈希字串 %p:父对象的简短哈希字串
%an 作者的名字
%ae 作者的电子邮件地址
%ad 作者修订日期,按多久以前的方式显示
%ar 作者修订日期,按多久一起拿的方式显示
%cn 提交者的名字
%ce提交者的电子邮件地址
%cd提交日期
%cr 提交日期,按多久以前的方式显示
%s 提交说明
用oneline 或format 时结合 --graph 选项,可以看到开头多出一些ASCII字符串表示的简单图形,形象地展示了每个提交所在的分支以及其分化衍合情况。
取得项目的git仓库
1 从当前目录初初始化: 1 git init 2 git add . 3 git commit ...
2 从现有仓库克隆: git clone 仓库地址
git add 命令告诉gti开始对这些文件进行跟踪,可以接要跟踪的文件或目录的路径。
git status:
未跟踪的文件列表在"Untracked files"这行下面
已暂存状态在"Changes to be committed"这行下面
查看已暂存和未暂存的更新
git status的显示比较简单,仅仅是列出了修改过的文件,如果要查看具体修改了什么地方,可以用git diff 命令。
查看尚未暂存的文件更新了哪些部分,不加参数直接git diff
查看已经暂存起来的文件和上次提交时的快照之间的差异,可以攻git diff --cached//更高版本,可以使用 git diff --staged
git commit -m '注释'
跳过使用暂存区域
git commit -a -m '注释信息'
移除文件 git rm readme.txt
git rm 连带从工作目录中删除指定的文件,这样右后就不会出现在未跟踪文件清单中了。
如果删除之前修改过并且已经放在暂存区域的话,则必须要用强制删除选项 -f ,以防误删除文件后丢失修改的内容
git rm -f readme.txt
如果只是想把文件从git仓库中删除(亦即从暂存区域移除),但任然希望保留在当前工作目录中。仅仅从跟踪清单中删除,比如误提交的文件,需要移除跟踪但不删除文件,以便稍后在.gitignore文件中补上,用--cached
git rm --cached readme.txt
可以目录或者文件的名字
移动文件
文件改名 git mv file_form file_to
git 支持许多数据传输协议:
1 之前的例子使用的是git://协议,
2 也可以使用http(s)://
3 user@server:/path.git表示SSH传输协议
忽略某些文件,.gitignore文件, 列出需要忽略的文件模式
格式规范:
所有空行或者注释符号#开头的行都会被Git忽略
可以使用标准的glob模式匹配,glob模式是指shell所使用的的简化了的正则表达式。星号(*)匹配0个或多个任意字符
匹配模式最后反斜杠(/)说明要忽略的是目录
要忽略指定模式以外的文件或目录,可以在模式前家哈桑惊叹号(!)取反
作者和提交者之间究竟有何差别,其实作者指的是实际作出修改的人,提交者指的是最后将此工作成果提交到仓库的人。所以,当你为某个项目发去补丁,然后某个核心成员将你的补丁并入项目时,你就是作者,而那个核心成员就是提交者。
撤销操作
1 修改最后一次提交
提交之后发现漏掉几个文件,或者提交信息写错了,想要撤销刚才的提交操作,可以使用--amend选项重新提交“
git commit --amend
如果没有修改,只是最近一次提交的人的备注信息,直接git commit --amend '信息',这样就会使用新的提交说明覆盖刚才失误的提交。
如果刚才提交时忘了暂存某些文件,可以先补上暂存操作,然后再运行--amend提交:
git commit -m 'initial commit'
git add forgotten_file
git commit --amend
上面三条命令最终得到一个提交,第二个提交命令修正了第一个的提交内容。
取消已经暂存的文件
修改过的文件,使用git add .,但是其中一个文件不想提交了,git reset HEAD <file>...方式取消暂存。
git reset HEAD readme.txt
这样readme.txt文件又回到了之前已修改未暂存的状态
取消对文件的修改
git checkout <file>...
git checkout readme.txt 之前对于readme.txt文件的修改就都没有了,请务必确定真的不再需要保留刚才的修改。
如果只是想回退版本,同时保留刚才的修改以便将来继续工作,可以使用stashing和分支来处理
远程仓库
托管在网络上的项目仓库
查看当前的远程库
git remote 会列出每个远程库的简短名字。在克隆完某个项目后,至少可以看到一个名为origin的远程库,
git默认使用这个名字来标识你所克隆的原始仓库。
git remote -v (--verbose)显示对应的克隆地址
如果有多个远程仓库,此命令将全部列出。
添加远程仓库
git remote add [shortname] [url]:
git remote add pd git://github.con/paulboone/ticgit.git
现在就可以使用字串pb指代对应的仓库地址了。仓库默认名字是origin
从远程仓库抓取数据
git fetch pb
git fetch [remote-name]
此命令会到远程仓库中拉取所有你本地仓库中还没有的数据。运行完成后,必究可以在本地访问该远程仓库中的所有分支
推送数据到远程仓库
git push [remote-name] [branch-name]。如果要把本地的master分支推送到origin服务器上(再次说明下,克隆操作会自动使用默认的master和origin名字)可以运行下面的命令:
git push origin master
查看远程仓库信息
git remote show [remote-name] 查看某个远程仓库的详细信息,比如要看所克隆的origin仓库,可以运行:
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 remote rename 命令修改某个远程仓库的简短名称
git remote rename pb paul 修改远程仓库名字pb为paul
删除远程仓库 git remote rm paul
git标签
打标签
git可以对某一时间点的版本打上标签。
列出已有的标签 git tag(显示的标签按字母顺序排列,标签的先后不表示重要程度的轻重)
特定的搜索模式列出符合条件的标签
git tag -l 'v1.4.2.*'
新建标签
标签有两种类型: 轻量级的和含附注的。
轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含标签的名字 电子邮箱地址和日期,以及标签说明,标签本身也允许使用GPG来签署或验证。一般建议使用含附注型的标签
含附注的标签
创建一个含附注类型的标签非常简单,用 -a指定标签名字即可:
git tag -a v1.4 -m 'my version 1.4'
-m选项则指定了对应的标签说明,git会将此说明一同保存在标签对象中。如果在此选项后没有给出具体的说明内容,git会启动文本编辑软件供你输入。
git show 命令查看相应标签的版本信息,并连同显示打标签时的提交对象。
git show v1.4
$ git show v1.4
tag v1.4
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 14:45:11 2009 -0800
my version 1.4
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
签署标签
如果你有自己的私钥,还可以用GPG来签署标签,只需要把之前的-a改为-s即可。
git tag -s v1.5 -m 'my signed 1.5 tag'
$ git tag -s v1.5 -m 'my signed 1.5 tag'
You need a passphrase to unlock the secret key for
user: "Scott Chacon <schacon@gee-mail.com>"
1024-bit DSA key, ID F721C45A, created 2009-02-09
$ git show v1.5
tag v1.5
Tagger: Scott Chacon <schacon@gee-mail.com>
Date: Mon Feb 9 15:22:20 2009 -0800
my signed 1.5 tag
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.8 (Darwin)
iEYEABECAAYFAkmQurIACgkQON3DxfchxFr5cACeIMN+ZxLKggJQf0QYiQBwgySN
Ki0An2JeAVUCAiJ7Ox6ZEtK+NvZAj82/
=WryJ
-----END PGP SIGNATURE-----
commit 15027957951b64cf874c3557a0f3547bd83b3ff6
Merge: 4a447f7... a6b4c97...
Author: Scott Chacon <schacon@gee-mail.com>
Date: Sun Feb 8 19:02:46 2009 -0800
Merge branch 'experiment'
轻量级标签
轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。直接给出标签名字即可:
git tag v1.4
验证标签
可以使用
git tag -v [tag-name]的方式验证已经签署的标签。此命令会调用GPS来验证签名,所有你需要有签署者的公钥
后期加注标签
你甚至可以在后期对早先的某次提交加注标签。
给某一次提交打上版本号 v1.2,只需要在打标签的时候跟上对应提交对象的校验和即可:
git tag -a v1.2 9fcebo2 //提交的版本号前几位
分享标签
默认情况下,git push 并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。
git push origin [tagname]
如果要一次推送所有的标签,可以使用 --tags
git push origin --tags
git命令别名
git config 为命令设置别名:
git config --global alias.st status
现在,如果要输入git status只需键入git st即可。
git分支
其实本质上仅仅是个指向commit对象的可变指针。git会使用master作为分支的默认名字。
创建新的分支:git branch testing 新建testing分支,还会在当前commit对象上新建一个分支指针。
切换到其他分支:git checkout testing
新建并切换到该分支:git checkout -b testing
git branch -d testing 删除分支
基本合并
合并 testing分支到master分支
1 检出想要更新的分支:git checkout master
2 合并分支 git merge testing
冲突的合并
有冲突的时候,git作了合并,但没有提交,它会停下来等你解决冲突。查看冲突,git status
解决冲突的方法无非是二者选其一,或者由你自己手动整合到一起,冲突解决之后 git add 将把它们标记为已解决。如果想要用一个有图形界面的工具来解决这些问题,运行 git mergetool
分支管理
git branch 列出所有的分支
git branch -b test 创建分支
git branch -d test 删除分支
git merge test 合并分支
查看所有分支最后一次提交的信息
git branch -v
要从清单中删选出你已经(或尚未)与当前分支合并的分支,可以用--merged 和--no-merged
分支合并全部都是本地的分支,不涉及与服务器的交互。
远程分支
远程分支是对远程仓库状态的索引。它们是一些无法移动的本地分支;
我们用(远程仓库名)/(分支名)这样的形式表示远程分支。
一次git克隆会建立你自己的本地分支master和远程分支origin/master,它们都指向origin/master分支凤最后一次提交;
git fetch origin //首先找到origin是哪个服务器,从上面获取你尚未拥有的数据,更新你本地的数据库,然后把origin/master的指针移到它最新的位置。
(要是你在本地master分支做了会儿事情,与此同时,其他人向服务器推送了内容,更新了上面的master分支,那么你的提交历史会开始朝不同的方向发展。不过只要你不和服务器通讯,比的origin/masrer指针不会移动,可以通过 git fetch origin 来进行同步)
推送分支
git push origin serverfix 推送本地的serverfix到远程分支serverfilx
推送本地分支到远程不同名的分支 git push origin serverfix:serverfix 提取我的serverfix并更新到远程仓库servcerfix
其他人:
git fetch origin
获取一个新的远程分支servcerfix,你不会有一个新的serverfix分支,有的只是一个你无法移动的origin、serverfix指针。
如果想要本地的一个serverfix分支:
git chekout -b serverfix origin/serverfix 简写:git checkout --track origin/serverfix 这会切换到新建的serverfix本地分支,其内容同远程分支origin/serverfix一致。
跟踪分支
从远程分支检出的本地分支,称为跟踪分支。在跟踪分支中输入git push ,git会自行推断应该向哪个服务器的哪个分支推送数据。
在克隆仓库时,git通常会自动创建一个master分支来跟踪origin/master.
删除远程分支
git push [远程名]:[分支名]
git push origin:serverfix 在服务器上删除serverfix分支