o 源代码管理
o Git是目前世界上最先进的分布式版本控制系统
o Git诞生
在Linus Torvalds开发出了Git分布式版本控制系统11年后,BitKeeper宣布在Apache 2.0许可证下开源。Linus 是在BitKeeper停止向开源社区提供免费版本后开发了Git,今天Git和其它自由软件版本控制系统已经统治了编程社区,BitKeeper变得无关紧要了。BitKeeper由BitMover公司开发,该公司CEO Larry McVoy与Linus曾是好友, Larry说服Linus在内核开发中使用BitKeeper。而BitKeeper在免费使用的许可证中加入很多限制条件,惹恼了内核开发者,最终促使Linus开发出了毁灭BitMover的Git。
集中式版本控制工具
CVS、SVN(Subversion)、VSS……
分布式版本控制工具
Git、Mercurial、Bazaar、Darcs……
代码托管中心负责维护远程库
局域网
Gitlab
Internet
GitHub
码云(gitee)
SVN是集中式版本控制系统,版本库是集中放在中央服务器的,而干活的时候,用的都是自己的电脑,所以首先要从中央服务器下载最新的版本,然后开发代码,写完代码后需要把自己的代码推送到中央服务器。
缺点:
服务器单点故障
容错性差
Git是分布式版本控制系统(Distributed Version Control System,简称 DVCS)
仓库:
本地仓库:是在开发人员自己电脑上的Git仓库
远程仓库:是在远程服务器上的Git仓库
团队内协作
跨团队协作
操作:
clone:克隆,就是将远程仓库复制到本地
push:推送,就是将本地仓库代码上传到远程仓库
pull:拉取,就是将远程仓库代码下载到本地仓库
Commit:提交,就是将本地工作区代码上传到本地仓库中
优点:
容灾能力强
本地版本管理
异地协作
灵活分支
下载地址:Git-2.23.0-64-bit.exe
https://git-for-windows.github.io/
https://git-scm.com/download
下载地址: https://tortoisegit.org/
TortoiseGit 2.8.0-64-bit
http://www.github.com
这里推荐选择第一个,就是单独用户Git自己的命令行窗口。
不推荐和windows的命令行窗口混用。
第一个选项:如果是跨平台项目,在windows系统安装
第二个选项:如果是跨平台项目,在Unix系统安装
第三个选项:非跨平台项目
第一个选项:使用专用的Git窗口(推荐)
第二个选项:使用windows的cmd命令行窗口。
工作区(Working Directory):就是你电脑本地硬盘目录,一般是项目当前目录
版本库(Repository):工作区有个隐藏目录.git,它就是Git的本地版本库
暂存区(stage):一般存放在"git目录"下的index文件(.git/index)中,所以我们把暂存区有时也叫作索引(index)
分支(Branch):Git为我们自动创建的第一个分支master,以及指向master的一个指针叫HEAD
第一步 用“git add”把文件纳入Git管理,实际是把本地文件修改添加到暂存区
第二步 用“git commit”提交更改,实际上就是把暂存区的所有内容提交到当前分支
因为我们创建Git版本库时,Git自动为我们创建了唯一一个master分支,所以commit就是往master分支上提交更改。
可以简单理解为,需要提交的文件修改通通放到暂存区,然后,一次性提交暂存区的所有修改。一旦提交完后,如果你又没有对工作区做任何修改,那么工作区就是“干净”的。即:nothing to commit (working directory clean)。
其他操作
①用“git diff HEAD -- filename”命令可以查看工作区和暂存区里面最新版本的区别。
②新建过撤销未add: git checkout -- 文件名
③撤销已add未commit:先git reset HEAD 文件名,再 git checkout -- 文件名
④撤销已add已commit:git reset --hard HEAD^
//已经git 但是发现文件没有被忽略 此时已经被track了要先rm
git rm -r --cached .
git add .
git commit -m 'update .gitignore'
• 常用命令预览:
要使用Git对我们的代码进行版本控制,首先需要获得Git仓库,获取Git仓库通常有两种方式:
在本地初始化一个Git仓库
从远程仓库克隆
本地初始化操作步骤:
创建目录(用作本地版本库),例如:D:\DevRepository\GITRepository\oa,oa表示办公自动化项目名称
当前目录打开Git Bash窗口,初始化仓库
命令:git init
查看当前目录产生.git隐藏文件夹
注意:当前的 .git 是一个隐藏文件夹,需要在电脑上面设置隐藏文件夹显示设置,否则,看不到这个.git目录
1. 新建文件:
o 命令:touch a.txt
o 命令:vim a.txt
2. 查看文件状态
o 命令:
• git status
On branch master :表示主分支
Untracked files:表示未跟踪状态
o 说明:
• Git工作目录下的文件状态信息:
Untracked 未跟踪(未被纳入版本控制)
Tracked 已跟踪(被纳入版本控制)
Unmodified 未修改状态
Modified 已修改状态
Staged 已暂存状态
• 这些文件的状态会随着我们执行Git的命令发生变化
红色表示新建文件或者新修改的文件,都在工作区.
绿色表示文件在暂存区
新建的文件在工作区,需要添加到暂存区并提交到仓库区
• 也可以使用git status –s 使输出信息更加简洁
?? : 表示未跟踪状态
3. 添加到暂存区
o 命令:
• git add <文件名称>
只是增加到栈空间(index文件)中,还没有添加到本地库中。初始化时没有这个index文件。这还是一个新文件,需要将栈空间文件提交到本地仓库。
• git add .
添加项目中所有文件
• git add hello.txt
添加未存在文件会出错:fatal: pathspec 'hello.txt' did not match any files
4. 撤销暂存区的文件
o 命令:
• git reset <文件名称>
• 撤销后,查看文件状态(git status)文件由绿色变为红色
5. 将暂存区文件提交到本地库
o 命令:
• git commit
执行命令时需要填写提交日志,进入编辑模式
• git commit –m “注释内容”
直接用-m参数指定日志内容,推荐
commit 会生成一条版本记录,add只是添加暂存区,不会生成版本记录,建议多次add后,一次性commit,避免每次add都commit产生版本信息爆炸。
• git commit -am "注释内容"
代码编辑完成后即可进行 add 和 commit 操作
提示:添加和提交合并命令
6. 编辑保存再提交,反复练习多次,修改提交3次(为接下来实验做准备)
o 命令:
• git log
• git log a.txt
查看文件日志(查看所有日志或某个文件日志)
q退出
• git log --pretty=oneline
如果日志很多,可以在一行显示
• git reflog
查看历史操作
1. 回退到历史版本
o 命令:
• git reset --hard HEAD^
一次回退一个版本,一个^代表一个版本数量
• git reset --hard HEAD~n
回退n次操作
2. 版本穿梭
o 命令:
• git reflog a.txt
查看历史操作
• git reset --hard 版本号
回到最新的版本
3. 撤销:
o 未add,未commit
• vim修改文件,没有add和commit,进行撤销
• 命令:
git checkout -- a.txt
• 撤销修改(还原原来的文件)
o 已add,未commit
• vim修改文件,添加add,但没提交commit,进行撤销
• 命令:
git add a.txt
git reset
• 软回退:
• 查看文件内容:cat a.txt
• 查看日志:git reflog a.txt
① 手动拷贝图片java.jpg到工作空间目录,并查看目录列表:ls -l
② 添加:git add java.jpg
③ 提交:git commit -m "新建图片" java.jpg
④ 删除图片:rm java.jpg
⑤ 添加:git add java.jpg
⑥ 提交:git commit -m "新建图片" java.jpg
⑦ 回退:git reset --hard HEAD^
⑧ 文件不是被删除了吗?怎么又回来啦!呵呵…
⑨ 处处留痕:git reflog
几乎所有的版本控制系统都以某种形式支持分支。 使用分支意味着你可以把你的工作从开发主线上分离开来,以免影响开发主线。Git 的master分支并不是一个特殊分支。 它跟其它分支没有区别。 之所以几乎每一个仓库都有 master 分支,是因为git init 命令默认创建它,并且大多数人都懒得去改动它。
在使用版本控制工具开发的过程中,同时推进多个任务
同时并行推进多个功能开发,提高开发效率
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。
master、hotfix其实都是指向具体版本记录的指针。当前所在的分支,其实是由HEAD决定的。 HEAD如果指向master,那么我们现在就在master分支上。 HEAD如果指向hotfix,那么我们现在就在hotfix分支上。 所以切换分支的本质就是移动HEAD指针。
合并分支时一定是涉及到两个分支。这两个分支一个是“当前所在分支”,一个是“目标分支”。
命令写法:
git merge 目标分支
所以分支合并命令的本质就是把“目标分支”合并到“当前分支”。
例如:把hotfix合并到master
git merge hotfx
需要确保当前所在的分支是master
例如:把master合并到hotfix
git merge master
需要确保当前所在的分支是hotfix`
Git使用“<<<<<<<、=========、>>>>>>>>>>”符号帮我们标记出来,现在产生冲突的内容。
<<<<<<< HEAD
Hello Git!I am very happy! &&&&&&&&&&&&
Hello Git!I am very happy!
=======
表示HEAD指针指向的位置在冲突中的内容
=======
Hello Git!I am very happy!
Hello Git!I am very happy! ************
>>>>>>> hotfix
表示hotfix指针指向的位置在冲突中的内容
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git无法替我们决定使用哪一个。必须人为决定新代码内容。
①编辑有冲突的文件,删除特殊符号,决定要使用的内容
③执行提交(注意:使用git commit命令时不能带文件名)
容易冲突的操作方式
多个人同时操作了同一个文件
一个人一直写不提交
修改之前不更新最新代码
提交之前不更新最新代码
擅自修改同事代码
减少冲突的操作方式
养成良好的操作习惯,先pull
在修改,修改完立即commit
和push
一定要确保自己正在修改的文件是最新版本的
各自开发各自的模块
如果要修改公共文件,一定要先确认有没有人正在修改
下班前一定要提交代码,上班第一件事拉取最新代码
一定不要擅自修改同事的代码
前面我们已经知道了Git中存在两种类型的仓库,即本地仓库和远程仓库。那么我们如何搭建Git远程仓库呢?我们可以借助互联网上提供的一些代码托管服务来实现,其中比较常用的有GitHub、码云、GitLab等。
gitHub( 地址:https://github.com/ )
是一个面向开源及私有软件项目的托管平台,因为只支持Git 作为唯一的版本库格式进行托管,故名gitHub
码云(地址: https://gitee.com/ )
是国内的一个代码托管平台,由于服务器在国内,所以相比于GitHub,码云速度会更快
GitLab (地址: https://about.gitlab.com/ )
是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务
.是什么: github是一个git项目托管网站,主要提供基于git的版本托管服务
2.能干嘛: github是一个基于git的代码托管平台, Git 并不像 SVN 那样有个中心服务器。目前我们使用到的 Git 命令都是在本地执行,如果你想通过 Git 分享你的代码或者与其他开发人员合作。 你就需要将数据放到一台其他开发人员能够连接的服务器上。
• 一共9个步骤:我们完全按照9个步骤的流程来进行练习。做到熟练掌握。
/d/DevRepository/GITRepository/zhangsanatguigu
o $ mkdir zhangsanatguigu
o $ cd zhangsanatguigu
o $ git init
o $ git config user.name "zhangsanatguigu"
o $ git config user.email "[email protected]"
o D:\DevRepository\GITRepository\zhangsanatguigu\.git\config文件
o $ touch love.txt
o $ vim love.txt
o $ git add love.txt
o $ git commit -m "love form zhangsanatguigu" love.txt
o [zhangsanatguigu]增加远程地址
o git remote add <远端代号> <远端地址>
o <远端代号> 是指远程连接的代号,一般直接用origin作为代号,也可以自定义.
o <远端地址> 默认远程连接的url
• 例如:
git remote add origin https://github.com/zhangsanatguigu/zhangsanatguigu_project.git
o git push <远端代号> <本地分支名称>
• <远端代号> 是指远程链接的代号
• <本地分支> 是指要提交的分支名字,比如master
• 例如:git push origin master
o 在D:\DevRepository\GITRepository\lisiatguigu目录下打开客户端窗口,执行命令下载远端项目
o git clone <远端地址> <新项目目录名>。
• <远端地址> 是指远程链接的地址。
• <项目目录名> 是指为克隆的项目在本地新建的目录名称,可以不填,默认是GitHub的项目名。
• 命令执行完后,会自动为这个远端地址建一个名为origin的代号。
o 例如
git clone https://github.com/zhangsanatguigu/zhangsanatguigu_project.git hello_world
o 配置账号和邮箱
• [zhangsanatguigu]邀请函已经发送到[lisiatguigu]邮箱
• [lisiatguigu]登录邮箱,打开链接
• [lisiatguigu]接受邀请,则合伙伙伴正式加入项目,获得直接提交代码的权限
在上传或同步代码时,由于你和他人都改了同一文件的同一位置的代码,版本管理软件无法判断究竟以谁为准,就会报告冲突,需要程序员手工解决。
①[zhangsanatguigu]修改并提交到远端,OK.
②[lisiatguigu]修改并提交到远端,NOT OK.
③[lisiatguigu]先pull,合并冲突,再push,OK
概念:
现在的情景是,用叉子把别人的东西(copy no cut)叉到你的碗里~
就是把别人的项目clone一份,但是owner变成自己,这样你就可以在遵守Open source license的前提下任意修改这个项目了。
相当于你在原项目的主分支上又建立了一个分支,你可以在该分支上任意修改,如果想将你的修改合并到原项目中时,可以pull request,
这样原项目的作者就可以将你修改的东西合并到原项目的主分支上去,这样你就为开源项目贡献了代码,开源项目就会在大家共同的努力下不断壮大和完善。
流程:(zhangsan和lisi是一个团队的人,wangwu是另一个团队的人)
第三方账号登录(wangwu),搜索某账号找到某项目(zhangsan),然后点击Fork按钮,这样就将该项目克隆一份到当前账号(wangwu)内,然后进行修改,提交pull request,告诉对方(zhangsan)已经修改了,请求合并;
当前用户登录(zhangsan)后,可以看到小铃铛中的消息提醒,查看到pull request,然后,选择合并或拒绝。
①[wangwuatguigu]获取[zhangsanatguigu]的项目URL(可以进行搜索,也可以通过email发送url地址告知)
③[wangwuatguigu]修改项目文件.(可以pull本地后修改,也可以在github上直接进行修改.)
④[wangwuatguigu]-> [New pull request]
⑤[wangwuatguigu]->[Create pull request]->[填写pull request信息]
⑦[zhangsanatguigu]和[lisiatguigu]都可以看到[wangwuatguigu]提交的项目内容.
⑧[zhangsanatguigu]合并项目,点击[Merge pull request]->点击[Confirm merge]
⑨[zhangsanatguigu]查看项目代码,合并完成,OK
ssh模式比https模式的一个重要好处就是,每次push,pull,fetch等操作时不用重复填写用户名密码。
前提是你必须是这个项目的拥有者或合作者,且配好了ssh key
①步骤1:检查电脑家目录下是否已经生成了SSH key,如果有.ssh目录删除即可
②步骤2:创建SSH Key : ssh-keygen -t rsa -C lisiatguigu
成功的话(执行命令不需要输入任何内容),会在~/下生成.ssh文件夹,查看生成两个文件
id_rsa
id_rsa.pub
打开id_rsa.pub,复制里面的内容,到github上
③步骤3:登录[lisiatguigu]账户
打开用户设置
点击[SSH and GPG keys] 填写Title和Key,点击[Add SSH key]
①[lisiatguigu]复制SSH的url连接
②[lisiatguigu]重新建立github连接,如果之前配置过则删除,重新配置
命令:
git remote add originssh [email protected]:zhangsanatguigu/zhangsanatguigu_project.git
git push originssh master
修改文件,重新提交,不需要再输入用户名和密码了
一个账户只能设置一个默认密码.
如果有多个账号存在的话,只能选择设置其中某一个
与项目的实际功能无关,不参与服务器上部署运行。把它们忽略掉能够屏蔽IDE工具之间的差异。
这个文件的存放位置原则上在哪里都可以,为了便于让~/.gitconfig文件引用,建议也放在用户家目录下
# Compiled class file
*.class
# Log file
*.log
# BlueJ files
*.ctxt
# Mobile Tools for Java (J2ME)
.mtj.tmp/
# Package Files #
*.jar
*.war
*.nar
*.ear
*.zip
*.tar.gz
*.rar
# virtual machine crash logs, see http://www.java.com/en/download/help/error_hotspot.xml
hs_err_pid*
.classpath
.project
.settings
target
.idea
*.iml
[user]
name = peter
email = [email protected]
[core]
excludesfile = C:/Users/Lenovo/git.ignore
注意:这里要使用“正斜线(/)”,不要使用“反斜线(\)”
在和远程库交互过程中也有可能发生冲突,因为解决办法一样,所以这里按照分支操作过程中产生的冲突来演示。
仍然是同一个文件在同一个位置有不同内容。
这里可以直接点“Accept Yours”或者“Accept Theirs”来解决冲突。这代表完全使用我们的内容或完全使用他们的内容。
如果我们想要详细修改冲突内容则点击Close。此时IDEA会提示Resolve
根据需要调整完成后点击“Save changes and finish merging”
简单来说就是,一个项目的成员们在工作中统一使用Git的工作方式。
Gitflow工作流通过为功能开发、发布准备和维护设立了独立的分支,让发布迭代过程更流畅。严格的分支模型也为大型项目提供了一些非常必要的结构。
主干分支 master
主要负责管理正在运行的生产环境代码。永远保持与正在运行的生产环境完全一致。
开发分支 develop
主要负责管理正在开发过程中的代码。一般情况下应该是最新的代码。
bug修理分支 hotfix
要负责管理生产环境下出现的紧急修复的代码。 从主干分支分出,修理完毕并测试上线后,并回主干分支。并回后,视情况可以删除该分支。
发布版本分支 release
较大的版本上线前,会从开发分支中分出发布版本分支,进行最后阶段的集成测试。该版本上线后,会合并到主干分支。生产环境运行一段阶段较稳定后可以视情况删除。
功能分支 feature
为了不影响较短周期的开发工作,一般把中长期开发模块,会从开发分支中独立出来。 开发完成后会合并到开发分支。
注意:要使用CentOS7版本安装,CentOS6版本不行。
首页:https://about.gitlab.com/
安装说明:https://about.gitlab.com/installation/
yum安装gitlab-ee(或ce)时,需要联网下载几百M的安装文件,非常耗时,所以应提前把所需RPM包下载并安装好。
下载地址是:https://packages.gitlab.com/gitlab/gitlab-ce/packages/el/7/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
下载好后上传到Linux系统,习惯上还是放在/opt目录下
sudo rpm -ivh /opt/gitlab-ce-10.8.2-ce.0.el7.x86_64.rpm
sudo yum install -y curl policycoreutils-python openssh-server cronie
#sudo yum install lokkit
sudo lokkit -s http -s ssh
sudo yum install postfix
#yum install keyutils-libs-devel libcom_err-devel libselinux-devel libverto-devel -y
#rpm -ivh mysql-community-libs-compat-5.7.28-1.el7.x86_64.rpm
sudo systemctl enable postfix.service
sudo chkconfig postfix on
curl https://packages.gitlab.com/install/repositories/gitlab/gitlab-ce/script.rpm.sh | sudo bash
sudo EXTERNAL_URL="http://gitlab.example.com" yum -y install gitlab-ce
当前步骤完成后重启。
初始化配置
gitlab-ctl reconfigure
启动Gitlab服务
gitlab-ctl start
停止Gitlab服务
gitlab-ctl stop
访问Linux服务器IP地址即可,如果想访问EXTERNAL_URL指定的域名还需要配置域名服务器或本地hosts文件。
初次登录时需要为gitlab的root用户设置密码。