Git基础教程
概论
存储仓库
一个仓库,或者说是一个git项目,其中包括了项目及其相关文件和文件夹的集合。
工作流程图
Git工作区、暂存区和版本库
- 工作区:就是你在电脑里能看到的目录。
- 暂存区:英文叫stage, 或index。一般存放在 ".git目录下" 下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)。
- 版本库:工作区有一个隐藏目录.git,这个不算工作区,而是Git的版本库。
Git基本操作
创建仓库 git init
使用命令创建一个仓库(初始化)
语法:
git init 在当前目录创建git仓库
git init 文件名 在当前目录创建新文件夹。并且该文件夹被初始化为git仓库
查看当前工作区和暂存区版本库存在的区别 git status
git status
文件从工作区到暂存区
将文件添加入缓存里 git add 文件名
语法: git add 文件名
例子:git add ad.php
git rm 删除文件
语法:
git rm 文件名
强制删除 添加 -f参数
git mv 用于移动 重命名文件 目录 软连接
git mv 源文件 新文件
撤销修改
仅在工作区修改了 使用 git checkout -- 文件名
已提交到缓存区的 使用
第一步、 git reset HEAD 文件名
第二步:git checkout -- 文件名
若已经提交版本 请使用版本回滚 git reset HEAD^ (详见版本回滚)
将暂存区提交到版本库提交 git commit
git add 将快照转入 缓存区
git commit 将缓存区 转入 仓库中
-m 后接字符串,表示此处提交的说明
-a 不需要add rm直接一步到位
git分支
常见操作
Git鼓励大量使用分支:
查看分支:git branch
创建分支:git branch <name>
切换分支:git checkout <name>
创建+切换分支:git checkout -b <name>
合并某分支到当前分支:git merge <name>
删除分支:git branch -d <name>
关于合并冲突文件
案例:
1、master创建一个文件
2、创建一个分支并切换,修改该文件,并提交到仓库
3、切换回master,并修改文件并提交到仓库
此时其分支图是这样的
4、当master执行git merge 分支名。将其合并的时候,文件会出现如图。此时需要自行修改
git版本回滚
版本退回 git reset HEAD
git reset HEAD^ 上一个
git reset HEAD~12 上12个
git查看提交历史git log
git log
参数 --oneline 简洁版
--graph 查看历史中什么时候出现分支合并。
--reverse 逆向显示所有日志
git查看以查看所有分支的所有操作记录git reflog
git feflog
git标签
创建标签
git tag -a 标签名 -m ‘备注’ 指定标签信息;
git tag -s 标签名 -m ‘备注’ PGP签名标签命令
查看所有标签
git tag
git远程仓库
关联一个远程库
为了便于管理,Git要求每个远程主机都必须指定一个主机名
添加远程库 git remote add [shortname] [url]
删除远程库 git remote remove name
查看远程库 git remote
重命名远程库 git remote rename 旧名字 新名字
查看指定主机详情 git remote show 主机名
使用命令添加 git remote add origin
git@server-name:path/repo-name.git;
删除:
git remote remove origin
拷贝仓库到本地 clone
从远程主机克隆一个版本库
语法:
git clone <版本库的网址>
git clone <版本库的网址> <本地目录名>
例子: git clone [email protected]:demo/demo.git
git rebase
语法:
git rebase [<upsteram>] [<branch>]
rebase操作可以把本地未push的分叉提交历史整理成直线;
rebase的目的是使得我们在查看历史提交的变化时更容易,因为分叉的提交需要三方对比。
git fetch
A: 一旦远程主机的版本库有了更新(Git术语叫做commit),需要将这些更新取回本地,这时就要用到git fetch
命令。
B: git fetch对你本地的开发代码没有影响。
默认情况下,git fetch取回所有分支(branch)的更新。
如果只想取回特定分支的更新,可以指定分支名。
$ git fetch <
远程主机名
> <
分支名
>
例子: git fetch origin master
取回的更新,在本地主机上要用"远程主机名/分支名"的形式读取。
比如origin主机的master,就要用origin/master读取。
git branch命令的-r选项,可以用来查看远程分支,-a选项查看所有分支。
git pull
git pull命令的作用是,取回远程主机某个分支的更新,再与本地的指定分支合并。它的完整格式稍稍有点复杂。
(1)指定分支git pull <远程主机名> <远程分支名> : <本地分支名>
(2)不指定本地分支 直接用当前分支 git pull <远程主机名> <远程分支名>
(3)若当前分支与远程主机某分支有追踪关系。 则指定本地分支即可将两者合并到本地
git pull <远程主机名>
(4)如果当前分支只有一个追踪分支,连远程主机名都可以省略。
git pull
git pull 等于先做git fetch,再做git merge。
如果合并需要采用rebase模式,可以使用--rebase选项。
$ git pull --rebase <远程主机名><远程分支名>:<本地分支名>
注意:如果远程主机删除了某个分支,默认情况下,git pull
不会在拉取远程分支的时候,删除对应的本地分支。这是为了防止由于其他人操作了远程主机,导致git pull
不知不觉删除了本地分支。
但是,你可以改变这个行为,加上参数 -p 就会在本地删除远程已经删除的分支。
$ git pull -p
# 等同于下面的命令
$ git fetch --prune origin
$ git fetch -p
追踪关系
Git会自动在本地分支与远程分支之间,建立一种追踪关系(tracking)。
建立追踪方式
第一种:自动的(git clone)
在git clone
的时候,所有本地分支默认与远程主机的同名分支,建立追踪关系,也就是说,本地的master分支自动"追踪"origin/master分支。
第二种:手动的
Git也允许手动建立追踪关系。
git branch --
set-upstream
本地分支 远程分支
例子git branch --set-upstream master origin/next
上面命令指定master分支追踪origin/next分支。
git push
git push
命令用于将本地分支的更新,推送到远程主机。它的格式
(1)完整格式 $ git push <远程主机名><本地分支名>:<远程分支名>
(2)若本地分支推送与之存在"追踪关系"的远程分支(通常两者同名)如果该远程分支不存在,则会被新建。
$ git push
<远程主机名>
<本地分支名>
(3)省略本地分支名,则表示删除指定的远程分支,因为这等同于推送一个空的本地分支到远程分支。$ git push <远程主机名>:<远程分支名>
(4)
如果当前分支与远程分支之间存在追踪关系,则本地分支和远程分支都可以省略。
git push <远程主机名>
(5)如果当前分支只有一个追踪分支,那么主机名都可以省略。
$ git push
若当前分支与多个主机存在追踪关系,
则可以使用-u选项指定一个默认主机,这样后面就可以不加任何参数使用git push
。
simple方式和matching方式
不带任何参数的git push
,默认只推送当前分支,这叫做simple方式。
还有一种matching方式,会推送所有有对应的远程分支的本地分支
默认采用simple方式。
如果要修改这个设置,可以采用git config
命令。
$ git config --global push.default matching# 或者$ git config --global push.default simple
--all
参数
还有一种情况,就是不管是否存在对应的远程分支,将本地的所有分支都推送到远程主机,这时需要使用--all选项。
$ git push --all origin
上面命令表示,将所有本地分支都推送到origin主机。
--force
参数
如果远程主机的版本比本地版本更新,推送时Git会报错。
要求先在本地做git pull
合并差异,然后再推送到远程主机。
这时,如果你一定要推送,可以使用--force选项。
--tags参数
最后,git push
不会推送标签(tag),除非使用--tags选项。
$ git push origin --tags
Github操作
添加公钥
本地Git仓库和GitHub仓库之间的传输是通过SSH加密的,
所以,需要一点设置:
第1步:创建SSH Key。在用户主目录下,看看有没有.ssh目录,如果有,再看看这个目录下有没有id_rsa和id_rsa.pub这两个文件,如果已经有了,可直接跳到下一步。如果没有,打开Shell(Windows下打开Git Bash),创建SSH Key:
$ ssh-keygen -t rsa -C "[email protected]"
你需要把邮件地址换成你自己的邮件地址,然后一路回车,使用默认值即可,由于这个Key也不是用于军事目的,所以也无需设置密码。
如果一切顺利的话,可以在用户主目录里找到.ssh目录,里面有id_rsa和id_rsa.pub两个文件,这两个就是SSH Key的秘钥对,id_rsa是私钥,不能泄露出去,id_rsa.pub是公钥,可以放心地告诉任何人。
第2步:登陆GitHub,打开“Account settings”,“SSH Keys”页面:
然后,点“Add SSH Key”,填上任意Title,在Key文本框里粘贴id_rsa.pub文件的内容:
点“Add Key”,你就应该看到已经添加的Key:
为什么GitHub需要SSH Key呢?因为GitHub需要识别出你推送的提交确实是你推送的,而不是别人冒充的,而Git支持SSH协议,所以,GitHub只要知道了你的公钥,就可以确认只有你自己才能推送。
修改开源项目
- 在GitHub上,可以任意Fork开源仓库;
- 自己拥有Fork后的仓库的读写权限;
- 可以推送pull request给官方仓库来贡献代码
如何参与一个开源项目呢?
比如人气极高的bootstrap项目,这是一个非常强大的CSS框架,你可以访问它的项目主页https://github.com/twbs/bootstrap,点“Fork”就在自己的账号下克隆了一个bootstrap仓库,然后,从自己的账号下clone:
git clone git
@github.
com:michaelliao/bootstrap.git
一定要从自己的账号下clone仓库,这样你才能推送修改。如果从bootstrap的作者的仓库地址[email protected]:twbs/bootstrap.git
克隆,因为没有权限,你将不能推送修改。
Bootstrap的官方仓库twbs/bootstrap
、你在GitHub上克隆的仓库my/bootstrap
,以及你自己克隆到本地电脑的仓库,他们的关系就像下图显示的那样:
如果你想修复bootstrap的一个bug,或者新增一个功能,立刻就可以开始干活,干完后,往自己的仓库推送。
如果你希望bootstrap的官方库能接受你的修改,你就可以在GitHub上发起一个pull request。当然,对方是否接受你的pull request就不一定了。
git服务器搭建