git
起步
- 工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
- Git的版本库里存了很多东西,其中最重要的就是称为stage(或者叫index)的暂存区,还有Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD。
对于任何一个文件,在 Git 内都只有三种状态:已提交(committed),已修改(modified)和已暂存(staged),git 管理项目时,文件流转的三个工作区域:Git 的工作目录,暂存区域,以及本地仓库
- 如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
- 如果是 Git 目录中保存着的特定版本文件,就属于已提交状态;如果作了修改并已放入暂存区域,就属于已暂存状态;如果自上次取出后,作了修改但还没有放到暂存区域,就是已修改状态。
每个项目都有一个 Git 目录(译注:如果 git clone 出来的话,就是其中 .git 的目录;如果 git clone –bare 的话,新建的目录本身就是 Git 目录。),它是 Git 用来保存元数据和对象数据库的地方。该目录非常重要,每次克隆镜像仓库的时候,实际拷贝的就是这个目录里面的数据。
windows下编辑文本文件时最好用Notepad++而不要用自带记事本,因为后者在文件头部添加的十六进制字符0xefbbbf容易导致编译报错。Notepad++最好设置默认编码为UTF-8 (without BOM)
基础命令
- pwd命令用于显示当前目录。
如果使用Windows系统,为了避免遇到各种莫名其妙的问题,请确保目录名(包括父目录)不包含中文。
通过
git init
命令把目录变成Git可以管理的仓库:添加文件到Git仓库,分两步:
- 使用命令
git add < file >
,注意,可反复多次使用,添加多个文件; - 使用命令
git commit -m < message >
,完成。
- 使用命令
git status
查看工作区状态git diff
查看difference(修改的内容)cat < file >
查看文件内容
版本回退
- HEAD指向的版本是当前版本,
HEAD^
表示上一个版本,HEAD^^
前一个的上个版本,HEAD~n
前第n个版本 git log
可以查看提交历史git reflog
可以查看命令历史,查看commit_id(版本号)git reset --hard < commid id>
回到该版本号的版本git reset --hard HEAD^
回到上一版本- 版本号没必要写全,前几位就可以了,Git会自动去找。当然也不能只写前一两位,因为Git可能会找到多个版本号,就无法确定是哪一个了。
- 克隆仓库的命令格式为
git clone [url]
。
管理修改
git diff
比较的是工作目录中当前文件和暂存区域快照之间的差异, 也就是修改之后还没有暂存起来的变化内容。若要查看已暂存的将要添加到下次提交里的内容,可以用git diff --cached
命令。- 请注意,
git diff
本身只显示尚未暂存的改动,而不是自上次提交以来所做的所有改动。 所以有时候你一下子暂存了所有更新过的文件后,运行git diff
后却什么也没有,就是这个原因。 git add
的潜台词就是把目标文件快照放入暂存区域,也就是 add file into staged area
- 请注意,
- Git跟踪并管理的是修改,而非文件
- Git管理的是修改,当你用
git add
命令后,在工作区的第一次修改被放入暂存区,准备提交,但是,在工作区的第二次修改并没有放入暂存区,所以,git commit
只负责把暂存区的修改提交了,也就是第一次的修改被提交了,第二次的修改不会被提交。
- Git管理的是修改,当你用
git diff HEAD -- < file >
命令可以查看工作区和版本库里面最新版本的区别
撤销修改
- 命令
git checkout -- < file >
意思就是,把file在工作区的修改全部撤销,这里有两种情况:- 一种是file自修改后还没有被放到暂存区,现在,撤销修改就回到和版本库一模一样的状态;
- 一种是file已经添加到暂存区后,又作了修改,现在,撤销修改就回到添加到暂存区后的状态。
- 总之,就是让这个文件回到最近一次git commit或git add时的状态。
git reset HEAD < file >
可以把暂存区的修改撤销掉,HEAD表示当前版本(最新).- 若已经提交到版本库,修改就要用版本回退
删除文件
- 1.先手动删除文件后,若想继续删除版本库里的文件,则
git rm < file >
,然后更新版本库git commit -m "remove < file >"
,若想恢复文件,则git checkout -- < file >
- 注意
git rm <file>
和git add<file>
在这里都可以 git checkout
是用版本库里的版本替代工作区里的版本
- 注意
- 2.使用命令
rm < file >
远程仓库
- 远程仓库是指托管在网络上的项目仓库
如果在GitHub上创建仓库时默认了创建readme.md,那么刚刚建立的仓库中因为没有该md文件,所以要么删除md文件,要么
git pull origin master --allow-unrelated-histories
,然后进入编辑器后,若填写好原因,那么按ESC,:,wq的顺序先后按出.- 貌似可以先clone一下也可以,那样md文件也同步了
新建仓库,然后在文件夹
git remote add origin git@github.com:Github账号名/仓库名.git
- 远程仓库默认名字为origin
git remote add [shortname] [url]
- 要查看当前配置有哪些远程仓库,可以用
git remote
命令,它会列出每个远程库的简短名字- 也可以加上 -v 选项(译注:此为 –verbose 的简写,取首字母),显示对应的克隆地址:
git push [remote-name] [branch-name]
推送数据到远程仓库。- 克隆操作会自动使用默认的 master 和 origin 名字
- 只有在所克隆的服务器上有写权限,或者同一时刻没有其他人在推数据,这条命令才会如期完成任务。
- 如果在你推数据前,已经有其他人推送了若干更新,那你的推送操作就会被驳回。你必须先把他们的更新抓取到本地,合并到自己的项目中,然后才可以再次推送。(类似于第二条readme.md,因为必须同步)
- 关联后,使用命令
git push -u origin master
第一次推送master分支的所有内容 git remote show [remote-name]
查看某个远程仓库的详细信息远程仓库的删除和重命名,在新版 Git 中可以用
git remote rename
命令修改某个远程仓库在本地的简称,比如想把 pb 改成 paul,可以这么运行:1
2
3
4$ git remote rename pb paul
$ git remote
origin
paul注意,对远程仓库的重命名,也会使对应的分支名称发生变化,原来的 pb/master 分支现在成了 paul/master。
碰到远端仓库服务器迁移,或者原来的克隆镜像不再使用,又或者某个参与者不再贡献代码,那么需要移除对应的远端仓库,可以运行git remote rm
命令:1
2
3$ git remote rm paul
$ git remote
origingit clone [url]
从远程仓库clone下来
分支
- Git 保存的不是文件差异或者变化量,而只是一系列文件快照
- 在 Git 中提交时,会保存一个提交(commit)对象,该对象包含一个指向暂存内容快照的指针,包含本次提交的作者等相关附属信息,包含零个或多个指向该提交对象的父对象指针:首次提交是没有直接祖先的,普通提交有一个祖先,由两个或多个分支合并产生的提交则有多个祖先
- 不想看了,先放着哈哈哈哈哈
- 唧唧复唧唧
打标签
列出现有标签的命令非常简单,直接运行
git tag
即可- 显示的标签按字母顺序排列,所以标签的先后并不表示重要程度的轻重。
- 以用特定的搜索模式列出符合条件的标签,若只对1.4.2系列的版本感兴趣
1
2
3
4
5$ git tag -l 'v1.4.2.*'
v1.4.2.1
v1.4.2.2
v1.4.2.3
v1.4.2.4
Git 使用的标签有两种类型:轻量级的(lightweight)和含附注的(annotated)
- 。轻量级标签就像是个不会变化的分支,实际上它就是个指向特定提交对象的引用。而含附注标签,实际上是存储在仓库中的一个独立对象,它有自身的校验和信息,包含着标签的名字,电子邮件地址和日期,以及标签说明,标签本身也允许使用 GNU Privacy Guard (GPG) 来签署或验证。一般建议使用含附注型的标签,以便保留相关信息
含附注的标签
创建一个含附注类型的标签非常简单,用 -a (译注:取 annotated 的首字母)指定标签名字即可
- 而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
1
2
3
4
5$ git tag -a v1.4 -m 'my hero 1.4'
$ git tag
v0.1
v1.3
v1.4
- 而 -m 选项则指定了对应的标签说明,Git 会将此说明一同保存在标签对象中。如果没有给出该选项,Git 会启动文本编辑软件供你输入标签说明。
可以使用
git show 版本号
命令查看相应标签的版本信息,并连同显示打标签时的提交对象
轻量级标签
- 轻量级标签实际上就是一个保存着对应提交对象的校验和信息的文件。要创建这样的标签,一个 -a,-s 或 -m 选项都不用,直接给出标签名字即可
git tag 名字
- 运行
git show
查看此标签信息,就只有相应的提交对象摘要
验证标签
- 可以使用
git tag -v [tag-name]
(译注:取 verify 的首字母)的方式验证已经签署的标签。此命令会调用 GPG 来验证签名,所以你需要有签署者的公钥,存放在 keyring 中,才能验证
后期加注标签
- 只要在打标签的时候跟上对应提交对象的校验和(或前几位字符)
分享标签
- 默认情况下,
git push
并不会把标签传送到远端服务器上,只有通过显式命令才能分享标签到远端仓库。其命令格式如同推送分支,运行git push origin [tagname]
即可 - 如果要一次推送所有本地新增的标签上去,可以使用 –tags 选项
- 现在,其他人克隆共享仓库或拉取数据同步后,也会看到这些标签。
技巧与窍门
在输入 Git 命令的时候可以敲两次跳格键(Tab),就会看到列出所有匹配的可用命令建议
- 然后输入s,再敲一下tab会自动补全,然后可以继续tab,看看有没有相关命令,tab多敲几下就知道了
1
2$ git pu<tab><tab>
pull push
- 然后输入s,再敲一下tab会自动补全,然后可以继续tab,看看有没有相关命令,tab多敲几下就知道了
可以用
git config
为命令设置别名- 若要输入
git commit
只要输入git ci
即可 - 使用这种技术还可以创造出新的命令,比方说取消暂存文件时的输入比较繁琐
1
2
3
4
5
6
7
8
9
10$ git config --global alias.co checkout
$ git config --global alias.br branch
$ git config --global alias.ci commit
$ git config --global alias.st status
//简化
$ git config --global alias.unstage 'reset HEAD --'
//与下面相同
$ git unstage fileA
$ git reset HEAD fileA
- 若要输入
GitHub实用指南
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码。
- Github账户注册和新建项目,项目必须要遵守格式:
账户名.github.io
,不然接下来会有很多麻烦。并且需要勾选Initialize this repository with a README(仅限博客) - GitHub创建仓库最好不要用中文,路径也是
GitHub Pages
- GitHub Pages is a static site hosting service designed to host your personal, organization, or project pages directly from a GitHub repository.