百度360必应搜狗淘宝本站头条
当前位置:网站首页 > IT技术 > 正文

深入git rebase 深入浅出React开发指南

wptr33 2024-11-06 20:33 26 浏览

关于Git 我们之前有很多文章介绍过相关的功能和扩展应用。我也介绍过如何在Git中自由穿梭重置redo。当然有的时候我们需要改变Git的提交历史。Git也提交很多工具,本文虫虫带领大家来实例深入学习其中的一个工具rebase。

准备

为了不破坏现有的仓库,我们首先创建一个新建一个实验repo,所有操作都在该仓库下操作。创建命令如下:

mkdir rebase-repo

cd rebase-repo

git init rebase-repo

git commit --allow-empty -m "init"

注意我们给git commit -m "init",增加了一个参数"--allow-empt",否则如果是一个空库的时候会报错,如下

通过实验环境rebas-rep仓库,任何时候出现问题搞不定了,只需删除掉rm -rf rebase-repo/.git目录并重新运行这些命令就可以初始化整个实验环境。

git pull --rebase

如果远程git服务器仓库分支已经有了更新上,通常git pull时候将会默认执行merge合并提交。相当于执行两个操作:

git fetch origin

git merge origin/master

实际上除了合并外还有一种方法,那就是执行rebase来同步变化,它通常更有用,git提交历史也更清晰,rebase方法需要显性指定--rebase参数:

git pull --rebase ,他相当执行:

git fetch origin

git rebase origin/master

合并方法更简单,更容易理解。但是很多时候我们更需要的是rebase,我们也可以通过设置,设置rebase为pull时候默认执行的动作:

git config --global pull.rebase true

使用git rebase改变分支依赖

当然git最初始的功能是和其字面上意义一样,改变分支的依赖分支。假设有以下分支:

而且feature-2不依赖于feature-1中的任何变化,就可以rebase让它基于master。

git checkout feature-2

git rebase master

git rebase对所有涉及的commit("pick")执行默认操作,它只是将历史记录回滚到最后一个公共父节点,并重新生成两个分支的commit。git就会变成历史现在看起来像这样:

修改最近的commit

先做一个最简单的的操作:修复最近的提交。让我们在rebase-repo中增加一个文件,但是commit信息有问题:

echo "Hello Chongchong" > one.txt

git add one.txt

git commit -m "添加Hello"

修改commit非常简单,只需使用"—amend"选项就可以。我们可以编辑文件并用--amend提交,如下所示:

echo 'Hello Chongchong!' > one.txt

git commit -a --amend

指定-a添加所有更改的,而--amend会将更改添加到最近一个提交中。保存并退出编辑器(vim的话wq,也可以修改提交消息)。你可以通过运行git show来看提交的信息:

修改历史commit

"—amend"选项仅仅可以修改最近的一次提交。如果我们要需要修改更老的呢?我们先多创建一个提交历史环境

echo 'Hello ' >one.txt

git add one.txt

git commit -m "添加Hello"

echo "第二个文件" > two.txt

git add two.txt

git commit -m "添加two"

现在发现one.txt少了"Chongchong!"。现在需要添加上:

echo 'Hello Chongchong!' > one.txt

git commit -a -m "添加Chongchong"

这样既可以,但是为了commit历史更好看,需要把最后一个提交修改删除最后面这次提交历史。为此,为实现这个功能,我们需要使用rebase命令。下面我们使用交互式分时修改这三个提交:

git rebase -i HEAD~3

命令会在你默认的编辑器中打开最近三次的commit历史,-i表示用交互式打开,如下所示:

如上图,编辑器中显示了最经三次的历史,三个pick comit哈希。修改这个文件,我们可以告诉git修改历史记录。当我们保存推出编辑器时,git将从其历史记录中删除所有这些提交,然后一次执行每一行。默认情况下,会使用(pick)每个提交,并将其添加到分支。现在我们使用fixup,修改将操作从"pick"修改为"fixup"并在我们想要"fixup",移动到"添加two"commit的前面:

