Git 是一个免费的、开源的 ⭐分布式版本控制工具⭐1、版本控制 1、概述
版本控制是一种记录文件内容变化,以便将来查阅特定版本修订情况的系统。 版本控制其实最重要的是可以记录文件修改历史纪录,从而让用户能够查看历史版本,方便版本切换;2、意义
个人开发过渡到团队开发3、分类 1、集中式版本控制
CVS、SVN(Subversion)、Vss…
集中化的版本控制系统有一个单一的集中管理服务器,保存所有的文件修订版本,协同工作的人都通过客户端连到这台服务器,取出最新的文件或者提交更新。
- 优点:便于管理,集中化管理;
- 缺点:过于集中,风险大,服务器宕机,无法协同工作;
Git、Mercurial、Bazaar、Darcs…
分布式版本控制工具,客户端提取的不是最新版本的文件快照,而是把代码的仓库完整的镜像下来(本地库)。这样任何一处协同工作用的文件发生故障,事后都可以用其他客户端的本地仓库进行恢复,每个客户端的每一次文件提取操作,都是一次对整个文件仓库的完整备份;
分布式版本控制系统解决了集中式版本控制系统的缺陷:
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 每个客户端保存的是完整的项目(包含历史记录,更加安全)
分为工作区 git add 至 暂存区,git commit 提交至 本地库 git push 推送至 远程库
3、Git 和代码托管中心代码托管中心是基于网络服务器的远程代码仓库,简称为 远程库
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee 码云(国内网站)
官网:http://git-scm.com/
下载最新版本即可,安装步骤基本无脑下一步,git bash here 选项勾上最好,安装路径尽量不要有中文,示例路径 D:DevelopGit
三、Git 常用命令| 命令名称 | 命令描述 |
|---|---|
| git config --global user.name 用户名 | 设置用户签名 |
| git config --global user.email 邮箱 | 设置用户签名 |
| git init | 初始化本地库 |
| git status | 查看本地库状态 |
| git add 文件名 | 添加到暂存区 |
| git commit -m "日志信息" 文件名 | 提交到本地库 |
| git reflog | 查看历史纪录 |
| git reset --hard 版本号 | 版本喘嗽 |
设置用户签名
- git config --global user.name 用户名
- git config --global user.email 邮箱
- 签名的作用是区分不同操作者的身份,用户的签名信息在每一个版本的提交信息中能够看到,以此来确认提交者的身份;
注意: 这里设置的用户签名与后面登录 Github 等远程仓库的账号没有任何关系;
- 可以通过git config --get user.name/user.email 查看相关的用户签名信息,git 并不会对用户签名(例如邮箱真实性)的真实性进行鉴别,即只要设置了即可;
- 初始化本地仓库:git init
- 查看当前状态:git status
- 创建一些新的文件,并再次查看本地仓库状态
- 将文件添加至暂存区:git add file.txt,可以使用 通配符 . 添加所有新增的文件;
- 查看本地仓库状态
- 若不想将此文件推送至本地仓库,可以将此文件从暂存区移除 git rm --cached file.txt,注意: 这里只是将文件从暂存区移除,文件仍旧存在在仓库目录中并没有被删除;
- 查看本地仓库的状态
方便后续演示再次将 file.txt 添加至 暂存区;
- 将文件提交至本地库:git commit -m "log message" file.txt
这里的 [master (root-commit) fb716be] 就是提交的版本号:fb716be - 查看本地仓库状态
- 查看版本信息:git reflog
- 查看版本详细信息:git log
可以在这里看到用户签名:Author: Xbai-hang - 修改仓库的 file.txt 文件,之后查看仓库状态;
- 之后再次添加至暂存区、提交到本地库查看日志;
可以看到此时 Head 指针指向的版本号为最新版:022b85c
- 版本穿梭,切换回第一个版本:git reset --hard fb176be
- 使用命令行命令 cat 、head、tail 等查看此文件的内容,看是否发生了改变(图片略)
- 查看版本信息
- 我们可以在 .git 文件夹下找到 HEAD 文件,发现其内容是:ref: refs/heads/master,之后我们打开文件 refs/heads/master,查看其内容为:fb176bebc8c2d1ac107bd334728a6ac0d121a44e,保存的正是当前的版本号;
可以初步了解到,git 原理就是通过指针来完成版本控制,HEAD 指针指向当前分支 master,master指针指向当前仓库版本号;
2、分支概述 在版本控制过程中,同时推进多个任务,我们可以为每个任务创建单独的分支;
使用分支意味着程序员可以把自己的工作从开发主线上分离出来,开发自己分支时不会影响主线分支的运行,可以简单理解为分支就是副本,一个分支就是一个单独的副本(分支底层其实也是指针的引用)
使用分支的好处(优点):
- 同时并行推进多个功能的开发,提高开发效率
- 分支开发过程中,某个分支开发失败,不会影响到其他分支。失败的分支删除重新开始即可
| 命令名称 | 命令描述 |
|---|---|
| git branch 分支名 | 创建分支 |
| git branch -v | 查看分支 |
| git checkout 分支名 | 切换分支 |
| git merge 分支名 | 把指定的分支合并到当前分支上 |
- 首先查看分支:git branch -v
注意-v 属性项可以省略,省略后将只会显示所有分支名以及当前分支,不会显示版本号以及版本信息; - 创建新的分支:git branch hot-fix,无任何回应,对于 git 来说,无任何回应就是最好的回应,代表命令执行成功了;
- 再次查看分支:git branch
使用 -v 属性项继续查看git branch -v
可以看到,从当前分支创建的新的分支与当前分支的版本号,版本信息等等完全一致,相当于是主分支(master)的一个副本;
-
切换分支到新建的 hot-fix 分支:git checkout hot-fix
-
查看分支:git branch -v
可以发现,当前分支(hot-fix)前面多了一个 ⭐,并且命令行括号内也发生了改变 master ---> hot-fix -
修改当前分支下的 file.txt 文件并提交(add、commit)
先切换至主分支(git checkout master),然后通过 git merge hot-fix将 hot-fix 分支合并至主分支;
1、正常合并 2、冲突合并产生冲突原因:合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改,Git 无法替我们决定使用哪一个,必须人为决定新代码的内容;
- 修改 master 分支下的 file.txt 文件内容,并切换分支至 hot-fix ,之后再修改此分支下的 file.txt 文件的内容;
- 此时切换回主分支并且合并 hot-fix 分支
- 此时查看本地仓库状态
- 打开 file.txt 文件可以发现 git 已经为我们标注好了冲突的地方;
- <<<<<<< HEAD 到 ======= 之间的代码是当前分支对 file.txt 文件修改的内容;
- ======= 到 >>>>>>> hot-fix 之间的代码是被合并的分支(hot-fix)对 file.txt 文件修改的内容;
分支合并时产生冲突后,我们需要手动将冲突的内容进行合并;
- 将标记符号所在行删除,并且保留需要合并的内容即可;
- 修改后需要重新添加文件至暂存区并 commit 提交;
⭐注意: 此时使用 git commit 命令时不可以带文件名!
- 合并后
- 合并分支只会修改当前分支的内容,并不会修改被合并的分支
- 通过切换分支到 hot-fix 分支上查看 file.txt 文件
Gayhub 官网:github.com
全球最大的同性交友网站,技术宅男的天堂,新世界的大门!!!
1、创建远程仓库
| 命令名称 | 命令描述 |
|---|---|
| git remote -v | 查看当前所有远程地址别名 |
| git remote add 别名 远程地址 | 起别名 |
| git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
| git clone 远程地址 | 将远程仓库的内容克隆到本地 |
| git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支的最新内容拉去下来之后与当前本地分支直接合并 |
用法:git remote add 远程仓库别名 远程仓库地址
- 创建远程仓库别名:git remote add ori https://github.com/Xbai-hang/learnGit.git
fetch 拉取、push 推送
用法:git push 远程仓库别名/地址 远程仓库分支名
- 将本地仓库分支推送至远程服务器(Github):git push ori master
注意:由于 Github 服务器在国外,此处可能因为网络等原因推送失败,可以多次尝试或者使用科学上网工具辅助推送;作者学校的校园网将 Github IP 地址墙掉了,也可以尝试切换流量上网进行推送;
如果报错:fatal: unable to access 'https://github.com/[userName]/[repoName].git/': Failed to connect to github.com port 443: Timed out
可以尝试修改远程仓库连接地址为 ssh 方式:git remote set-url ori git@github.com:Xbai-hang/learnGit.git
如果是第一次使用 git 的 ssh 连接 github,需要生成一段 rsa 公钥并且设置在 github 上;
- 检查是否已经有了 ssh 密钥:find ~/.ssh/id_rsa.pub
可以找到文件则代表已经生成过了,为了展示,这里假装俺没有生成过;
- 生成密钥:ssh-keygen -t rsa -C "your github email",输入后敲击三次回车即可;
这里为了不覆盖我之前生成的密钥,我选择了更改生成的路径:D:/
- 打开 C:/Users/用户名/.ssh/id_rsa.pub 文件并复制里面的所有内容;
- 打开 Github 官网首页,①.点击右上角个人头像,②点击 Settings,③点击 SSH and GPG keys,④在 SSH keys 栏左侧点击 New SSH key
- title 可以任意填写,在 Key 一栏中粘贴刚刚复制的文件 id_rsa.pub 文件中的内容
- 点击 Add SSH key,至此 配置 rsa 公钥完成;
用法:git pull 远程仓库别名/远程仓库地址 远程仓库分支名
- 在 github 页面打开之前创建的仓库 learnGit,点击 file.txt 并直接修改它并点击 commit 提交,用以模拟多人协作;
- 拉取远程仓库 master 分支最新代码:git pull ori master
- 查看日志可以找到之前直接在 GitHub 网页 commit 的记录,远程仓库拉取成功;
- 我们可以通过给 git log 命令添加属性 --pretty=oneline,使得每条日志显示一行,便于查看;git log --pretty=oneline
用法:git clone 远程仓库地址
- 新建一个文件夹假装是第二个小伙伴,拉取我们的远程仓库代码;git clone git@github.com:Xbai-hang/learnGit.git;
注意: 这里选择了 ssh 的方式进行克隆,与 http 的方式的区别是:- ssh 传输速度远快于 http,在我们克隆一些较大的开源项目时深有体会;
- ssh 传输需要配置 rsa 公钥,而 http 传输则不需要;
- 进入仓库文件 cd ./learnGit,查看当前素有的远程仓库别名 git remote -v
可以看到 Git 默认为我们的远程仓库地址起了别名,默认是 origin
具体操作不再展示,作者自己也是 Github 拾荒者,还没有给别人修代码的能力,呜呜
- fork 其他人的开源项目至个人仓库;
- 拉取该项目至本地,修改,增添代码后提交推送至个人仓库;
- 提交一个 Pull Request 请求给该开源项目的作者;
- 作者审核后合并至该开源项目或者拒绝 Pull request;



