
文章目录一、获取本地仓库二、基础操作命令1.git add / git commit2.查看修改的状态 git status3.查看提交日志 git log4.版本切换 git reset / git reflog5.添加文件至忽略列表 .gitignore三、分支1.查看本地分支2.创建本地分支3.切换分支4.合并分支5.删除分支6.解决冲突四、开发中分支使用原则与流程五、远程仓库1.添加远程仓库2.查看远程仓库3.推送到远程仓库4.查看本地分支与远程分支的关联5.从远程仓库克隆6.从远程仓库中抓取和拉取7.解决合并冲突一、获取本地仓库使用Git对代码进行版本控制首先要获得本地仓库1在电脑的任意位置创建一个空目录作为本地Git仓库2进入这个目录打开Git bash窗口3执行命令 git init4创建成功后可以在文件夹下看到隐藏的.git目录示例二、基础操作命令1.git add / git commitGit工作目录下对文件的修改增加、删除、更新会存在几个状态这些修改的状态会随着执行Git的命令而发生变化git add添加工作区到暂存区(工作区 -- 暂存区)git commit提交暂存区到本地仓库(暂存区 -- 本地仓库)典型流转路径操作 / 状态工作区暂存区仓库新建文件从未跟踪开始未跟踪 (untracked)——修改已有文件文件已跟踪未暂存 (unstaged)——git add修改/新文件进入暂存区已暂存 (staged)—git commit——生成一次提交记录 (commit 01, 02, 03…)Git 的核心逻辑就是三个区域的流转工作区你写代码的地方新文件是未跟踪修改已有文件是未暂存。暂存区提交前的缓存执行git add后改动进入这里变为已暂存。仓库永久历史记录执行git commit后暂存区内容生成一次提交记录Commit 01/02/03…2.查看修改的状态 git status3.查看提交日志 git log4.版本切换 git reset / git reflog命令形式git reset --hard commitID回退到指定版本之后的修改将被清空commitID可以使用 git log 指令查看git reflog这个指令可以看到已经删除的提交记录和git reset --hard commitID搭配可以回到之前的版本(这里为第二次提交)5.添加文件至忽略列表 .gitignore.gitignore 是一个纯文本文件用来告诉 Git 哪些文件/文件夹不要提交即文件无需纳入Git 的管理也不希望它们总出现在未跟踪文件列表通常都是些自动生成的文件比如日志文件或者编译过程中创建的临时文件等基本语法*.log→ 忽略所有 .log 结尾的日志文件。temp/→ 忽略根目录下的 temp 文件夹加 / 表示只匹配根目录。加在末尾的 /如 temp/表示“这是一个目录”而加在开头的 /如 /temp才表示“只匹配根目录”。temp/ 忽略任何位置的 temp 目录temp/build/temp/src/utils/temp//temp/ # 仅忽略根目录下的 temp 文件夹不递归匹配子目录! 取反比如想忽略所有 .env但保留 .env.example可以这样写*.env !.env.example前后对比创建.gitignore前创建.gitignore后并在.gitignore中编辑了a.txt三、分支1.查看本地分支命令 git branch2.创建本地分支命令git branch 分支名3.切换分支命令git checkout 分支名还可以直接切换到一个不存在的分支创建并切换命令git checkout -b 分支名4.合并分支将其他分支合并到当前分支命令 git merge 分支名称一般是将其他分支合并到master补充说明–合并的快进模式什么是快进合并要理解快进合并先看一个场景你从 master 分支拉了一个 feature 分支开始开发。在你开发期间master 分支没有任何新的提交。当你完成开发要把 feature 合并回 master 时由于 master 自你拉分支后就“原地没动”而 feature 已经“向前走”了很远。这种情况下feature分支的提交历史直接包含了master的所有历史是 master 的“直系后裔”。Git 不需要做任何“合并”工作只需要将master的指针直接“快进”到feature分支的最新提交上就行了。这就好比把指针往前拨了一下所以叫“快进”快进合并的特点优点速度快历史记录干净、线性。因为不产生额外的合并提交所以提交历史会是一条清晰的直线没有多余的分叉。缺点无法体现分支的合并痕迹。你无法从历史中看出这个提交是来自一个独立的功能分支因为所有提交都“平铺”在主分支上。5.删除分支不能删除当前分支只能删除其他分支git branch -d 分支名 删除分支时需要做各种检查git branch -D 分支名 不做任何检查强制删除6.解决冲突在 Git 中解决冲突是协作开发必备的技能。冲突本质上是指两个分支对同一文件的同一行代码做了不同的修改Git 无法自动判断该保留哪一个于是把决策权交给你解决冲突步骤如下1.处理文件中冲突的地方方式一手动编辑务必将 、、 这些标记行全部删除只留下最终想要的代码。方式二仅保留某一方命令行快速方案如果你确定完全舍弃某一方可以使用# 保留当前分支的版本 (ours) git checkout --ours 文件路径 # 保留合并进来的分支版本 (theirs) git checkout --theirs 文件路径注在 git rebase 过程中–ours 和 --theirs 所指对象是互换的容易混淆因此普通用户更推荐用方式一。2.将解决完冲突的文件加入暂存区(add)3.提交到仓库(commit)示例假设我们在master分支上修改了1.txt为hello world!,同时也在test分支上修改了1.txt为hello everyone!,当我们把test分支合并到master分支就会出现冲突我们保存master的修改解决冲突按方式一手动编辑打开 1.txt,将 、、 这些标记行全部删除只留下最终想要的代码。最终如下使用方式二解决冲突也可以实现方式一的效果如下最后add 、提交四、开发中分支使用原则与流程1.核心思想几乎所有的版本控制系统都以某种形式支持分支。使用分支意味着你可以把你的工作从开发主线上分离出来独立进行重大的 Bug 修改或开发新功能从而避免影响开发主线的稳定。2.分支类型与定义系统共分为以下几类核心分支各自承担不同职责分支类型分支名称示例定义与职责派生来源从谁创建合并目标合给谁生产分支master或main线上运行应用的主分支对应正式生产环境。中小规模项目以此作为线上运行的稳定代码。— 基线—开发分支develop主要开发分支。如果没有并行开发但不同期上线的要求团队日常开发都在此进行。阶段开发完成后合并到master准备上线。从master创建master功能分支feature/xxxx用于同期并行开发但不同期上线的功能模块。研发任务完成后合并回develop任务结束后可删除。从develop创建develop紧急修复分支hotfix/xxxx用于线上紧急 Bug 修复。修复完成后需同时合并到master保障线上、develop保障下次发版不丢失以及test保障测试环境验证。从master派生master、develop、test测试分支test补充说明用于代码测试的环境分支。——预上线分支pre补充说明用于上线前最后验证的环境分支。——五、远程仓库1.添加远程仓库此操作是初始化本地库与已创建的远程库进行对接即在本地刚 git init还没有任何远程关联命令 git remote add 远端名称 仓库路径远端名称默认是origin取决于远端服务器设置仓库路径从远端服务器获取此URL示例# 添加远程仓库origin 是默认名称可自定义gitremoteaddorigin远程仓库URL# 例如添加 GitHub 仓库gitremoteaddorigin https://github.com/用户名/仓库名.git2.查看远程仓库命令git remote 查看所有远程仓库名称命令git remote -v 查看详细地址3.推送到远程仓库命令git push [-f] [–set-upstream] [远端名称 [本地分支名][:远端分支名] ]远程分支名和本地分支名一样时冒号和远端分支名可以省略。git push origin master等于 git push origin master:master-f 表示强制覆盖–set-upstream 推送到远端的同时并且建立起和远端分支的关联关系。git push --set-upstream origin master如果当前分支已经和远端分支关联成功后git push 将当前分支推送到已关联的远端分支(当前分支再推送远端名和分支名都可以省略)4.查看本地分支与远程分支的关联命令git branch -vv用这个命令查看本地分支后面[]里如果有内容就是已关联输出示例master 123abc [origin/master] → 有关联搭档是 origin/mastermaster 123abc → 无关联孤儿分支不知道跟谁配对5.从远程仓库克隆如果已经有一个远端仓库我们可以直接clone到本地。命令: git clone 仓库路径 [本地目录]本地目录可以省略会在本地新建一个和远程同名的目录6.从远程仓库中抓取和拉取抓取 命令git fetch 远端名 分支名抓取指令就是将仓库里的更新都抓取到本地不会进行合并拉取 命令git pull 远端名 分支名拉取指令就是将远端仓库的修改拉到本地并自动进行合并等同于fetchmerge命令格式拉取哪个远端拉取哪个分支合并到哪个本地分支git pull关联的远端仓库所有分支当前分支git pull originorigin所有分支当前分支git pull origin masteroriginmaster当前分支命令行为差异git fetch拉取关联的远程仓库所有分支的更新git fetch [remote name]拉取该远程仓库所有分支的更新git fetch [remote name] [branch name]只拉取指定分支的更新7.解决合并冲突在一段时间A、B用户修改了同一个文件且修改了同一行位置的代码此时会发生合并冲突。A用户在本地修改代码后优先推送到远程仓库此时B用户在本地修订代码提交到本地仓库后也需要推送到远程仓库此时B用户晚于A用户需要先拉取远程仓库的提交经过合并后才能推送到远端分支原因如下核心原因为什么不能直接 pushB 本地缺 A 的提交直接 Push 会覆盖 A 的代码所以 Git 强制拒绝push,所以需要先拉取远程仓库的提交拉取时冲突git pull 拉取 合并。因为改了同一行Git 不知谁对谁错需解决冲突同前做法B 用户标准操作怎么做拉取git pull origin 分支名报冲突解决冲突打开文件删掉 等标记保留最终代码。此处为手动编辑提交git add . → git commit -m “xxxx”推送git push origin 分支名