Git¶
VCS¶
Version Control System 版本控制系统,主要分为集中式和分布式两种。
集中式最常用的是SVN,但如今最流行的VCS无疑是分布式的Git,也就是我们今天的主角。
所有的版本控制系统,只能跟踪文本文件的改动,对于二进制文件只能跟踪其大小的变化
- 文本文件:各种源代码、纯文本等
- 二进制文件:图片、视频、office文件(其实是个压缩包,由很多.xml和其他文件构成,所以属于二进制)
安装¶
- Ubuntu:
sudo apt-get install git
- CentOS:
sudo yum install git
- Mac:推荐
brew install git
方式安装,如果安装了Xcode会默认自带,此时用brew安装会提示已经存在,根据提示执行brew link --overwrite git
覆盖 - Windows:官网下载
Git for Windows
客户端安装即可
常用命令¶
- 查看git版本:
git --version
- 查看当前状态:
git status
- 查看提交日志:
git log
基础配置¶
-
查看当前配置:
git config --list --global
-
配置代码提交者信息
# --local 仅对当前用户、当前仓库有效(默认)
# --global 对当前用户、所有仓库有效(一般用这个即可)
# --system 对所有用户、所有仓库有效
git config --global user.name "7c"
git config --global user.email "7c@zuoright.com"
- 配置SSH密钥
从GitHub clone或push 都需要验证身份,配置SSH密钥,这样就不用每次都输入账户密码验证了
# 生成密钥
# 回车,会提示保存位置
# 再回车,如果已存在则会提示是否重新生成
# 如果提示输入密钥类型,推荐选择ed25519,没提示一般默认会是rsa类型
ssh-keygen
# 查看公钥
cat ~/.ssh/id_rsa.pub
# 将公钥添加到项目托管平台相应设置中
创建项目¶
- Fork
先Fork别人的项目到自己的远程仓库,然后从自己的远程仓库克隆到本地
- 克隆
git clone git@github.com:zuoright/demo.git [-b branch] [-o xxx]
# 默认克隆主分支,可加-b xxx指定分支
# 默认把远程仓库命名为origin,可加-o参数自定义
- 本地新建
# 先在本地创建一个仓库
mkdir demo
cd demo
# 然后初始化,会生成.git跟踪文件
git init
- 远程新建
# 与本地仓库关联,origin为远程库名称,可自定义
git remote add origin git@github.com:zuoright/demo.git
# 查看关联了哪些远程库
git remote -v
# 重命名远程库
git remote rename old_name new_name
# 删除已关联的远程库demo
git remote rm demo
完善项目¶
touch LICENSE
文件:编写授权声明touch README.md
文件:编写项目介绍touch .gitignore
文件:编写忽略规则
对于那些已经被track(追踪)的文件,需要先删除相应的跟踪记录:git rm --cached <file>
提交代码¶
# 查看修改了哪些内容(工作区与暂存区的对比,所以文件必须是已追踪过的)
git diff
# 提交代码到暂存区
git add xx # 提交某个
git add . # 提交全部,也可用-A或--all参数
# 代码保存到本地仓库
git commit # 不加-m会打开默认编辑器编辑
git commit -m "init"
git commit -am "xxx" # 跳过暂存区提交
git commit --ament -m "xxx" # 修正提交,可以覆盖上一次的提交
回滚¶
git reset [--参数] 版本 [指定文件]
回滚【到】某个版本,回滚到后,后面的版本都将消失
回滚后要用git push --force
推向远程,否则会报错
参数
--soft
回到commit前的状态--mixed
回到add前的状态,默认--hard
回到工作区修改前状态,重置
# 如果不小心提交了隐私记录,可以reset到这次提交前的版本
# 注意,删除后通过https://github.com/ZuoRight/demo/commit/hash_id依然可以访问到
git log # 查看提交记录,找到包含隐私的那一次提交记录,copy它上一个版本的hash_id
git git reset --hard hash_id
git push --force origin HEAD
版本
- 版本号(后七位即可)
- 标签
- HEAD指针
- HEAD 当前版本
- HEAD^ 上一版本
- HEAD^^ 上上版本
- HEAD~100 上100个版本
git revert -n 版本号
回滚某个版本,生成新的版本,不影响其他版本
撤销¶
- 撤销工作区未追踪文件的修改:只能是
Ctrl+Z
- 撤销工作区已追踪文件的修改
git restore xxx
git checkout -- xxx
- 撤销暂存区文件缓存:即git add后撤销
git restore --staged xxx # 变为未暂存状态
git rm --cached xxx # 变成未追踪状态
分支¶
git branch [-a] # 查看,加-a会显示远程分支(红色标示)
git branch --no-merged master # 查看没有合并到master的分支
git branch dev # 新建
git branch -d dev1 dev2 # 删除已合并的分支(可删除多个), -D强制删除未合并的分支
git branch -m oldName newName # 修改本地分支名称
git branch -M main # 将本地主分支改为main(与GitHub远程主分支保持一致)
git checkout dev # 切换,git switch dev
git checkout -b dev # 新建并切换
git merge dev # 合并
拉取推送¶
# 从已跟踪服务器拉取并自动合并
git pull [origin main] # 等同于:git fetch + git merge
# 把远程仓库某分支最新代码取回本地,但不会自动合并
# 此时可以git status查看下,然后执行git merge合并
git fetch origin dev # 拉取远程dev分支
git checkout -b dev origin/dev # 新建本地dev分支并与远程dev分支关联
如果两个分支同时修改了同一处,合并时会产生冲突,此时冲突的文件会变为未追踪状态,文件中会用=======上下分割标识出两个分支冲突的部分,需要手动解决后再次add到暂存区后提交。
# 推送到远程仓库
git push [-u origin main] # 首次推送加-u参数,设置默认仓库和分支
git push origin 本地分支:远程分支 # push到远程指定分支(可以与本地不同名)
git push origin --delete dev # 删除远程分支
标签¶
git tag # 查看标签
git tag -a v1.0 -m "version one" # 新建标签
git push origin v1.0 # 推送到远程(推送分支时不会带上标签,所以标签需要单独推送)
git tag -d v0.5 # 删除本地标签
git push origin --delete v0.5 # 删除远程标签
项目托管平台¶
- GitHub:现已被微软收购
- GitLab:乌克兰企业,在中国创建了合资品牌(极狐)
- Bitbucket:Jira母公司Atlassian旗下产品
- Gitee(码云):开源中国和工信部联合推出
- Coding:并购了Gitcafe,后又被腾讯云全资收购
项目协作¶
常见的有三种形式
Git Flow¶
# 克隆仓库master分支到本地
git clone git@code.xxx.net:demo/test.git
# 新建并切换到新分支开发
git checkout -b dev
git add .
git commit -m "改动说明"
# 切回本地master
git checkout master
# 拉取远程master分支最新代码
git fetch origin master
# 如果远程有最新提交则需要rebase
git rebase origin/master
# 切回自己的分支
git checkout dev
# 合并本地master分支
git merge master
# 如果有冲突
"""
可以选择终止合并:git merge --abort
也可以解决冲突后继续合并
"""
git add 解决了冲突的文件
git commit -m "冲突修改后说明"
# 合并并且解决完冲突后push自己的分支到远程
git push origin dev
# 然后在创建MR(Merge Requests)请求合并到origin的master分支
Gitlab Flow¶
# 先fork
git clone me.git # 克隆自己的远程库
git remote add upstream common.git # 关联公用的远程库,命名为upstream
git checkout -b dev # 创建dev分支
git add . # 最好每个修改点一次add
git commit -m "xxx" # 最好每个修改点一次commit
git checkout master # 切回主分支
git merge dev # 合并分支
git branch -d dev # 删除dev分支
git fetch upstream # 拉取upstream最新的改动
git rebase upstream/master # 如果拉取到新的改动则合并到本地
git add 有冲突修改的文件
git rebase --continue # 继续合并冲突
git push origin master # 推送到自己的远程分支
# 提交合并
Github Flow¶
待更新
最后更新:
2023-05-08