wq保存退出编辑器 , git会自动运行这些命令。git log看下git历史:

将几个提交合并成一个

有时候,我们需要将本地大量的提交合并为一个,然后提交到远程仓库或者合并到master时,以确保整个提交历史的清晰洁净,这也是rebase最常用的功能之一。为了合并提交,需要使用squash操作。我们先写脚本实现多次提交的环境,

git checkout -b squash

先创建一个新的分支,来执行下面shell:

for i in H e l l o , ' ' C h o n g c h o n g; do

echo "$i" >>hello.txt

git add hello.txt

git commit -m "增加Hello,$i"

done

执行该脚本,通过shell for循环多次,按照多个字母提交到文件文件,每次增加一个字母,最后实现"你好,Chongchong"。复制以上脚本到shell终端执行,

我们使用交互式rebase执行将它们合并到一起。我们执行git rebase -i master结果:

先我们要将所有这些更改压都合并为一个commit,要实现这个目的,只需将每个"pick"操作更改为"squash",第一行除外,如下所示:

我们使用vim批量修改命令:2:$ s/pick/squash/

使用wq保存并退出编辑器时,git处理,并次打开编辑器以修改最终的提交消息。显示如下:

提醒我们为该合并使用一个合适的commit消息,默认显示了所有提交历史的commit,我们修改为我们需要显示的commit消息,然后推出保存。git show显示,提交信息如下:

现在我们可以将master分支rebase到squash分支,并删除临时的squash分支,这样就消除了所有分支合并的过程。git rebase这时的效果和git merge一样但是不会进行合并提交:

git checkout master

git rebase squash

git branch -D squash

将一个提交分成几个

上面我们介绍了将多个提交合并为一个。但是实际中也有需要将某一个比较重的提交分割成多个小提交的需求,我们此处就介绍这个。我从增加一个perl的md5检查程序(你可以用其他任何文件来代替)来开始:

vim md5check.pl

git add md5check.pl

git commit -m "增加一个perl程序"

接下来,给文件增加代码:

git commit -a -m "增加md5check"

git show 显示下本地提交的内容:

现在我们学习如何拆分该commit:

首先启动交互式rebase。让我们用git rebase -i HEAD~2来修改这个提交,显示:

ZZ

我们把第二个条指令从"pick"更改为"edit",然后wq保存并退出vim。Git会显示:

我们可以按照上面的说明给该次提交添加更改, 在此我们执行git reset HEAD^来执行软reset。将最新一次的文件状态修改为未提交状态。现在运行git status,我们可以看到它取消提交最新提交并将其更改添加到工作树:

为了解决这个问题,我们换用交互式提交。它可以让我们选择地提交工作树中的特定更改。运行git commit -p以启动此过程,将看到以下提示:

上图显示有一个大段的代码修改,我们来对该commit拆分。我们需要使用 "s"命令将大的提交拆分成更小的部分。

git自动分析,并将该修改分成6块,让我们点击"y"修改为分割的状态。然后点击"q" 完成交互式会话并继续提交。这是会显示未编辑界面,我们在此输入合适commit消息。

wq 保存退出编辑器。 执行保存该次拆分:

git commit -a -m"增加md5_check"

最后我们私用rebase --continue完成edit操作,并继续执行rebase。

git rebase --continue

使用git log来查看拆分结果

对commit重新排序

这个很容易。我们提交三个commit:

echo "one" >one.txt

git add one.txt

git commit -m "add one"

echo "two" >two.txt

git add two.txt

git commit -m "add two"

echo "three" >three.txt

git add three.txt

git commit -m "add three"

git log查看历史:

现在我们想要改变下commit的历史,以3,2,1顺序显示。运行git rebase -i HEAD~3,将会启动编辑器,媳那是rebase的操作列表:

修改列表顺序,如下:

wq保存并退出编辑器,git就会按照新的顺序重新生成commit历史。

解决rebase冲突

