Git 教程
1.Git 是一个开源的分布式版本控制系统
2.Git 是 Linux Torvalds 为了帮助管理 Linux 内核开发而开发的一个开源版本控制软件
3.Git 与常用的版本控制工具 CVS,Subversion 而不同,采用了分布式版本库的方式,不需要服务端软件的支持
Git 与 SVN 的区别
1. Git 是分布式的,SVN 不是
2.Git 把内容按元数据方式存储,而 SVN 是按文件,即把所有资源控制系统都是把文件的原信息隐藏在 .svn , .cvs 的文件中
3.git 分支与 svn 的分支不同,在svn 中分支是版本库的另一个目录
4.git 内容完整性要优胜 svn , git 的内容存储使用的是 SHA-1 哈希算法,这确保代码内容的完整性
配置用户信息
$ git config --global user.name "runoob" $ git config --global user.email test@runoob.com
如果用了 --global 选项,那么更改的配置文件就是位于你用户主目录下的那个,以后你所有的项目都会默认使用这里配置的用户信息。
如果要在某个特定的项目中使用其他名字或者电邮,只要去掉 --global 选项重新配置即可,新的设定保存在当前项目的 .git/config 文件里。
查看配置信息
git config --list
查看 git 版本信息
git --version
Git 工作流程
一般工作流程如下:
- 克隆 Git 资源作为工作目录。
- 在克隆的资源上添加或修改文件。
- 如果其他人修改了,你可以更新资源。
- 在提交前查看修改。
- 提交修改。
- 在修改完成后,如果发现错误,可以撤回提交并再次修改并提交。
Git 工作区、缓存区、版本库
工作区: 就是电脑里能看到的目录
暂存区:英文名 stage,或者 index. 一般存在 .git 目录下 index 文件中,暂存区有时也称为 索引(index)
版本库: 工作区有一个隐藏的 .git ,是 git 的版本库
图中左侧为工作区,右侧为版本库。在版本库中标记为 "index" 的区域是暂存区(stage, index),标记为 "master" 的是 master 分支所代表的目录树。
图中我们可以看出此时 "HEAD" 实际是指向 master 分支的一个"游标"。所以图示的命令中出现 HEAD 的地方可以用 master 来替换。
图中的 objects 标识的区域为 Git 的对象库,实际位于 ".git/objects" 目录下,里面包含了创建的各种对象及内容。
当对工作区修改(或新增)的文件执行 "git add" 命令时,暂存区的目录树被更新,同时工作区修改(或新增)的文件内容被写入到对象库中的一个新的对象中,而该对象的ID被记录在暂存区的文件索引中。
当执行提交操作(git commit)时,暂存区的目录树写到版本库(对象库)中,master 分支会做相应的更新。即 master 指向的目录树就是提交时暂存区的目录树。
当执行 "git reset HEAD" 命令时,暂存区的目录树会被重写,被 master 分支指向的目录树所替换,但是工作区不受影响。
当执行 "git rm --cached <file>" 命令时,会直接从暂存区删除文件,工作区则不做出改变。
当执行 "git checkout ." 或者 "git checkout -- <file>" 命令时,会用暂存区全部或指定的文件替换工作区的文件。这个操作很危险,会清除工作区中未添加到暂存区的改动。
当执行 "git checkout HEAD ." 或者 "git checkout HEAD <file>" 命令时,会用 HEAD 指向的 master 分支中的全部或者部分文件替换暂存区和以及工作区中的文件。这个命令也是极具危险性的,因为不但会清除工作区中未提交的改动,也会清除暂存区中未提交的改动。
Git 创建仓库
Git 使用 git init 命令初始化一个仓库,执行该命令后 git 仓库会形成一个 .git 目录,该目录包含了资源的所有元数据,其他的项目目录保持不变。
git init
如果该目录下有几个文件想纳入版本控制,需要先使用 git add 命令告诉 Git 开始对文件进行跟踪 ,然后提交
$ git add *.c $ git add README $ git commit -m '初始化项目版本'
Git 从远程仓库拷贝代码到本地
$ git clone git://github.com/schacon/grit.git
执行该命令后,会在当前目录下创建一个名为grit的目录,其中包含一个 .git 的目录,用于保存下载下来的所有版本记录。
如果要自己定义要新建的项目目录名称,可以在上面的命令末尾指定新的名字:
$ git clone git://github.com/schacon/grit.git mygrit
Git 分支管理
Git 创建分支命令
git branch 分支名称
切换分支
git checkout 分支名称
合并分支
git merge
Git 查看提交历史
查看提交历史
git log
查看历史的简洁版本
git log --oneline
查看历史中出现的分支、合并
git log --graph
逆向显示所有的
$ git log --reverse --oneline
只查看指定用户的提交日志
$ git log --author=Linus --oneline -5
Git Github
查看当前远程库
git remote
git remote -v
提取远程仓库
从远程仓库下载新分支与数据
git fetch
该命令执行完后需要执行git merge 远程分支到你所在的分支。
git merge
推送到远程仓库
git push 分支名称
$ git push origin master # 推送到 Github
- 执行
git fetch origin master
时,它的意思是从名为 origin 的远程上拉取名为 master 的分支到本地分支 origin/master 中。既然是拉取代码,当然需要同时指定远程名与分支名,所以分开写。
- 执行
git merge origin/master
时,它的意思是合并名为 origin/master 的分支到当前所在分支。既然是分支的合并,当然就与远程名没有直接的关系,所以没有出现远程名。需要指定的是被合并的分支。
- 执行
git merge origin/master
时,它的意思是合并名为 origin/master 的分支到当前所在分支。既然是分支的合并,当然就与远程名没有直接的关系,所以没有出现远程名。需要指定的是被合并的分支。
- 还可以一次性拉取多个分支的代码:
git fetch origin master stable oldstable
;
- 也还可以一次性合并多个分支的代码:
git merge origin/master hotfix-2275 hotfix-2276 hotfix-2290
;