Git是用来干什么的
Git介绍
版本控制就是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。
版本控制其实最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本,方便版本切换。
问什么需要版本控制?从个人到团队协作转变的必然需要。
版本控制工具分为两类
- 集中式版本控制工具(CVS、SVN、VSS)一个单一的集中管理的服务器,保存所有文件的修订版本,协同工作的人员通过客户端连接到这台服务器,取出最新的文件或者提交更新。
- 优点:每个人可以在一定程度上看到别人在做什么,管理员也可以轻松掌握每个开发者权限。
- 缺点,当服务器宕机时,谁都不能提交,谁都不能协同工作。
- 分布式版本控制工具(Git)客户端将代码仓库完整的克隆下来,然后在本地对版本进行控制,最后再将其提交到远程库中。
- 优点:服务器断网也可以进行开发(因为版本控制是在本地完成的)、每个客户端保存的也都是完整的项目(包含历史记录,更加安全) 不存在单点故障问题。
git工作机制:
- 在工作区可以自由删改代码
- 当将工作区文件提交到暂存区,可以将提交文件撤回
- 当上交到本地库后,文件不能被撤回(除非删除整个本地库)
代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们称为远程库。 - 局域网 GitLab
- 互联网 GitHub(外网)
Git安装
Git安装在官网进行下载:window系统下载
Git安装目录,不用修改,直接下一步
选择默认编辑器
是否需要更改默认分支命名,直接下一步
是否修改环境变量
选择后台客户端连接协议
如何使用Git
Git命令
命令名称 | 作用 |
---|---|
git config --global user.name 用户名 | 设置用户签名 |
git config --global user.emall 邮箱 | 设置用户签名 |
git init | 初始化本地库 |
git status | 查看本地库状态 |
git add 文件名 | 添加到暂存区 |
git commit -m"日志信息"文件名 | 提交到本地库 |
git reflog | 查看历史记录 |
git log | 查看详细历史记录(人物、时间、版本信息) |
git reset --hard 版本号 | 版本穿梭 |
Git首次安装必须设置一下用户签名,否则无法提交代码。
git init 初始化本地库
为了能够使用git对文件进行管理首先我们应该在需要管理的文件中进行初始化本地库操作,此时在我们需要管理的文件夹中出现.git文件,说明我们可以对其进行管理。
git status查看当前状态
当文件夹不为空时,使用git status可以看到:
**git add将文件添加到暂存区 **
git commit将暂存区文件提交到本地库
当文件被更改后那么此时查看文件的状态为:
可以看到文件名前面有modified并且是红色的,此时我们需要重新追踪并提交
版本穿梭
当我们想要查看原来的版本,我们可以使用版本穿梭来完成这个操作。
首先使用git reflog获得版本信息,然后使用git reset --hard 版本号,进行版本穿梭。
$ git reflog
9710261 (HEAD -> master) HEAD@{0}: commit: second commit
c40de80 HEAD@{1}: commit (initial): first commit
$ git reset --hard c40de80
HEAD is now at c40de80 first commit
$ git reflog
c40de80 (HEAD -> master) HEAD@{0}: reset: moving to c40de80
9710261 HEAD@{1}: commit: second commit
c40de80 (HEAD -> master) HEAD@{2}: commit (initial): first commit
当版本改变时,我们可以发现文件也回到了原来版本的内容。
Git切换版本,底层其实是移动HEAD指针。
首先我们打开下列文件,可以看到只有一个master分支,并且HEAD指针指向master
然后打开下列文件可以看到,master指向我们的第一个版本的完整版本号。
这就是Git管理的基本原理,并不是创建很多副本来实现版本的管理的。
Git分支
什么是分支?
在版本控制过程中,同时推进多个任务,为每个任务创建单独的分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。
分支的好处
- 同时并行推进多个功能开发,提高开发效率
- 各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可
分支的操作
命令名称 | 作用 |
---|---|
git branch 分支名 | 创建分支 |
git branch -v | 查看分支 |
git checkout 分支名 | 切换分支 |
git merge 分支名 | 把指定的分支合并到当前分支上 |
正常合并
这种情况下是,master分支没有进行更改,而hot-fix分支进行修改,这种只有一方进行修改时,不会产生冲突,所以是正常的合并
创建新的分支,并切换到该分支
git branch hot-fix
git checkout hot-fix
对文件进行修改后进行合并
git checkout master
git merge hot-fix
冲突合并
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替
我们决定使用哪一个。必须人为决定新代码内容。
在我们对master分支和hot-fix两个分支中的文件都进行更改时,此时合并两两分支会出现报错,因为git不知道要保存两个更改版本中的哪一个
可以看到 hello.txt被both modified
此时我们需要人为的干预,去决定修改哪些内容。
我们打开需要被修改的文件
我们将要修改的代码保存下来,并将特殊符号删除。
然后我们将修改过的文件添加,提交本地库(注意:此时使用git commit命令不能带文件名)
git add hello.txt
git commit -m "merge hot-fix"
团队协作机制
团队内协作
团队协作中的大牛写完代码后将自己的代码push到代码托管中心,然后团队中的小牛们在代码拓展中心将大牛的代码clone下来进行一定程度上的更改,然后小牛得到大牛的允许的前提下将自己的代码push到代码托管中心,此时大牛就可以从代码托管中心pull下来小牛修改后的代码进行审查。
跨团队协作
跨团队模式就是团队之间的代码交流,具体流程如上图所示。
GitHub
远程仓库操作
命令名称 | 作用 |
---|---|
git remote -v | 查看当前所有远程地址别名 |
git remote add 别名 远程地址 | 起别名(远程地址太长,用别名代替) |
git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
git clone 远程地址 | 将远程仓库的内容克隆到本地 |
git pull 远程库地址别名 远程分支别名 | 将远程仓库对于分支最新内容拉下来后与本地分支直接合并 |
当我们push代码时可能会报错:
fatal: unable to access ‘https://github.com/yiranwang187/git-demo.git/’: SSL certificate problem: unable to get local issuer certificate
产生原因是:一般是这是因为服务器的SSL证书没有经过第三方机构的签署,所以才报错
解决方法:解除ssl验证后,再次git即可。
git config --global http.sslVerify “false”
pull操作
拉取操作的目的是为了及时更改本地库为最新状态。比如,当远程库被修改后,我们发现本地库和远程库不同步了,也就是本地库落后了,所以此时我们需要对远程库进行拉取操作,以便及时更新本地库代码。拉取操作可以自动完成版本的提交。
clone操作
- 拉取代码
- 初始化本地仓库
- 创建别名
邀请伙伴加入
在下面图中输入作者名字
然后让好友在github界面打开邀请函地址进行添加即可。
称为项目管理者后就可以对远程库进行相应修改。
在编辑器中使用git
本文以pycharm为例展示如何在编辑器中使用git
暂存库提交
上传到本地库
创建新的分支
切换分支
合并分支(正常合并)
在master分支上合并hot-fix分支
合并分支(冲突合并)
当我们对两个版本都更改时会出现冲突:
此时我们选择手动合并:
在IDEA集成GitHub