认识git
常见git平台
云平台
github(国外)
gitee(国内)
自建平台
gitlab(国外,部分开源,功能全面,有商用版本)
gitea(国内,完全开源,轻量极简)
Git VS SVN
- git是分布式的代码控制管理,可以完全本地控制;svn必须连接SVN服务
- git可以本地处理冲突
git基本原理
git的工作区域
git的工作区域分为:
- 工作区
- 暂存区(索引区)
- 本地仓库
- 远程仓库
git原理内容
.git
文件夹下是文件的快照,git正是通过他们来实现功能的- git快照只记录了有差别的部分
- 强烈不推荐远程仓库别名重复,因为一旦两个远程仓库状态不同会很难操作;重复可以一次推送,推送到多个远程仓库。
git基础知识
- issues:交bug
- pull request:向保护分支合并代码
- settings:设置options,branch,Webhooks,Notifications,Integrations & services,Deploy keys等
git初始化
SSH登录
多账户情况记得增加配置config
文件
Host github HostName mr-brain User username PreferredAuthentications publickey IdentityFile ./github_key
https是依赖于token的
初始化git仓库
初始化一个新的仓库
# 书写README.md git init # 初始化一个本地仓库 git add README.md # git add(添加到暂存区)。添加包括README.md在内的所有需要提交的文件,或者考虑使用git add .或git add * git commit -m "init:create a project" # 将暂存区代码提交到本地仓库 git remote add origin <远程仓库https或ssh> # origin为远程仓库别名 git push -u origin master # 将本地仓库代码提交到远程仓库,分支名master
push一个现有的仓库(多个远程仓库)
git remote add <远程仓库别名> <远程仓库https或ssh> # 主远程仓库别名一般为origin git push -u <远程仓库别名> master
git基本操作
克隆git仓库
git clone <远程仓库https或ssh>
远程仓库配置
git remote --help git remote -v # 查看当前远程仓库配置 git remote add <远程仓库别名> <远程仓库https或ssh> git remote remove <name> git remote set-url --delete <name> <url> # 删除该别名下的某个url
查看工作区文件状态
加入暂存区与否,哪些文件做了哪种更改
git status
打标签
git tag -a v1.1.1 # -d:删除,-l:列出
远程删除标签
git push origin :refs/tags/<标签> # 不会删除本地
工作区提交到暂存区
git add <文件名> # 后悔药: git reset HEAD <文件>
.gitignore文件配合git add .
删除暂存区文件
git rm <文件> # 从工作区和暂存区中删除文件 git rm --cached <文件> # 从暂存区中删除文件 git rm -r <文件夹> # 从暂存区中删除文件夹
暂存区提交到本地仓库
推荐使用
commitizen
,使用方法:npm install -g commitizen # 项目目录下 commitizen init cz-conventional-changelog --save --save-exact用
git cz
代替git commit
git commit -m "commit message"
本地仓库提交到远程仓库
git push <远程仓库名> <分支名> --tags # --tags同时推送tags git push -u <远程仓库名> <分支名> # 同时设置了默认分支,下次可以直接git push git push <远程仓库名> <本地分支>:<远程分支> # 以上命令为本地分支
同步远程仓库到工作区
git pull <远程仓库名> <分支名> # git pull = git fetch + git merge
同步远程仓库到本地仓库
git fetch <远程仓库名> <分支名> # 如有冲突会新建分支 git fetch <远程仓库名> <分支名>:<本地分支名> # 尝试将已有分支同步合并到本地分支(该本地分支不存在,则新建),以上 命令为远程分支
日志&回退
查看git日志
git log # 点击 pgUp 和 pgDn 来进行日志的上一页和下一页的切换。点击 q 退出 log 查询(Windows 系统下的操作)。 git log --oneline -数字 # oneline简略显示 git log --stat # 同时提示本次提交的更改内容 git log -p # 同上 git log -p <分支名> git log --graph # 查看分支合并图
# 查看之前版本,会记录所有本地操作,甚至包括切换分支。例如:log在reset回退后不会记录回退点后的信息,而reflog会增加一条回退记录,可以用作回退后悔药; git reflog
本地仓库回退
git reset --hard HEAD^ git reset --hard <哈希值> # 工作区暂存区都回退 git reset --soft <哈希值> # 工作区暂存区都不回退 git reset --mixed <哈希值> # 暂存区回退,工作区不回退
工作区回退到暂存区状态
git checkout -- 文件
暂存区回退到本地仓库状态
git reset HEAD -- 文件 # 不影响工作区
查看更新(GUI比较有优势)
工作区对暂存区更新
git diff # 当前分支
暂存区对上次更新
git diff --staged
工作区对本地仓库更新
git diff HEAD
本地仓库对上次更新
git diff HEAD^ HEAD
两次历史版本对比
git diff <哈希值> <哈希值>
两分支最新提交对比
git diff dev master
当前目录和另一分支对比
git diff master
堆栈区
暂存修改内容到堆栈区
# 将所有未提交的修改(工作区和暂存区)保存至堆栈中,用于后续恢复当前工作目录。用于中途插入紧急任务;搞错分支等情况 git status git stash save “注释”
查看堆栈区内容
git stash list # 结果例: stash@{0}: On master: 注释二 # 最新的总是在stash@{0} stash@{1}: On master: 注释一
查看堆栈内容
git stash show [-p] # 默认最新,-p更详细 git stash show stash@{0} [-p] # 指定stash序号,-p更详细
使用堆栈内容
git stash pop # 在当前分支应用暂存内容,并删除该暂存内容 git stash apply # 在当前分支应用暂存内容 git stash branch <分支名> [<stash序号>] # 在指定分支使用暂存内容
删除堆栈区内容
git stash drop <stash序号> git stash clear # 清楚暂存区
分支
查看分支
git branch # 查看本地所有分支,和当前所处分支
创建分支
git branch <分支名> # 基于当前分支创建分支 git checkout -b <分支名> [develop] # 基于develop创建分支(省略则是当前分支),并切换
切换分支
git checkout <分支名>
提交分支
git push origin <分支名>
拉取分支
git pull origin <分支名>
合并分支
合并生成的commit在当前分支
git merge --no-ff <分支名>
合并主分支到当前分支(不常用)
与merge的区别参见:可视化git操作
git rebase <分支名>
捡樱桃
获取某一个分支的单笔提交,并作为一个新的提交引入到你当前分支上。
git cherry-pick <哈希值>
删除分支
git branch -d <分支名> # 没合完全合并会删除失败 git branch -D <分支名> # 强制删除
远程删除分支
git push origin :<分支名> # 不会删除本地
用户配置
查看用户配置
git config -l # 查看全部配置 git config --global -l # 查看全部全局配置
设置配置
git config <配置项> "配置内容" git config --global <配置项> "配置内容" # 例如: git config user.email "邮箱" git config --global user.name "用户名"
git flow
经典模型
- 主要分支
- master: 永远处在即将发布(production-ready)状态;
- develop: 最新的开发状态;
- 辅助分支
- feature: 开发新功能的分支, 基于 develop, 完成后 merge 回 develop;
- release: 准备要发布版本的分支, 用来修复 bug. 基于 develop, 完成后 merge 回 develop 和 master;
- hotfix: 修复 master 上的问题, 等不及 release 版本就必须马上上线. 基于 master, 完成后 merge 回 master 和 develop;
- 缺点
- 必须使用dev分支。
- 复杂度高。尤其体现在release和hotfix分支
- 存在多次Merge合并
持续集成模型
- 特点
- 适用于持续集成多环境模块
- 上游分支向下游发展
- 流程:Bug -> New Branch -> master -> pre branch ->target branch
版本项目模型
React的git模型
- 特点:
- 适用于版本项目
- 稳定版本从Master捡出Bug的修复
- 流程:master -> Stable -> new branch -> bug fix -> version
冲突处理实例
问题
# 写代码 git add . git commit -m "commit message" git push <远程仓库> <分支> # 提示被拒绝,有冲突
pull解决
- 执行
git pull <远程仓库> <分支>
git status
得知哪些文件发送了冲突- 打开冲突的文件,解决冲突(注:
<< HEAD
到===
是本地代码;===
到>> 哈希值
是远程仓库代码) - 再次
git add .
- 再次commit代码
git commit -m "fixed : conflict"
- 再次
git push <远程仓库> <分支>
即可。
fetch解决(推荐)
执行
git fetch <远程仓库> <分支>
,提示远程仓库同步到了FETCH_HEAD
分支;(也可以用
git fetch <远程仓库> <分支>:<本地分支>
指定同步的本地分支名字)此时
git diff FETCH_HEAD
或者git log -p FETCH_HEAD
可以查看有那些不同根据需求选择
- 合并到它
git merge FETCH_HEAD
(等同于pull) - 不与它合并
- 合并到它
来源:https://www.cnblogs.com/zyk-cn/p/12257717.html