Git实用指南

引言

通过工作日常场景应用整理一些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. 初始设置

  1. git 安装:略
  2. 用户配置:在服务器上就不要加global了
  git config --global user.email "you@example.com"
  git config --global user.name "Your Name"
  1. 免密登陆:略

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暂存改动; 还可以用于将一些改动从一个分支转移到另一个分支。

三、所遇错误

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一下再提交

新手学习链接

菜鸟教程

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值