版本控制
版本控制是记录一个或者多个文件内容变化,以便将来查阅特定版本修订的系统。版本控制能让我们更好地关注变更,了解到每个版本的改动,方便对改动进行检查,预防事故发生;也能让我们随时切换不同的版本,回滚误删误改的问题代码。
版本控制有:
- 本地版本控制,只能本地使用,无法协作,代表 RCS。
- 集中式版本控制,远端服务器保存版本,本地不保存,分支支持稍逊,服务端故障荣日导致版本丢失,代表 SVN。
- 分布式版本控制,本地可提交,可远程同步,分支管理功能强大,尽管学习成本更高,代表 Git。
Git 最初是由 Linus Torvalds(Linux内核的创建者) 开发的,最初是为了管理 Linux 内核的代码而创建的。Git 于2005年发布,从那时起就变得越来越流行,现在已成为许多开发人员使用的标准版本控制系统。
Git 基本使用
Git 目录
初始化
mkdir study
cd study
git init
部分参数
--initial-branch # 初始化的分支
--bare # 创建一个裸仓库(纯 Git 目录,没有工作目录)
--template # 通过模版创建预先构建好的自定义 git 目录
Git仓库、工作区、暂存区
Git 配置
不同级别:主要用到 --global
和 --local
。
用户名,邮箱
git config --global user.name "Bob"
git config --global user.email "bob@gmail.com"
instead of
git config --global url.git@github.com:.insteadOf https://github.com
命令别名
git config --global alias.cin "commit --amend --no-commit"
Git Remote
查看
git remote -v
添加
git remote add upstream git@github.com:git/git.git
同一个 origin 设置不同 fetch 和 push url
git remote set-url --add --push origin git@github.com:MY_REPO/git
免密配置
HTTPS
内存:git config --global credential.helper 'cache --timeout=3600'
文件:git config --global credential.helper 'store --file /path/to/file'
不指定则默认 ~/.git-credentials
密钥信息存在指定文件中,格式 https://{username}:{passwd}@github.com
SSH
URL:git@github.com:git/git.git
SSH 可以通过公私钥的机制,将生成公钥存放在服务端,从而实现免密访问。目前的Key的类型四种,分别是 dsa、rsa、ecdsa、ed25519,默认使用的是rsa,由于一些安全问题,现在已经不推荐使用dsa和rsa了,优先推荐使用ed25519
ssh-keygen -t ed25519 -C "youremail@example.com"
密钥默认存在 ~/.ssh/id_ed25519.pub
然后将公钥复制到 Github/Gitlab 等托管网站的相应位置,它们的文档写的很清楚。
基本操作
git add .
git commit -m "commit message"
git push origin main
拉取远程更新
git pull origin main
查看 commit 记录
git log
创建、切换分支
git checkout -b new_branch
git checkout main
git branch -d new_branch
修改历史版本
git commit -amend
修改最近一次,不改变其他,适合一个人开发,推送后发现小错误。
git add . && git commit -amend --no-edit && git push -f origin main
通过 git rebase -i HEAD~3
可以实现对最近3个commit的修改:
标签操作
Git 中的标签,指的是某个分支某个特定时间点的状态。通过标签,可以很方便的切换到标记时的状态比较有代表性的是人们会使用这个功能来标记发布结点(v1.0、v1.2等)。
- git tag 列出已有的标签
- git tag [name] 创建标签
解决冲突
从远程仓库拉取代码时与当前目录里的代码发生冲突是很正常的,如果发生了:
git status
命令查看哪些文件发生了冲突。git add
命令将文件标记为已解决。git commit
命令提交更改。使用编辑器或者 IDE 可以让冲突解决更方便一点。