目录
一、什么是git?什么是svn?他们之间的区别?
1.git
(1)什么是Git
Git是分布式版本控制系统,分为两种类型的仓库:本地仓库和远程仓库
(2)Git常用操作
- clone:克隆,将远程仓库复制到本地
- push:推送,将本地仓库代码上传到远程仓库
- pull:拉取,将远程仓库代码下载到本地仓库
2.svn
(1)什么是svn
svn是集中式版本控制系统,版本库集中放在中央服务器。开发人员需要从中央服务器下载最新版本开发,然后将自己代码再提交中央服务器。
(2)缺点
*1)服务器单点故障
*2)容错性差
二、Git工作流程
1.从远程仓库中克隆代码到本地仓库
2.从本地仓库中checkout代码然后进行代码修改
3.在提交前先将代码提交到暂存区
4.提交到本地仓库,本地仓库保存修改的各个历史版本
5.修改完成后,需要和团队共享代码时,将代码push到远程仓库
三、Git的下载和安装
下载地址:https://git-scm.com/download
一路下一步,就行。
检验是否安装成功,只需要右键随便一个文件夹,应该会有两个Git的图标的
四、Git代码托管服务
我们都知道,Git有本地仓库和远程仓库。那怎么搭建远程仓库呢?可以使用托管服务
常用的Git代码托管服务:
- github(https://github.com/)
- 码云(https://gitee.com/)
- Gitlab(https://about.gitlab.com/)
我们使用的是码云。
五、码云的使用
1.使用码云创建仓库
先注册,然后点击“+”。我们这里注册两个
2.邀请其他用户成为仓库成员
六、Git常用命令(重要!!!)
1.环境配置
安装Git后首先需要设置用户名和email地址。
(1)设置用户信息
git config --global user.name "xupeng"
git config --global user.email "[email protected]"
(2)查看配置信息
git config --list
git config user.name
上述命令的设置的信息会保存在~/.gitconfig文件中
实例:
找一个文件夹,右键点击“Git Base Here”,输入git config --list
然后我们输入:git config --global user.name "xupeng"
我们设置的信息在用户下的.gitconfig下:
2.获取Git仓库
获取Git仓库的两种方式:
- 本地初始化一个
- 从远程克隆
(1)本地初始化一个Git仓库
*1)我先创建一个文件夹,然后进入xupengRepo1里面去(一定要进去,因为在不同文件夹下操作,得到的结果可能不同)
*2)右击,点击“Git base here”,输入git init,初始化一个Git仓库。
注意,此时会创建一个.git文件夹,但是他是一个隐藏文件夹,你需要设置你的隐藏文件夹可见
(2)从远程仓库克隆
我们先打开我们的码云,找到要克隆的远程仓库:
然后进入gitRespository文件夹右击,点击“Git base here”,输入git clone url
3.工作目录、暂存区以及版本库
(1)版本库
我们之前本地创建git之后会有一个隐藏.git的文件夹,这个文件夹就是版本库,里面存放了很多配置信息,日志信息,文件版本信息等
(2)工作目录(工作区)
包含.git文件夹的目录就是工作目录,主要用于存放开发的代码。
也就是对应的我们的xupengRepo1
(3)暂存区
.git文件夹中有很多文件,其中有一个index文件就是暂存区,也可以交stage。
暂存区是一个临时保存修改文件的地方
4.Git工作目录下文件的两种状态
Git工作目录下的文件的两种状态:
- untracked:未跟踪(未被纳入版本控制)
- tracked:已跟踪(已被纳入版本控制)
- unmodified:未修改状态
- modified:已修改状态
- staged:已暂存状态
这些状态会随着我们Git命令执行发生变化
5.本地仓库操作
(1)查看状态
git status
git status -s(精简版)
我们修改一下readme文件,在新增一个hello.txt。
(2)将文件加入暂存区
//放到暂存区
git add hello.txt
//从暂存区撤走
git reset Head hello.txt
我们使用git add hello.txt,会发现hello.txt发生了变化,从??变成了A(表示当前加入了暂存区)
我们可以使用git reset Head hello.txt,让他从暂存区出来
(3)将暂存区的文件提交到本地仓库
//不加暂存区,添加说明,直接提交
git commit -a -m "init hello.txt"
//直接接说明提交
git commit -m "init hello.txt"
//编辑器加说明
git commit
//此时会进入编辑器
按"i",然后输入自己想写的说明。写完后,按一下“ESC”,再按shift+“:”,输入“wq”,回车
实例:
我们输入git commit -m "init hello.txt",提交并打印。再看状态,就没有hello.txt文件了,表示已经提交
但是这里还有一个readme文件处于已修改状态,为什么呢?
因为我们做了修改后没有加到暂存区,所以不能提交。
上面有看到我们加了一个-m,表示添加提交说明。如果不加怎么做:
先加入到暂存区
输入git commit后,就会进入vim页面,按"i",然后输入自己想写的说明。写完后,按一下“ESC”,再按shift+“:”,输入“wq”就行了
(4)删除文件
git rm hello.txt
删除完后需要提交,但是不用加入暂存区
你如果直接删除本地仓库文件,此时,该文件并没有放到暂存区。需要在命令里吧文件加入暂存区,再提交
(5)将文件添加至忽略列表
不是所有文件都需要Git来管理,对于这些文件我们要忽略。
*1)创建.gitignore文件,因为没有文件名,不可以直接创建,在命令行输入touch .gitignore
*2)打开.gitignore输入*.class
*3)创建class文件,会发现没有被管理
(6)查看日志记录
git log 查看日志,通过回车向下查看。
如果想退出,输入“q”
6.远程仓库的使用
(1)查看远程仓库
git remote
git remote -v
git remote show origin
因为我这个仓库克隆的码云里的仓库,所以查看会有这个效果。
origin表示这是Git克隆仓库,默认名字是origin
查看详细信息: git remote show origin
(2)添加远程仓库
git remote add <shortname> <url>
一个本地仓库可以添加多个远程仓库
(3)从远程仓库克隆
git clone <url>
克隆不仅仅是文件,包括日志信息,历史记录等都会克隆
(4)移除远程仓库
git remote rm <shortname>
只是移除你本地和远程仓库的关联关系,不是真的移除远程仓库
(5)从远程仓库抓取(fetch)与拉取(pull)
都是从远程仓库获取最新版本数据到本地仓库。
git pull = git fetch + git merge
//允许合并
git pull origin master --allow-unrelated-histories
fetch不会自动合并数据(merge),pull会自动合并数据(merge)。
即:你抓取完之后只是放到本地仓库,但是没有合并到工作区,而是放在objects文件夹下面。然后我们需要git merge origin/master手动的合并
如果仓库自己创建的,并且存在文件,会报错:refusing to merge unrelated histories。此时需要变成git pull --allow-unrelated-histories
(6)推送到远程仓库(push)
git push origin master
7.分支(重要)
Git会默认创建一个分支叫master,他跟其他分支没啥区别,只是因为它是默认创建的。
(1)查看分支
列出所有本地分支:git branch
列出所有远程分支:git branch -r
列出所有本地分支和远程分支:git branch -a
(2)创建分支
git branch aa
(3)切换分支
git checkout aa
(4)推送至远程仓库分支
git push origin aa
(5)合并分支
git merge master -m "merge"
//合并冲突后,需要git add
当你出在xupeng1分支的时候,你输入上述命令,会将master分支的内容合并到xupeng1分支:
注:如果在不同的分支中对同一个部分进行不同更改,git就没办法合并,此时会提示合并冲突。修复冲突后,执行git add命令标识冲突解决
当我们master和xupeng1修改了同样的文件,发生了冲突:
我们手动删除没用的:
再打开user.class:
再将该文件推送到远程仓库:
(6)删除分支
git branch -d aa
//强制删除
git branch -D aa
删除的只是本地分支,不是远程分支
如果你要删除的分支跟远程的不一样,即你在要删除的分支里写过一些代码,这时要用-D才能删除。
8.标签
git给某个提交打上标签,一般用于标记版本。
(1)列出已有的标签
//列出已有标签
git tag
//查看tag信息
git show <tag>
(2)创建新标签
git tag aa
(3)将标签推送到远程仓库
git push <remote> <tag>
(4)检出标签
//新建一个分支,指向标签
git checkout -b <branch> <tag>
(5)删除标签
//删除本地
git tag -d <tag>
//删除远程
git push origin :refs/tags/<tag>