git rebase 版本。。变基
git rebase,顾名思义,就是重新定义(re)起点(base)的作用,即重新定义分支的版本库状态。要搞清楚这个东西,要先看看版本库状态切换的两种情况:
- 我们知道,在某个分支上,我们可以通过git reset,实现将当前分支切换到本分支以前的任何一个版本状态,即所谓的“回溯”。即实现了本分支的“后悔药”。也即版本控制系统的初衷。
- 还有另一种情况,当我们的项目有多个分支的时候。我们除了在本地开发的时候可能会“回溯”外,也常常会将和自己并行开发的别人的分支修改添加到自 己本地来。这种情况下很常见。作为项目管理员,肯定会不断的合并各个子项目的补丁,并将最新版本推送到公共版本库,而作为开发人员之一,提交自己的补丁之 后,往往需要将自己的工作更新到最新的版本库,也就是说把别的分支的工作包含进来。
举个例子来说吧!假设我们的项目初期只有一个master分支,然后分支上作过两次提交。这个时候系统只有一个master分支,他的分支历史如下:
master0(初始化后的版本)
||
v
master1(第一次提交后的版本)
||
v
master2(第二次提交后的版本)
这个时候,我们可以通过git reset将master分支(工作目录、工作缓存或者是版本库)切换到master1或者master0版本,这就是前面所说的第一种情况。
假设我们这里把master分支通过git reset回溯到了master1状态。那么这个时候系统仍然只有一个master分支,分支的历史如下:
master0(初始化后的版本)
||
v
master1(第一次提交后的版本)
然后,我们在这里以master1为起点,创建了另一个分支test。那么对于test分支来说,他的第一个版本test0就和master1是同一个版本,此时项目的分支历史如下:
master0(初始化后的版本)
||
v
master1(第一次提交后的版本)===test0(test分支,初始化自master分支master1状态)
这个时候,我们分别对master分支、test分支作两次提交,此时版本库应该成了这个样子:
master0(初始化后的版本)
||
v
master1===test0==>test1===>test2
||
v
master2===>master3
- 这个时候,通过第一种git reset的方式,可以将master分支的当前状态(master3)回溯到master分支的master0、master1、master2状态。 也可已将test分支当前状态(test2)回溯到test分支的test0、test1状态,以及test分支的父分支master的master0、 master1状态。
- 那么。如果我要让test分支从test0到test2之间所有的改变都添加到master分支来,使得master分支包含test分支的所有修改。这个时候就要用到git rebase了。
首先,我们切换到master分支,然后运行下面的命令,即可实现我们的要求:
1 |
git rebase test |
这个时候,git做了些什么呢?
- 先将test分支的代码checkout出来,作为工作目录
- 然后将master分支从test分支创建起的所有改变的补丁,依次打上。如果打补丁的过程没问题,rebase就搞定了
- 如果打补丁的时候出现了问题,就会提示你处理冲突。处理好了,可以运行git rebase –continue继续直到完成
- 如果你不想处理,你还是有两个选择,一个是放弃rebase过程(运行git rebase –abort),另一个是直接用test分支的取代当前分支的(git rebase –skip)。
此外,rebase还能够让你修订以前提交,
git rebase -i HEAD~3
表示要修改当前版本的倒数第三次状态。
这个命令出来之后,会出来三行东东:
pick:*******
pick:*******
pick:*******
如果你要修改哪个,就把那行的pick改成edit,然后退出。
这时通过git log你可以发现,git的最后一次提交已经变成你选的那个了,这时再使用:
git commit -amend
来对commit进行修改。
修改完了之后,要回来对不对?
使用git rebase --continue
git reset --soft 只会改变状态,不会改变工作区内容
git reset --hard 既会改变状态也会改变工作区内容
相关推荐
Git 是一个版本控制系统,广泛应用于软件开发过程中。其中,git rebase 和 git merge 是两个常用的命令,都是用于合并分支,但是它们的实现机制和应用场景却有所不同。 git merge 是一种非破坏性的操作,通过创建...
Git是世界上最流行的分布式版本控制系统,它提供了丰富的命令来管理代码仓库。在开发过程中,我们经常需要合并代码,而`git rebase`就是一种强大的工具,用于整理和优化提交历史,使其更加整洁。本文将深入探讨`git ...
git rebase 命令可以将提交点放置在一条直线上,并根据提交时间进行排序。这是 git rebase 的一个常见用途。 当使用 git rebase 时,Git 会从指定的提交开始,重新应用后续的提交。这样可以将一系列提交重新排列,形成...
借助Node.js的强大功能和命令行的便捷性,`Rebase-editor`使得Git rebase变得更加直观和高效,尤其适合那些频繁进行代码整理的开发者。在日常开发工作中,熟练掌握和使用`Rebase-editor`将有助于保持代码库的整洁,...
Git 是一个分布式版本控制系统,它提供了两种合并分支的策略:`git merge` 和 `git rebase`。两者都是为了整合不同分支的更改,但它们在处理合并的方式上有显著的差异。 ## Git Merge `git merge` 是最常见的合并...
8. 如果在变基过程中出现冲突,Git会提示你解决冲突,解决冲突后,你需要再次执行`git add`将冲突解决后的内容加入暂存区,然后使用`git rebase --continue`继续变基。 9. 当变基完成,并且没有冲突时,你会被提示...
Git Rebase(Visual Studio代码扩展) 使用键盘快捷键可以快速编辑交互式Git基准库的操作。 如何使用 按下与您所需的git rebase操作相对应的键。 此命令将应用于所有选定的行。 键盘快捷键: p将命令设置为“ ...
Git是世界上最流行的分布式版本控制系统,它提供了丰富的命令来管理代码仓库。其中,`git rebase`是一个非常强大的工具,能够帮助开发者整理提交历史,使其更加线性和整洁。然而,不当使用`git rebase`可能会导致...
merge主要发生在这样几个地方1 两个人同时开发一个分支,在拉取对方代码的时候2 要将代码合并到master的时候git pull origin master
通过熟练掌握 `git rebase -i`,开发者可以更好地管理代码历史,使得版本控制更加高效且易于理解。需要注意的是,在多人协作的项目中使用 `rebase` 时,要确保其他开发者不会受到操作的影响,因为 `rebase` 可能会...
在进行推送和变基操作时,必须确保不会丢失任何有价值的工作,并且要遵守团队的代码审查和分支管理策略,尤其是对于受保护的主分支。在进行强制推送之前,确保你了解其可能带来的后果,并且已经与其他团队成员进行了...
Git rebase 是一个强大的版本控制工具,它允许你将一系列提交重新应用到不同的基分支上,通常是为了整合历史记录或者保持提交的线性。然而,如果不小心操作,可能会遇到一些问题,例如标题中提到的 "master|REBASE 1...
rebase,有垫底,基底的意思,Gitrebase我们称它为Git变基,即在当前分支外另一点上重新应用当前分支的提交历史,变基是Git整合变更的一种方式,另一种方式是什么呢(当然是合并了)?变基的基础使用已经在上一篇中...
Git是一款分布式版本控制系统,它在软件开发中扮演着至关重要的角色,帮助团队协作和代码管理。IntelliJ IDEA(简称IDEA)是广受欢迎的Java集成开发环境,同样也提供了强大的Git集成功能。本文将深入探讨如何在IDEA...
git-rebase-reword git-rebase-reword是一个简单的git命令,以与修改相同的方式来更改一个提交(最后一个或更旧的提交) 文献资料 它是基于对rebase交互操作的名称来命名的,以补充提交“ reword”。 参见和 -...
git rebase -i HEAD~n,n条commit进行rebase 将需要修改的commit信息,将pick命令改为 r 命令;ESC 输入 :wq 回车 开始修改commit信息,修改完,ESC 输入 :wq 回车 打印出成功 git log oneline -n,查看n条log信息,...
通过此实验室/游乐场学习“ git rebase -i” 是否想学习如何正确使用git rebase -i (也称为交互式rebase)而又不会使您的生产仓库面临风险? 您来对地方了! 此仓库中包含的脚本将创建一个git仓库(带有2个克隆副本...