文章目录
引言
通过工作日常场景应用整理一些git操作,方便小白快速上手~
一、基础知识
1. 图解
Git : 用于代码版本控制的工具,团队协作必备。自己本地的代码提交到远程仓库一共分为如下图几个阶段:
图片来源:菜鸟教程
workspace:工作区,即我们IDE写代码的地方
staging area:暂存区/缓存区,
local repository:版本库或本地仓库
remote repository:远程仓库
git 主要就是围绕图上几个命令使用
2. 原理
这里以git diff举例:
Git 使用的是一种称为差异存储**(delta storage)的技术来管理文件的版本。**它并不保存每个文件的完整副本,而是保存每个版本与前一个版本之间的差异。当需要比较两个版本的文件差异时,Git 可以根据存储的差异信息重新构建文件内容。
具体来说,Git 保存的每个提交(commit)都包含了一个快照(snapshot),它记录了所有文件在该提交时的完整状态。每个提交都指向一个或多个父提交,以形成版本历史记录。当需要比较两个提交之间的差异时,Git 会按照提交的顺序逐个比较它们之间的版本快照。
Git 使用一种称为三方合并(three-way merge)的算法来计算两个版本之间的差异。它会找到两个版本的共同祖先(common ancestor),然后比较各个版本与共同祖先之间的差异,以确定每个文件的添加、删除和修改操作。通过这种方式,Git 可以高效地计算出较新版本相对于较旧版本的差异,从而进行合并、回滚或查看差异等操作。
通过比较 Git 存储的版本快照之间的差异来实现,可以避免每次比较都需要读取和比较完整的文件内容,从而提高了比较的效率和性能。同时,这种基于版本快照的差异存储也使得 Git 可以有效地管理大型代码库,并支持分布式版本控制。
二、应用场景
1. 初始设置
- git 安装:略
- 用户配置:在服务器上就不要加global了
git config --global user.email "you@example.com"
git config --global user.name "Your Name"
- 免密登陆:略
2. git 开发流程
1) 拉取远程仓库代码到本地
git clone git地址
2)在本地创建新分支
- 根据任务创建相应分支,比如开发charLength函数,创建本地分支charLength;
- 同时本地分支名尽可能表明其功能和所属版本,不要写的很简单。
- 示例,从远程master分支拉取代码创建本地分支charLength:
git checkout -b charLength origin/master //会建立映射
- 如果是指定commit为起点
git checkout -b from_a28011 a280114eb0dff901aa154c4c0772720374318ab7
- 或者
git fetch origin 远程分支名x:本地分支名x
不会建立映射,且需要自己手动切换分支
3)在本地分支开发
开发时注意查看自己是在哪个分支,不要弄错了
4)提交
- 首先更新一下代码,因为此时远程分支可能merge了别人提交的代码
git rebase origin master
遇到冲突一定要慎重解决,不要把别人的给删了; 下文有更详细的命令
- 保存修改的文件(将改动保存到了暂存区),其中注意不要无脑add * ,改变目录结构时记得添加ignore文件
git add filename
- 提交代码到本地仓库,记得添加提交信息,一般团队开发有自己的格式:
git commit -m " message "
- 最后提交到远程仓库
git push origin charLength
远程会自动创建一个和本地charLength同名的远程分支
如果是提交到一个已经存在的远程分支上,命令
git push origin 本地分支:远程分支名
3. 回退到某一版本
$git reset --hard commitID
4. git 更新本地分支
可能在你开发过程中,其他人在远程master上提交了代码,需要你更新自己的本地分支,做法:
- git rebase 首选
git rebase origin master
- 或者git pull 命令:等同于先做了git fetch ,再做了git merge。即:
git fetch origin master
git checkout charLength
git merge origin/master
好多人不建议使用git pull,喜欢自己merge,以便万一自动merge出错的时候可以解决冲突
三、git命令
1. git fetch
git fetch只是把代码拉下来,(此时只更新了Repository), 它取回的代码对你本地的开发代码没有影响,如需彻底更新需要git pull 或者git fetch + merge。
//可以用来查看当前代码和最新代码的区别
git fetch origin 8.0/native-dev
git diff FETCH_HEAD
2. git rebase 与git merge的区别:
- git rebase 本质上是达到一个线性提交,功能有二:
一是合并连续几个提交,让记录变得整洁
二是更新分支,与git merge相比,git rebase最终达到一个线性的提交记录,而git merge会有分支上的一个合并。见下面链接的图片示意:
图片出自文章
即mywork在c2的基础上开发了c5 c6 , - 使用git merge是将两个分支上的改动合并成新的commmit c7, 结果看起来就像一个新的"合并的提交"(merge commit),git log 上也有记录;
- 而rebase则好像没有合并过。git rebase会把mywork分支里的每个提交(commit)取消掉,并且把它们临时保存为补丁(patch),然后把mywork分支更新到最新的master分支,最后把保存的这些补丁应用到mywork分支上(此时的c5 c6 的commit id其实已经改变了)。如果有冲突,解决冲突并add文件后,再进行git rebase --continue。
- 另外要注意的是,git rebase 后,往往push失败,
git push -f 是不安全的,
推荐用git push --force-with-lease
3. git stash
暂存当前分支的改动,如果在开发分支a的时候,需要转换到分支b, 那么可以用stash暂存改动; 还可以用于将一些改动从一个分支转移到另一个分支。
- 保存对象: commit之前的文件(git可以追踪到的), 如果追踪不到,先git add 后再保存。
具体见git stash 用法总结和注意点
三、所遇错误
1. 使用git checkout -b origin/命令报错is not a commit and a branch ‘dev_86984_newn‘ cannot be created from it
- 场景: 在本地分支master上创建一个新的分支
git checkout -b newbranch origin/master
- 出错:
is not a commit and a branch ‘newbranch‘ cannot be created from it
- 原因:由于在当前分支时间过长,当前分支改变内容过多
- 解决办法:
git pull origin master
git checkout -b newbranch origin/master
2. failed to push some refs to
- 原因1: git rebase后会出现这种情况;
解决办法:
git push origin master --force-with-lease
- 原因2: 因为有人直接在远程分支修改了一下,造成本地分支和远程分支不一致,需要rebase一下再提交