有时你在做一个rebase时会遇到合并冲突,解决方法和其他时候冲突解决方法也一样。git也会对受影响的文件设置冲突标记,可以用git status显示需要解决的冲突行,使用git add或git rm将文件标记为添加。但是在使用git rebase情况下,我们需要注意的是:完成冲突解决的方法不同,在解决git merge引起的冲突时是用的是commit,而在rebase时候用的是git rebase --continue,也可以使用git rebase --skip忽略此次最该的提交,这样就不会包含在rebase中。

总结

本文我们深入了git rebase的各种用法,善用git rebase可以让我们的提交历史变得更加优雅,虽然他不是一个必须的,但是对一个处女座的码农来说,rebase是必不可少的神器。

相关推荐

Flutter状态管理之Provider数据共享的底层实现

#头条创作挑战赛#简介高级的Flutter工程师往往都是从最简单的架构开始研究学习,今天给大家带来的是Flutter中比较重要的状态管理框架Provider,也是每位Flutter开发者必学的框架。P...

字节跨平台框架 Lynx 开源:一个 Web 开发者的原生体验

...

flutter软件开发笔记17-isolate的机制作用

这个isolate,相当于其他编程中的线程,并行处理一些事件,让程序更加高效。用厨房做菜的比喻帮你理解Isolate,附完整可运行的代码示例:一isolate的比喻解释假设你是一个主厨(主Isol...

七爪源码:如何使用 SQLite 数据库在 Flutter 中保存大数据

SQLite是一个开源、零配置、自包含、独立的事务关系数据库引擎,旨在嵌入到应用程序中。sqfliteFlutter的SQLite插件。支持iOS、Android和MacOS。支持事务...

Flutter 实现多语言

本文同步本人掘金平台的文章:https://juejin.cn/post/7164571616314130469我们在处理跨国业务、跨地区(比如港澳台)业务的时候,需要针对当地的语言来做兼容。所以,我...

开始第一个Flet应用

Flet是基于Flutter的UI框架,但是我们不需要熟悉Flutter,也不需要会前端,只要具备Python面向对象编程基础就可以了。当然我本人是不会Flutter的,所以也没法对比Flet和Flu...

《史记微软UI框架轮回本纪》

微软者,乃美地西雅图之枭雄,曾持Windows以令诸侯。自庚午(1990)以降,数易UI之术,然其UI之框架兴也勃焉,其亡也忽焉。太史公观其轮回之迹,未尝不掷笔长叹:天命固难测,然微软UI之败,岂非自...

Android中的数据库和本地存储在Flutter中是怎样实现的

如何使用SharedPreferences?在Android中,你可以使用SharedPreferencesAPI来存储少量的键值对。在Flutter中,使用Shared_Pref...

Flutter——输入部件

上一节介绍了文本部件,用于显示文本。但是在我们进行日常软件开发过程中,经常是需要获取用户键入的内容,比如用户名、密码、性别、喜好等等。...

我用VS Code 开发工具来开发 自己的 Flutter 应用 工具快而轻

本文将与你一起回顾如何在VSCode里进行Flutter应用的开发。1.安装和配置根据编辑工具设定的指引来安装Dart和Flutter扩展(也叫做插件)。1.1更新扩展程序...

Flutter 结合 Dio 使用

#头条创作挑战赛#上一篇文章...

Flutter——路由

路由(Route)在移动开发中通常指页面(Page),这跟Web开发中单页应用的Route概念意义是相同的,Route在Android中通常指一个Activity,在iOS中指一个...

Flutter 实战经验(五):在 VS Code 里开发 Flutter 应用

本文将与你一起回顾如何在VSCode里进行Flutter应用的开发。1.安装和配置根据编辑工具设定的指引来安装Dart和Flutter扩展(也叫做插件)。1.1更新扩展程序扩...

Flutter 2 的Windows 开发试验

刚安装了flutter2.1dev版本,测试下很感觉兴趣的Windows开发当前flutter环境为(flutterdoctor):Doctorsummary(toseeallde...

基于flutter/dart仿抖音app实例

简介flutter_tiktok项目是基于flutter+dart+fijkplayer等技术开发的仿抖音短视频app实例。https://github.com/mjl0602/flutter_tik...