哪部分写的不对望各位指出
什么是git?
git是分布式的版本管理系统。
集中式&分布式
集中式版本控制系统是将版本库集中的存放于中央服务器,每一次进行项目开发都需要在中央服务器获取最新版本,才可以继续编写代码,待代码编辑完成后,推送到中央服务器上,但获取代码及推送代码都需要联网。过于依赖服务器。
特点:
- 必须要有中央服务器,必须联网
- 一个人创建分支则所有人都会有
分布式版本控制系统没有中央服务器,每个人的电脑中都有完整的版本库,提高了代码存储的安全性。
-
特点:
- 相较于集中式的全程联网,分布式可在没有网络的情况下也可以执行commit、查看版本提交记录、以及分支操作,在有网络的情况下执行 push 命令即可将改变提交至远程仓库。
- 对比集中式会将项目所有文件存储在中央服务器,分布式中的文件会以更小的元数据形式存储,该举措极大程度上缩小了存储文件的体积
git操作
git操作流程
首先我们介绍具体操作流程过程中涉及到的几部分空间
- workspace:工作区
- Index:暂存区,又叫stage
- repository:本地仓库
- remote:远程仓库
git操作常用命令
-
git config:git 相关配置。可配置用户名、邮箱,向仓库提交修改时,需要用户名和邮箱来跟踪记录提交者。
// 配置用户名 git config --global user.name "Your Name" // 配置用户的邮箱 git config --global user.email "email@example.com"
- git init:初始化版本库。出现.git文件夹
- git add :将改动添加至暂存区
-
添加所有文件
git add . -
添加单个文件
git add tyx.txt
-
git commit :提交文件至本地仓库
-
-m:添加提交描述
git commit -m 'feature: 样式修改' -
-a:参数设置修改文件后不需要执行 git add 命令,直接来提交
git commit -a -
我们也可以两个命令一起使用,添加文件的同时对本次操作进行描述
git commit -am 'feature:样式修改' -
--no-verify:忽略本次提交中检查出来的错误
-
- git push:推送本地分支至远程仓库
-
git pull:拉取远程仓库内容到本地
-
git pull :拉取远程仓库中当前分支的内容
-
git pull origin :拉取远程仓库origin至本地
git pull origin master // 拉取master分支至本地
-
-
git diff:对比和显示 commit 之间、工作区或者暂存区等详细的修改内容。
-
显示工作区的修改内容——显示的是即将 git add 的内容。
git diff -
显示暂存区的修改内容。修改内容是相对于 HEAD 的——暂存区和上一个 commit 对比。
git diff --cached -
显示工作区相比于指定的 commit 的修改内容——工作区和指定的 commit对比
git diff <commit> -
显示暂存区相比于指定的 commit 的修改内容——暂存区和指定的 commit对比
git diff --cached <commit> -
显示 commit2 相对于 commit1 的修改内容
git diff <commit1> 2<commit2>
-
- git status:查看当前仓库的状态,可以看到当前仓库中是否有文件被修改或暂存。
- git log:查看提交历史,可以看到之前所有的 commit 信息,包括 commit 的 Hash、日期、人员、日志
- git reflog:记录了分支的操作记录(我的理解是在当前分支所有的操作记录)
git log是显示当前的HEAD和它的祖先的,递归是沿着当前指针的父亲,父亲的父亲,这样的原则
git reflog:git reflog根本不遍历HEAD的祖先。它是HEAD所指向的一个顺序的提交列表:它的undo历史。reflog并不是repo(仓库)的一部分,它单独存储,而且不包含在pushes,fetches或者clones里面,它纯属是本地的。
- git branch:用来显示当然分支,删除分支,新增分支,分支重命名,跟踪远程分支等
- git branch:查看本地所有分支
- git branch -a:显示本地和远程的所有分支
- git branch -d:删除分支,会检查是否已合并,如果未合并则会提示“还未合并,无法删除”,-D 则会强制删除。
- git checkout:检出某个状态,即快照,可以是检出文件、分支。
-
git checkout :切换至某个分支
git checkout master // 切换至master分支 -
git checkout -b :从当前分支切换至新分支并为该分支命名
// 背景:当前分支为master分支 git checkout -b feature/style // 基于master分支创建feature/style分支
- git reset:恢复到某一次提交。将该次提交之后的所有提交到都丢弃。
注意:如果是已经推入远程仓库的分支,禁止使用 git reset,除非你非常清楚的知道自己在做什么,否则人民会痛恨你,野狗会追咬你,这种情况下试试 git revert。
-
git reset --mixed:表示重置暂存区即 index,修改内容不会丢失,会恢复到工作区。
-
git reset --hard :恢复到某一次提交。commit 代表某个提交的 Hash 值,也可以使用HEAD。
git reset --hard HEAD@{3} -
git reset --soft :恢复到某一次提交,并将恢复的修改保留到工作区和暂存区
- git revert :commit 是指 commit 的 Hash 或者 HEAD 相关。恢复某一次提交。将某一次提交的修改恢复回去
-
git merge:合并分支。
假设我当前分支是master。
git merge branch1 // 将branch1合到master上
-
git rebase:变基。与 merge 不同,rebase 会将被分支的 commit 续到当前分支上,让 commit 历史呈现单线的状态,非常方便追溯问题和重置修改
注:
git merge与git rebase的区别: 参考链接:juejin.cn/post/702672…
- merge 是一个合并操作,会将两个分支的修改合并在一起,默认操作的情况下会提交合并中修改的内容,merge 的提交历史记录了实际发生过什么,关注点在真实的提交历史上面
- rebase 并没有进行合并操作,只是提取了当前分支的修改,将其复制在了目标分支的最新提交后面,rebase 操作会丢弃当前分支已提交的 commit,故不要在已经 push 到远程,和其他人正在协作开发的分支上执行 rebase 操作
我们有两个分支,master 分支和release分支,release 分支是基于 master 分支在B处的提交节点创建的,在创建后 master 分支又经过迭代提交了两次,从C到D节点,release 分支也基于B往前继续更新了两次,到了F节点。两者从B开始就走向了分叉。
首先我们演示merge:
将 release 分支合并到 master 分支
// 切换到master分支 git checkout master // 将 release 分支合并到 master 分支 git merge releasemerge 命令 它会把两个分支的最新快照(F、E 和 D、C)以及二者最近的共同祖先(B)进行三方合并,合并的结果是生成一个新的快照G
接下来我们看一下rebase命令:
将release分支合并到master分支
// 将分支切换到master分支 git checkout master // 把release分支合并到master分支 git rebase release当我们在master (待变基分支)上执行git rebase release(基分支)时,git就会从两者的共同祖先B开始,提取 master 分支上的修改,也就是 C,D 两个 commit ,提取到之后 git 会先保存起来,然后将master 分支指向 release 分支最新提交的节点,也就是F节点,然后把提取到的 C,D 接到F后面,在这个过程当中,会删除原来的C,D commit 记录,生成新的C',D',虽然C',D'和原来的C,Dcommit的内容是一样的,但是 commit id 是不同的。
git merge和git rebase都是用于分支合并,关键在于commit记录的处理上不同:
- git merge会新建一个新的commit对象,然后两个分支以前的commit记录都指向这个新的commit记录,这种方法会保留之前每个分支的commit历史
- git rebase会先找到两个分支的第一个共同的commit祖先记录,然后将提取当前分支这之后的所有commit记录,然后将这个commit记录添加到目标分支的最新提交后面,经过这个合并后,两个分支合并后的commit记录就变为了线性的记录了
-
git fetch:git fetch 是把远程仓库的更新,合并到本地仓库中的远程分支,不会合并到本地分支
-
git stash:缓存当前改动
- git stash list:查看所有stash
- git stash show -p stash@{3}:查看某个stash内容
- git stash apply stash@{id} :回复指定stash id的内容
- git stash pop 恢复stash列表中第一个内容
commit规范
Commit message 和 Change log 编写指南 - 阮一峰的网络日志
常遇到的问题
-
提了mr之后遇到冲突:
- git pull
- 解决冲突
- add,commit,push
-
想退回到之前的代码:
- git reflog查看操作历史
- 根据情况选择git reset或者git revert命令回退
-
pull拉错分支了怎么退回
- git reflog 查看操作历史
- git reset --hard ae5244a8 填写自己想要回退的版本
-
切换分支的时候会将改动带到目标分支(从release分支切换到master分支)
当前为release分支:
- git add
- git commit
- git push
这样再切换就不会把改动带过去了
-
多次修改出现很多commit但是不想被别人看到怎么办?
-
使用rebase命令
-
gitlab提交mr的时候勾选squash commits选项,将多个提交合并成一个
-
-
-
当想合入某个commit时,可以使用git cherry-pick 指令合入对应的commit,但需要拉取到分支最新的代码
可视化工具
同事小姐姐强烈推荐的fork:fork.dev/