git常用知识与命令

北慕城南 提交于 2020-02-03 23:46:04

认识git

常见git平台

  • 云平台

    github(国外)

    gitee(国内)

  • 自建平台

    gitlab(国外,部分开源,功能全面,有商用版本)

    gitea(国内,完全开源,轻量极简)

Git VS SVN

  • git是分布式的代码控制管理,可以完全本地控制;svn必须连接SVN服务
  • git可以本地处理冲突

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仓库

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 <文件夹> # 从暂存区中删除文件夹

暂存区提交到本地仓库

commit message规范

推荐使用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

经典模型

img

  • 主要分支
    1. master: 永远处在即将发布(production-ready)状态
    2. develop: 最新的开发状态
  • 辅助分支
    1. feature: 开发新功能的分支, 基于 develop, 完成后 merge 回 develop
    2. release: 准备要发布版本的分支, 用来修复 bug. 基于 develop, 完成后 merge 回 develop 和 master
    3. hotfix: 修复 master 上的问题, 等不及 release 版本就必须马上上线. 基于 master, 完成后 merge 回 master 和 develop
  • 缺点
    1. 必须使用dev分支。
    2. 复杂度高。尤其体现在release和hotfix分支
    3. 存在多次Merge合并

持续集成模型

img

  • 特点
    1. 适用于持续集成多环境模块
    2. 上游分支向下游发展
  • 流程:Bug -> New Branch -> master -> pre branch ->target branch

版本项目模型

React的git模型

img

  • 特点:
    1. 适用于版本项目
    2. 稳定版本从Master捡出Bug的修复
  • 流程:master -> Stable -> new branch -> bug fix -> version

冲突处理实例

问题

# 写代码
git add .
git commit -m "commit message"
git push <远程仓库> <分支>
# 提示被拒绝,有冲突

pull解决

  1. 执行git pull <远程仓库> <分支>
  2. git status得知哪些文件发送了冲突
  3. 打开冲突的文件,解决冲突(注:<< HEAD===是本地代码;===>> 哈希值是远程仓库代码)
  4. 再次git add .
  5. 再次commit代码git commit -m "fixed : conflict"
  6. 再次git push <远程仓库> <分支>即可。

fetch解决(推荐)

  1. 执行git fetch <远程仓库> <分支>,提示远程仓库同步到了FETCH_HEAD分支;

    (也可以用git fetch <远程仓库> <分支>:<本地分支>指定同步的本地分支名字)

  2. 此时git diff FETCH_HEAD或者git log -p FETCH_HEAD可以查看有那些不同

  3. 根据需求选择

    • 合并到它git merge FETCH_HEAD(等同于pull)
    • 不与它合并
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!