Git概述
1. Git的目标:
* 速度
* 简单的设计
* 对非线性开发模式的强力支持(允许上千个并行开发的分支)
* 完全分布式
* 有能力高效管理似Linux 内核一样的超大规模项目(速度和数据量)
2. SVN的缺陷:
1. 集中式版本控制系统,需要从服务器得到最新版本才能工作
2. 需要联网才能工作,在区域网可以,但是在互联网下必须有足够的网速;
3. 服务器单点故障 [鸡蛋里挑骨头,问题不大]
4. 容错性差。 [鸡蛋里挑骨头,问题不大]
5. ----> 【优点:在一定程度上可以看到其他开发人员在干什么,管理员也可以很轻松掌握每个人的开发权限】
3. 工作中会使用SVN,Git,以及一些其他的管理工具,甚至公司自己写的,但是基本的操作流程是一致的。
4. Git的"黑历史"?
* Git的意思是"饭桶"。
* 悄悄破解BitKeeper,被发现了之后迫使自己开发出一套版本控制系统,最开初是运行在Linux环境上的,后来在各个系统上均有使用。
5. Git与SVN的区别:
1. Git是分布式,SVN是集中式,Git没有中央服务器,SVN有;
2. Git有一个本地仓库,SVN只有远程仓库;
6. GIt的工作流程:
1. 工作区->暂存区[add]->本地仓库[commit]->工作区[Checkout]
2. 本地仓库[push]->远程仓库[clone] [本地仓库]
3. 远程仓库->工作区[Pull]
7. clone与pull的区别?
* 举例:一个新人才入职,用clone
* 老员工用Pull,更新与本地版本不一致,修改过后的文件;如果开发中,要更新别人刚提交的功能到我的本地用pull;
Git的安装准备
1. 安装:
* 下载地址:https://git-scm.com/download [选择windows版本,因为工作中基本是以windows为虚拟机的]
* 选择Git-2.13.0-64-bit.exe安装
2. 命令行[Git Bash Here]:
* get --version 获取当前get的版本
* 图形界面是:Git Gui Here
3. Git的图形化界面很不好看,可以安装小乌龟进行操作:TortoiseGit Setup
* 如果英文版不好用,可以下载汉化版,汉化版安装完成后可在setting里面修改语言;
* 小乌龟里面安装过程中会要求提供邮箱姓名,是为了工作中的出现错误能方便联系到人;
4. 本地版本库:
1. ".get"是一个隐藏文件,如果没有可以在电脑中设置显示隐藏文件;
* ".get"目录就是版本库,将来文件都需要保存到版本库中。
* 工作目录:包含".git"目录的目录,也就是.git目录的上一级目录就是工作目录。只有工作目录中的文件才能保存到版本库中。
2. 创建本地版本库:
1. 图新界面直接新建本地版本库
2. 命令行初始化:get init
3. 乌龟创建:创建版本库[不要选制作纯版本库]
3. 如果想向本地版本库中添加文件,那么必须在repositorys/repo1中放置 [repo1是一个工作目录]
5. 工作区和暂存区:
* 工作区就是你在电脑里能看到的目录,比如我的reporstory文件夹就是一个工作区。repository目录是工作区,这个目录里面呢的".git"的隐藏文件才是版本库。
Git的实战操作
1. 添加:
* 步骤:TortoiseGit->添加->提交 [此时文件保存在暂存区中]
* Git提交->master->选中文件->提交 [此时文件保存在分支中,点击推送可保存在远程仓库里,如Linux服务器,GitHub等]
* 解析:我们把文件往Git版本库力添加的时候,是分两步执行的。
* 第一步是用git add 把文件添加进去,实际上就是把文件修改添加到暂存区
* 第二步是用git commit提交更改,实际上就是把暂存区的所有内容提交到当前分支;
* 注意:
* 因为我们在创建Git版本库的时候,Git自动为我们创建了唯一一个master分支,所以,现在,git commit就是往master分支上提交更改。
* 简单来讲:提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。
2. 修改:
* 步骤:需要修改的文件点击右键:Git提交->master->提交 [补全日志信息,选中变更文件] 如果点击推送,则会将修改提交到远程服务器;
3. 查看修改历史
1. 作用:在开发过程中可能会经常查看代码的修改历史,或者叫做修改日志。来查看某个版本是谁修改的,什么时间修改的,修改了哪些内容。
2. 步骤: 右键点击文件->TortoiseGit->显示日志
4. 比较差异功能:
* 当文件内容修改后,需要和修改之前对比一下修改了哪些内容此时可以使用"比较差异功能";
5. 还原修改:
* 当文件修改后不想把修改的内容提交,还想还原到未修改之前的状态。此时可以使用"还原"功能;
* 注意:此操作会撤销所有未提交的修改,所以当作还原操作需要慎重!
6. 将java工程提交版本库中:
1. 将java工程复制到工作目录中;
2. 将工程添加到暂存区
3. 添加忽略:TortoiseGit->添加到忽略列表->递归忽略文件或目录->.gitignore放在文件/文件夹所在的目录 ,一般忽略idea配置,target编译的class文件路径,不要忽略.gitignore;
4. 选择保留本地文件;
5. 提交代码;
7. 忽略文件语法规范:
1. 注释行将被忽略:空行或是以#开头的行
2. 避免递归:在前面添加正斜杠"/"来;
3. 忽略文件夹:在后面添加正斜杠/来; 举例:build/ 即忽略build文件夹
4. 否定忽略: 比如前面用了"*.apk ",然后使用"!a.apk",则这个a.apk不会被忽略
5. 通配符:
1. 用来匹配零个或多个字符:*.[oa] 忽略所有以".o" 或".a"结尾;
2. *~忽略所有以~结尾的文件; [这种文件通常被许多编辑器标记为临时文件]
3. [] 用来匹配括号内的任一字符; 也可以在括号内加连接符,如[0~9]匹配0~9的数;
4. ?用来匹配单个字符。
远程仓库的准备
1. 概述:
1. 常用的远程仓库就是gitHub: https://github.com/
2. 国内类似的:"码云" : https://gitee.com/
2. 创建远程仓库步骤:
1. 在github上创建一个账号
2. create new repository
3. 设置:Repository name public 权限
4. 点击创建
3. ssh和http:
* Github支持两种同步方式:"http"和"ssh".如果使用https很简单基本不需要配置就可以使用,但是每次提交代码和下载代码时都需要输入用户名和密码。如果使用ssh方式就需要客户端先生成一个密钥对,即一个公钥一个私钥。然后还需要把公钥放到github的服务器上。
SSH的操作
1. 什么是ssh?
* SSH为Secure Shell(安全外壳协议)的缩写,由IETF的网络小组所制定。
* 可以说是目前最可靠的,专为远程登录会话和其他网络服务提供安全性的协议。利用SSH协议可以有效防止远程管理过程中的信息泄露问题。
2. 基于密钥的安全验证
* 使用ssh协议通信时,推荐使用基于密钥的验证方式。你必须为自己创建一对密匙,并把公用密匙放在需要访问的服务器上。如果你要连接到SSH服务器上,客户端软件就会向服务器发出请求,请求用你的密匙进行安全验证。服务器收到请求之后,先在该服务器上你的主目录下寻找你的公用密匙,然后把它和你发送过来的公用密匙进行比较。如果两个密匙一致,服务器就用公用密匙加密“质询”(challenge)并把它发送给客户端软件。客户端软件收到“质询”之后就可以用你的私人密匙解密再把它发送给服务器。
3. 密钥生成:
1. windows下我们可以使用Git Bash.exe生成密钥;
1. 客户端操作:
* ssh-keygen -t rsa
* 执行命令完毕后,在C:\Users\用户名\.ssh下面生成如下名称的公钥和私钥;
* id_rsa 私钥
* id_rsa.pub 公钥
2. ssh 密钥设置
1. 登录GitHub->Settings->SSH and GPG keys->new SSH key->Title[名字可以写为subl] ->Key[将公钥复制到这里]->Add SSH Key
4. 同步到远程仓库
1. 使用git bash:
1. 在仓库所在目录点击Git Bash here 启动 git bash程序
2. 在git bash中执行如下语句:
* git remote add origin git@github.com:sublum/mytest.git [orgin后面的地址可在github仓库中复制地址即可]
* git push -u origin master
3. 如果出现错误:[remote orgin already exists]
* git remote rm origin 然后再重新执行上面的推送命令
5. 使用TortoiseGit同步
1. 由于TortoiseGit 使用的ssh工具是"PuTTY"git Bash 使用的ssh工具是"openSSH",如果想让TortoiseGit也使用刚才生成的密钥可以生成如下配置:
1. ssh客户端配置成git使用的客户端:
* SSH客户端:xxx\Git\usr\bin\ssh.exe [xxx代表Git实际安装地址]
2. 远端下设置:
* Url:远程仓库的地址
* 推送URL:也是相同的
* Putty密钥:选择刚才生成的密钥中的私钥
2. 同步。在本地仓库的文件夹中单击右键,选择"Git同步";
3. 从远程仓库克隆:
* 克隆远程仓库也就是从远程把仓库复制一份到本地,克隆后会创建一个新的本地仓库。选择一个任意部署仓库的目录,然后克隆远程仓库;
* 步骤:
1. 使用git bash:
* $ git clone git@github.com:sublun/mytest.git [里面的仓库名自己修改]
2. 使用TortoiseGit:
1. 在任意目录点击鼠标右键->Git克隆-按照提示克隆。
4. 从远程仓库取代码:
* Git中从远程的分支获取最新的版本到本地有这样2个命令:
1. git fetch:相当于是从远程获取最新版本到本地,不会自动merge(合并代码)
2. get pull:相当于是从远程获取最新版本并merge到本地;
* 注意:
* 上述命令其实相当于git fetch 和git merge
* 在实际使用中,git fetch更安全一些
* 因为在merge前,我们可以查看更新情况,然后再决定是否合并
* 如果使用TortoiseGit的话可以从右键菜单中点击"拉取"(pull)或者"获取"(fetch)
服务器搭建
1. 远程仓库实际上和本地仓库没啥不同,纯粹是为了不间断开机且对代码保密,又不需要给gitHub钱,即可实现远端保存;
2. 将文件传入linux服务器中
1. 解压服务器软件: tar zxf git-2.5.0.tar.
2. 导入c++依赖:
* yum -y install curl curl-devel zlib-devel openssl-devel perl cpio expat-devel gettext-devel gcc cc
3. 解压缩:
* cd git-2.5.0
* autoconf
* ./configure
* make
* makeinstall
4. 添加用户:
* adduser -r -c 'git version control' -d /home/git -m git
5. 设置密码:
* passwd git [输入密码的时候会隐藏显示]
* 输入两次密码
6. 切换到git用户
* su git
7. 创建git仓库
* git --bare init /home/git/first
* 注意:如果不使用"--bare"参数,初始化仓库后,提交master分支时报错。这是由于git默认拒绝了push操作,需要.git/config添加如下代码:
[receive]
denyCurrentBranch = ignore
* 推荐使用:git --bare init 初始化仓库
3. URL:
* ssh://git@192.168.10.6.156/home/git/repo1
* 命名远端名字,以及其他的即可。
4. 其他与gitHub操作的步骤都一样。
分支管理:
1. 概述:我们的每次提交,Git都把它们串成一条时间线,这条时间线就是一个分支。截止到目前,只有一条时间线,在Git里,这个分支叫主分支,即master分支。HEAD指针严格来说不是指向提交,而是指向master,master才是指向提交的,所以HEAD指向的就是当前分支。
2. 原理:
1. 一开始的时候,master指向最新的提交,再用HEAD指向master,就能确定当前分支,以及当前分支的提交点。
2. 每次提交,master分支都会向前移动一步,这样,随着你不断提交,master分支的线也越来越长。
3. 当我们创建新的分支,例如dev时,Git新建了一个指针叫dev,指向master相同的提交,再把HEAD指向dev,就表示当前分支在dev上:
4. Git创建一个分支很快,因为除了增加一个dev指针,改改HEAD的指向,工作区的文件都没有任何变化!
5. 不过,从现在开始,对工作区的修改和提交就是针对dev分支了,比如新提交一次后,dev指针往前移动一步,而master指针不变
6. :假如我们在dev上的工作完成了,就可以把dev合并到master上。Git怎么合并呢?最简单的方法,就是直接把master指向dev的当前提交,就完成了合并
7. ;所以Git合并分支也很快!就改改指针,工作区内容也不变!
8. 合并完分支后,甚至可以删除dev分支。删除dev分支就是把dev指针给删掉,删掉后,我们就剩下了一条master分支;
在Intellij idea中使用git
1.安装:
* Setting->Git->Path to Git executable[git的安装目录]
2. 创建本地仓库:
* VCS->Import into Version Control->Create Git Repository
* 选择工程所在上级目录,点击ok创建本地仓库;
3. 工具条:
* upadate... :更新
* Commit:提交
* Compare with... :作比较
4. 推送到远程:
1. 在gitHub上创建一个仓库然后将本地仓库推送到远程;
1. 在工程上点击右键,选择git->Repository->push
2. 或者在菜单中选择:vcs->git->push
2. 点击"Define remote"链接,配置https形式的URL,git形式的无法通过。然后点击ok;
* 点击"push"按钮就将本地仓库推送到远程,如果是第一次配置推送需要输入github的用户名和密码
5. 从远程仓库克隆:
* 关闭工程后,在idea的欢迎页上有"Check out from version control"下拉框,选择git:
* 此处仍然推荐使用http形式的url,点击"test"按钮后显示连接成功。
* 点击ok按钮后根据提示将远程仓库克隆下来,然后倒入到idea中。
6. 从服务端拉取代码:
* 如果需要从服务端同步代码可以使用工具条中的"update"按钮
7. 分支
* VCS->Git-LovalBranches:下面谁有标签标注谁就是当前分支,checkout切换分支;