这是我参与「第三届青训营 -后端场」笔记创作活动的的第 2 篇笔记
版本控制
- 记录一个或若干文件内容变化,以便将来查阅特定版本修订情况的系统。
- 能够更好的关注变更,了解到每个版本的变动是什么,方便检查改动的代码,预防事故;也便于随时切换到不同版本,回滚误删误改的问题代码。
分类
-
本地版本控制
- 代表性工具:RCS。能够对本地代码实现版本控制。
-
集中式版本控制
-
代表性工具:SVN。提供一个远端服务器来维护代码版本,本地不保存代码版本,解决多人协作问题。
-
增量保存每次提交的 Diff,如果提交的增量中和远端现存的文件存在冲突,则需要本地提前解决冲突。
-
优点:学习简单,方便操作。支持二进制文件,对大文件支持更友好。
-
缺点
- 本地不存储版本管理的概念,所有提交都只能连上服务器后才可以提交。
- 分支的支持不够好,不利于大型项目团队合作。
- 用户本地不保存所有版本的代码,如果服务器故障,容易导致历史版本丢失
-
-
分布式版本控制
-
代表性工具:Git。每个仓库都能记录版本历史,解决只有一个服务器保存版本的问题。
-
每次提交记录的都是完整的文件快照
-
优点
- 分布式开发,每个库都是完整的提交历史,支持本地提交,强调个体
- 分支管理功能强大,方便团队合作,多人协同开发
- 校验和机制保证完整性,一般只添加数据,很少执行删除操作,不容易导致代码丢失。
-
缺点
- 相对于 SVN 更复杂,学习成本更高
- 对于大文件的支持不是特别好(git-lfs 工具可以弥补)
-
git 的基本使用
初始化 git 仓库
进入目标文件中, 输入 git init, 初始化为 git 仓库
常见 git 配置
-
用户名配置
git config --global user.name "name"git config --global user.email name@***.com
-
Instead of 替换
- 替换 git 命令。比如,将 SSH 协议换成 HTTP 协议
git config --global url
-
Git 命令别名配置
- 可简化 Git 命令,
git config --global alias.cin "commit --amend --no-edit"( 配置之后, cin 等价于 commit --amend --no-edit )
Git Remote 操作远程仓库
-
查看 Remote
- git remote -v
-
添加 Remote
- git remote add origin_ssh git@github.com:git/git
- git remote add origin_http github.com/git/git.git
-
再输入 git remote -v
- origin_http github.com/git/git.git (fetch) origin_http github.com/git/git.git (push) origin_ssh git@github.com:git/git (fetch) origin_ssh git@github.com:git/git (push)
-
输错名字可以输入 git remote rename <旧名称> <新名称> 更改名字
-
为同一个 Origin 设置不同的 Push 和 Fetch URL
- git remote set-url --add --push origin git@github.com:MY_REPOSITY/git (更改 push 的 URL)
-
SSH 免密配置
- SSH 可以通过公私钥的机制,将生成的公钥存放在服务端,从而实现免密访问
- 目前的 Key 有四种类型,分别是 dsa、rsa、ecdsa、ed25519。默认使用 rsa,但由于安全问题,不推荐使用 dsa 和 rsa,推荐使用 ed25519
- 配置方式:ssh-keygen -t ed25519 -C "your_email@example.com" ,密钥默认存放在 ~/.ssh/id_ed25519.pub
修改历史版本
-
commit --amend。可修改最近的一次 commit 信息,修改之后 commit id 会改变
-
rebase。如:git rebase -i HEAD~3。可实现对最近三个 commit 的修改:
- 合并 commit
- 具体的 commit message
- 删除某个 commit
-
filter --branch。指定删除所有提交中的某个文件或者全局修改邮箱地址等操作
常见问题
无法拉取代码
- 免密认证没有配
- 配的是 SSH 免密配置,但使用的是 HTTP 协议访问,需要配置 Instead Of
Fetch 远端分支后,本地当前分支历史不变
- Fetch 会把代码拉取到本地的远端分支,但是不会合并到当前分支,所有当前分支历史没有变化