概述
免费的、开源的分布式版本控制系统,可以快速高效地处理从小型到大型的各种项目
特点: 易于学习,占地面积小,性能极快。 它具有廉价的本地库,方便的暂存区域和多个工作 流分支等特性。其性能优于 Subversion、CVS、Perforce 和 ClearCase 等版本控制工具
版本控制
一种记录文件内容变化,以便将来查阅特定版本修订情况的系统
最重要的是可以记录文件修改历史记录,从而让用户能够查看历史版本, 方便版本切换
个人开发过渡到团队协作需要版本控制
版本控制工具
集中式版本控制工具
CVS、SVN(Subversion)、VSS……
- 有一个单一的集中管理的服务器,保存 所有文件的修订版本
- 协同工作的人们都通过客户端连到这台服务器,取出最新的文件或者提交更新
- 在一定程度上看到项目中的其他人正在做些什么
- 管理员也可以轻松掌控每个开发者的权限
- 缺点是中央服务器的单点故障 : 服务器宕 机一小时, 谁都无法提交更新,也就无法协同工作
分布式版本控制工具
Git、Mercurial、Bazaar、Darcs……
- 把代码仓库完整地镜像下来(本地库)
- 每一次文件提取操作,实际上都是一次对整个文件仓库的完整备份
- 服务器断网的情况下也可以进行开发(因为版本控制是在本地进行的)
- 每个客户端保存的也都是整个完整的项目(包含历史记录,更加安全 )
Git简史
Git工作机制
Git 和代码托管中心
代码托管中心是基于网络服务器的远程代码仓库,一般我们简单称为远程库
- 局域网
- GitLab
- 互联网
- GitHub(外网)
- Gitee 码云(国内网站)
安装
忽略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 邮箱
案例实操
全局范围的签名设置
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)$ git config --global user.name LayneLayne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)$ git config --global user.email Layne@atguigu.comLayne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)$ cat ~/.gitconfig[user]name = Layneemail = Layne@atguigu.com
说明:
签名的作用是区分不同操作者身份。用户的签名信息在每一个版本的提交信息中能够看 到,以此确认本次提交是谁做的。Git 首次安装必须设置一下用户签名,否则无法提交代码。
注意:
这里设置用户签名和将来登录 GitHub(或其他代码托管中心)的账号没有任 何关系。初始化本地库
查看本地库状态
添加暂存区
提交本地库
历史版本
git reflog 查看版本信息
- git log 查看版本详细信息
版本穿梭
git reset —hard 版本号
Git 切换版本,底层其实是移动的 HEAD 指针Git 分支操作
概念
在版本控制过程中,同时推进多个任务,为每个任务,我们就可以创建每个任务的单独分支。使用分支意味着程序员可以把自己的工作从开发主线上分离开来,开发自己分支的时候,不会影响主线分支的运行。对于初学者而言,分支可以简单理解为副本,一个分支就是 一个单独的副本。(分支底层其实也是指针的引用)
好处
同时并行推进多个功能开发,提高开发效率。
各个分支在开发过程中,如果某一个分支开发失败,不会对其他分支有任何影响。失败的分支删除重新开始即可。操作
| 命令名称 | 作用 | | —- | —- | | git branch 分支名 | 创建分支 | | git branch -v | 查看分支 | | git checkout 分支名 | 切换分支 | | git merge 分支名 | 把指定的分支合并到当前分支上 |
查看分支
创建分支
切换分支
合并分支
产生冲突
冲突产生的表现:后面状态为 MERGING
冲突产生的原因:
合并分支时,两个分支在同一个文件的同一个位置有两套完全不同的修改。Git 无法替 我们决定使用哪一个。必须人为决定新代码内容。
解决冲突
编辑有冲突的文件,删除特殊符号,决定要使用的内容
特殊符号:<<<<<<< HEAD 当前分支的代码 ======= 合并过来的代码 >>>>>>> hot-fix
执行提交时注意:此时使用 git commit 命令时不能带文件名
Git 团队协作机制
团队内协作
跨团队协作
GitHub 操作
远程仓库操作
| 命令名称 | 作用 |
|---|---|
| git remote -v | 查看当前所有远程地址别名 |
| git remote add 别名 远程地址 | 起别名 |
| git push 别名 分支 | 推送本地分支上的内容到远程仓库 |
| git clone 远程地址 | 将远程仓库的内容克隆到本地 |
| git pull 远程库地址别名 远程分支名 | 将远程仓库对于分支最新内容拉下来后与当前本地分支直接合并 |
创建远程仓库别名
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote -v
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote add ori https://github.com/atguiguyueyue/git-shTest.git
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git remote -v
ori https://github.com/atguiguyueyue/git-shTest.git (fetch)
ori https://github.com/atguiguyueyue/git-shTest.git (push)
推送本地分支到远程仓库
git push 别名 分支
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master)
$ git push ori master
Logon failed, use ctrl+c to cancel basic credential prompt.
Username for 'https://github.com': atguiguyueyue
Counting objects: 3, done.
Delta compression using up to 12 threads.
Compressing objects: 100% (2/2), done.
Writing objects: 100% (3/3), 276 bytes | 276.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0)
To https://github.com/atguiguyueyue/git-shTest.git
* [new branch] master -> master
克隆远程仓库到本地
git clone 远程地址
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong
$ git clone https://github.com/atguiguyueyue/git-shTest.git
Cloning into 'git-shTest'...
remote: Enumerating objects: 3, done.
remote: Counting objects: 100% (3/3), done.
remote: Compressing objects: 100% (2/2), done.
remote: Total 3 (delta 0), reused 3 (delta 0), pack-reused 0
Unpacking objects: 100% (3/3), done.
--创建远程仓库别名
Layne@LAPTOP-Layne MINGW64 /d/Git-Space/pro-linghuchong/git-shTest
(master)
$ git remote -v
origin https://github.com/atguiguyueyue/git-shTest.git (fetch)
origin https://github.com/atguiguyueyue/git-shTest.git (push)
小结:clone 会做如下操作。1、拉取代码。2、初始化本地仓库。3、创建别名
SSH 免密登录

