Git是目前世界上最先进的分布式版本控制系统
一、Git 与 SVN 区别点
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器那得到最新的版本,然后干活,干完后,需要把自己做完的活推送到中央服务器。缺点:必须联网才能工作,如果在局域网还可以,带宽够大,速度够快,如果在互联网下,如果网速慢的话,就尴尬了。
Git是分布式版本控制系统,那么它就没有中央服务器的,每个人的电脑就是一个完整的版本库,这样,工作的时候就不需要联网了,因为版本都是在自己的电脑上。既然每个人的电脑都有一一个完整的版本库,那多个人如何协作呢?比如说自己在电脑上改了文件A,其他人也在电脑上改了文件A,这时,你们两之间只需把各自的修改推送给对方,就可以互相看到对方的修改了。
1、Git 是分布式的,SVN 不是:这是 Git 和其它非分布式的版本控制系统,例如 SVN,CVS 等,最核心的区别。
2、Git 把内容按元数据方式存储,而 SVN 是按文件:所有的资源控制系统都是把文件的元信息隐藏在一个类似 .svn、.cvs 等的文件夹里。
3、Git 分支和 SVN 的分支不同:分支在 SVN 中一点都不特别,其实它就是版本库中的另外一个目录。
4、Git 没有一个全局的版本号,而 SVN 有:目前为止这是跟 SVN 相比 Git 缺少的最大的一个特征。
5、Git 的内容完整性要优于 SVN:Git 的内容存储使用的是 SHA-1 哈希算法。这能确保代码内容的完整性,确保在遇到磁盘故障和网络问题时降低对版本库的破坏。
二、Git 常用的命令
1.填写用户名和邮箱作为一个标识
git config --global user.name "111"
git config --global user.email "11111@qq.com"
填写完后能够在电脑的系统磁盘文件夹中看到这样一个文件:
2.在电脑上创建一个文件夹作为本地工作空间,并创建版本库。然后新建一个文件,纳入到 git 暂存区,再提交代码到本地库。
mkdir 文件夹名, 进入到该文件夹后
git init
touch a.txt // 新建一个文件
git status // (如果是红色,仅仅是检查到了有更新)
git add a.txt // (变成绿色,但还没到本地库)
git commit -m "create file 00" // git commit 是无法提交的,即一定要写注释
3. 日志版本信息。
假如a.txt文件有三个版本,分别对应为含有数字1,数字12,数字123。并按照上述指南进行了三次提交,现在需要查看版本信息。
git log a.txt // 查看该文件的所有日志信息,但是由于显示问题,难以寻找。
git log --pretty=oneline a.txt // 将一个日志显示为一行
4. 如果在将要提交时,被中断,为了防止更新没有错误,我们可以通过查看更新的内容来确定。
git diff a.txt // 比较工作空间和本地库的差异
5.版本回退。(退的前提,表明已经完成 commit
命令了)
git reset --hard HEAD^ // 回退一步
git reset --hard HEAD^^^ // 回退三步
git reset --hard HEAD~n // 回退n步
当前为第5个版本(除去新建的那一个版本):
6.当从第5个版本回退到第1个版本后,假如需求是回到上次的第5个版本,此时工作空间内没有了之前的历史文件。想死的心都有?不急,一行命令搞定。
git reflog a.txt // 查看a.txt详细的日志信息
git rest --hard e4e40da // 回退到指定的版本。
git reflog a.txt
可以得到详细的日志信息,根据最前面的数值(十六进制,类似数据库 id,唯一索引)进行回退即可。
7.版本回撤:(注意和版本回退区分,可以理解为没有完成 commit
命令)
本地添加一行数字 6 以后,并没有进行 add
和 commit
指令,仅仅在本地工作空间进行了修改。回撤后回到12345的状态。
git checkout -- a.txt // 回撤到文件修改之前的内容。
8. 工作区+版本库+暂存区的理解
工作区(Working Directory): 就是电脑本地硬盘目录。
版本库(Repository):工作区有个隐藏目录 .git,它就是 gi t的本地版本库。
暂存区(stage):一般存放在 ‘’git目录‘’ 下的index文件(.git/index)中,所以我们把暂存区有时也称为索引(index)。
我们把文件往 Git
版本库里添加的时候,是分两步执行的:第一步是用"git add"
把文件纳入 Git
管理,实际是把本地文件修改添加到暂存区第二步是用 "git commit"
提交更改,实际上就是把暂存区的所有内容提交到当前分支。
我们创建 Git
版本库时,Git
自动为我们创建了唯一一个 master
分支,所以 commit
就是往 master
分支上提交更改。 可以简单理解为,需要提交的文件修改后放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你没有对工作区做任何修改,那么工作区就是“干净”的。即:nothing to commit(working directory clean)
。
9.删除文件,删除后也需要提交
git rm -f b.txt // 删除文件
执行 git rm -f b.txt
命令后,需要提交:
10.分支(查看+新建+切换+合并(分支名)+删除)
git branch // 查看分支
git branch dev // 新建分支
git checkout dev // 切换分支 (会将master的东西备份到dev)
git merge dev //合并分支(所在master分支上对dev分支进行合并)
如果存在内容冲突,强制合并时会出错的,如果没有摆平错误的话一直无法使用。
手动解决冲突:两个记录都保留,别人的优先,自己的代码放后面。
删除分支:
git branch -d 分支名 // 删除分支
创建分支并进入该分支:
三、Github与Git 的协同办公
是什么:github
是一 个 git
项目托管网站,主要提供基于 git
的版本托管服务。
能干嘛:github
是一 个基于 git
的代码托管平台,Git
并不像 SVN
那样有个中心服务器。目前我们使用到的 Git
命令都是在本地执行,如果你想通过 Git
分享你的代码或者与其他开发人员合作。你就需要将数据放到一 台其他开发人员能够连接的服务器上。
Github 应用:
注册账号+检查密钥 (由于你的本地 Git
仓库和 GitHub
仓库之间的传输是通过 SSH
加密的,所以我们需要配置验证信息(No such file or directory表示第一次))。这样的指令一般只用一次,类似安装软件一样。
ssh-keygen -t rsa -C an@jxnu.edu.cn
生成密钥后,可以在本机看到属于自己的公钥:
在自己的 github
账户上进行配置:
连通性测试:
ssh -T git@github.com
本地库推送到远程库:
新建一个项目名为oa
,然后复制其相关命令:
git remote add origin https://github.cm/Xiaoqiuxuan/oa.gi
git push -u origin master
运行上述两条指令,可以看到相关文件已经推送到了github
本地的文件推动到远程服务器(github):
如果直接在服务器端进行了修改,则需要拉下来到本地:
将服务器端的项目克隆到本地:
如果普通用户2与普通用户1之间的项目进行交互:
用户2 fork 用户1 的相关项目,
clone到本地进行修改,然后推送到服务器(提交到用户2的文件中,用户1不知道)
发送合并请求,Pull request
用户1登录后,在消息通知中,可以查看 files changed, 然后确认后即可。查看后,用户2修改的会用红色(删除部分)+绿色(新增部分)。
如果提交时,发现有冲突,把整个项目 pull
到本地,然后解决冲突后,最后再推送 push
。