操作如下
- $ cd
- $ rm -rvf .ssh
- ssh-keygen -t rsa -C huanggh@baiyun.com
- cd .ssh
- ll -a
- cat id_rsa.pub
复制 id_rsa.pub 文件内容,登录 GitHub,点击用户头像→Settings→SSH and GPG keys--进入当前用户的家目录 Layne@LAPTOP-Layne MINGW64 /d/Git-Space/SH0720 (master) $ cd --删除.ssh 目录 Layne@LAPTOP-Layne MINGW64 ~ $ rm -rvf .ssh removed '.ssh/known_hosts' removed directory '.ssh' --运行命令生成.ssh 秘钥目录[注意:这里-C 这个参数是大写的 C] Layne@LAPTOP-Layne MINGW64 ~ $ ssh-keygen -t rsa -C atguiguyueyue@aliyun.com Generating public/private rsa key pair. Enter file in which to save the key (/c/Users/Layne/.ssh/id_rsa): Created directory '/c/Users/Layne/.ssh'. Enter passphrase (empty for no passphrase): Enter same passphrase again: Your identification has been saved in /c/Users/Layne/.ssh/id_rsa. Your public key has been saved in /c/Users/Layne/.ssh/id_rsa.pub. The key fingerprint is: SHA256:7CPfRLITKcYDhaqpEDeok7Atvwh2reRmpxxOC6dkY44 atguiguyueyue@aliyun.com The key's randomart image is: +---[RSA 2048]----+ | .. | | .. | | . .. | |+ + o . . | |oO . = S . | |X . .. + = | |+@ * .. = . | |X.&o+. o = | |Eo+Oo . . | +----[SHA256]-----+ --进入.ssh 目录查看文件列表 Layne@LAPTOP-Layne MINGW64 ~ $ cd .ssh Layne@LAPTOP-Layne MINGW64 ~/.ssh $ ll -a total 21 drwxr-xr-x 1 Layne 197609 0 11 月 25 19:27 ./ drwxr-xr-x 1 Layne 197609 0 11 月 25 19:27 ../ -rw-r--r-- 1 Layne 197609 1679 11 月 25 19:27 id_rsa -rw-r--r-- 1 Layne 197609 406 11 月 25 19:27 id_rsa.pub --查看 id_rsa.pub 文件内容 Layne@LAPTOP-Layne MINGW64 ~/.ssh $ cat id_rsa.pub ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQDRXRsk9Ohtg1AXLltsuNRAGBsx3ypE1O1Rkdzpm l1woa6y6G62lZri3XtCH0F7GQvnMvQtPISJFXXWo+jFHZmqYQa/6kOIMv2sszcoj2Qtwl lGXTPn/4T2h/cHjSHfc+ks8OYP7OWOOefpOCbYY/7DWYrl89k7nQlfd+A1FV/vQmcsa1L P5ihqjpjms2CoUUen8kZHbjwHBAHQHWRE+Vc371MG/dwINvCi8n7ibI86o2k0dW0+8SL+ svPV/Y0G9m+RAqgec8b9U6DcSSAMH5uq4UWfnAcUNagb/aJQLytrH0pLa8nMv3XdSGNNo AGBFeW2+K81XrmkP27FrLI6lDef atguiguyueyue@aliyun.com


接下来再往远程仓库 push 东西的时候使用 SSH 连接就不需要登录了

