即使使用了 --keep-empty,交互式变基后也会删除空提交

2024-01-05

我在使用时遇到一些问题--keep-empty的选项git rebase,而我是 不确定我是否误解了此选项的作用,或者存在错误。

这是一个最小的例子:

Setup

  1. 创建一个新的 Git 存储库和一个初始的、不相关的提交。

    $ git init
    $ echo something >base.txt
    $ git add base.txt
    $ git commit -m 'some base commit to not run into the root corner case'
    
  2. 创建一个新提交,添加两个新文件。

    $ echo A >a.txt; echo B >b.txt
    $ git add a.txt b.txt
    $ git commit -m 'add A and B'
    
  3. 修改其中一个文件。

    $ echo A1 >a.txt
    $ git add a.txt
    $ git commit -m 'change A'
    
  4. 修改另一个文件。

    $ echo B1 >b.txt
    $ git add b.txt
    $ git commit -m 'change B'
    

Rebase

$ git checkout -b rebased master
$ git rebase --keep-empty -i :/base

……选择edit提交在哪里A and B添加,并更改它以便仅B添加(在实际场景中,原因可能是A是保密的):

$ git rm a.txt
$ git commit --amend
$ git rebase --continue

当然,下一次提交是在哪里A现在修改会产生冲突:

error: could not apply 182aaa1... change A

When you have resolved this problem, run "git rebase --continue".
If you prefer to skip this patch, run "git rebase --skip" instead.
To check out the original branch and stop rebasing, run "git rebase --abort".
Could not apply 182aaa1701ad100fc02a5d5500cacebdd317a24b... change A

...选择不添加修改版本a.txt:

$ git mergetool
Merging:
a.txt

Deleted merge conflict for 'a.txt':
  {local}: deleted
  {remote}: modified file
Use (m)odified or (d)eleted file, or (a)bort? d

提交在哪里A修改后现在为空:

$ git diff --cached
# nothing

…并完成变基:

$ git rebase --continue
Successfully rebased and updated refs/heads/rebased.

Question

所以现在我的历史有两个版本,区别在于没有任何痕迹A在其中之一。然而,因为我选择了--keep-empty选项,我仍然希望存在一个空提交rebased,这会告诉我A如果它在那里的话,就会被修改。

但显然,情况并非如此:

$ git log --oneline master
f893569 change B
182aaa1 change A
3340b71 add A and B
38cb5da some base commit to not run into the root corner case

$ git log --oneline rebased
73a2c05 change B
55f502b add A and B
38cb5da some base commit to not run into the root corner case

这不是么--keep-empty应该做,或者不起作用 正确吗?


有关的:在根上重新建立基础并保留空提交 https://stackoverflow.com/questions/34529723/rebase-on-the-root-and-keep-empty-commits是一个非常相似的问题,但它涉及--root我在这里明确避免了极端情况。它没有答案,只有一些评论表明我在这里展示的内容应该有效。另一个区别是,在另一个问题中,提交首先是空的,而这里只有在解决冲突后才变成空。


这是一个错误,因为某种功能。 :-)

当你运行交互式变基并且它“暂停”时,实际上,它finishes,但留下一些文件以便new git rebase意识到这毕竟更像是一个延续。就目前而言,这还不错;你需要跑git rebase --continue稍后开始一个新的变基并告诉它:你并不是真正的新手,去阅读状态并表现得像你正在继续原来的变基一样。

并且,让我们看一下“交互式变基”。实际上,这主要是一系列挑选操作:pick命令从字面上指示旧的 rebase shell 脚本(现已逐步淘汰)运行git cherry-pick.

好吧,到目前为止没什么大不了的。但让我们考虑一下why交互式变基停止。有两个原因:

  1. 您将提交标记为“编辑”。它实际上提交了择优选择,然后停下来让您修改提交或以其他方式对其进行处理。

  2. 或者,存在问题(例如合并冲突)迫使停止。

在情况(1)中,当你运行时git rebase --continue, Git 应该not做出自己的承诺。

在情况(2)中,当你运行时git rebase --continue, Git should做出自己的承诺。也就是说,除非(这是功能部分)您首先进行自己的提交。在这种情况下,对于情况 (2) Git 应该not做出自己的承诺。

Git 可以,也许应该,记录停止的原因,以便区分这两种情况……但事实并非如此。相反,它只是查看状态--continue.

For a non-交互式变基,Git 知道它只会在发生冲突时停止,因此它知道尝试进行提交,并在没有任何内容可提交时抱怨。这就是--keep-empty or -k标志很有用。 (在内部,非交互式案例使用git format-patch and git am默认情况下,尽管您可以强制它使用交互式机制--preserve-merges例如。我在这里提到这一点是因为它是实施原因Git 必须知道你是否在“交互”:正如经常发生的那样,Git 让实现决定行为。如果 Git 不需要这种区别,--continue可以使用相同的代码进行交互式和非交互式变基,但是 Gitdoes需要区分,因此不使用相同的代码。)

不过,对于交互式变基,Gitallows在运行之前,您可以在情况 (2) 中进行自己的提交git rebase --continue(这是功能部分)。如果是这样,则--continue步骤应该继续到下一个提交。所以--continue只是检查现在是否有需要提交的内容,而不是检查案例 (1) 与案例 (2) 的早期交互式变基是否退出。这个简单的实现技巧启用了该功能,但也意味着--keep-empty cannot在这里工作:Git 只是不知道其中的区别。

解决方法是自己做git commit --allow-empty解决合并后。换句话说,使用“您可以自己提交”功能将案例 (2) 转换为模拟案例 (1)。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

即使使用了 --keep-empty,交互式变基后也会删除空提交 的相关文章

  • git 显示更改了 0 次插入(+)、0 次删除(-)的文件

    很多时候 当我运行 git diff shortstat 命令时 它会输出以下内容 17 files changed 0 insertions 0 deletions 即使没有插入或删除 文件怎么可能发生变化 如果项目中某些文件的文件权限已
  • 对于 Web 应用程序来说,您理想的 git 分支架构是什么?

    我们是一个由开发人员组成的小团队 正在构建 Web 应用程序 我们目前拥有一个实时 测试和多个开发环境 您会建议什么分支架构 以便理想情况下每个开发人员都可以处理他的功能 这些功能可以在不影响其他开发人员 功能的情况下进行测试和部署 目前
  • git fatal:无法读取对象 xxx:参数无效

    如果我从远程获取数据 我会收到以下错误 git pull remote Counting objects 85 done remote Compressing objects 100 37 37 done remote Total 85 d
  • 将 git 设置为始终提示输入凭据

    由于一些专门的硬件 我们有一台与几个开发人员共享的机器 我希望 git 提交和推送始终提示输入凭据 我尝试过在 SO 上找到的一些修复 包括git config global unset credential helper以及编辑配置以包括
  • 如何完全删除使用init创建的git存储库?

    我创建了一个 git 存储库git init 我想完全删除它并启动一个新的 Git 将其所有文件保存在 git目录 只要删除那个并再次初始化即可 如果你找不到它 那是因为它被隐藏了 In Windows 7 you need to go t
  • git - 奇怪的分支合并错误,我不知道如何解决

    当我 git status 时 我收到以下错误消息 On branch master Your branch and origin master have diverged and have 1 and 2 different commit
  • Git 更改未显示在 VS2013 Update 2 中

    我在 VS2013 中使用 Git 我更改的文件没有显示在 VS 的 更改 窗口中 当我更改文件但在将其保存到磁盘之前 它确实会显示 但是 一旦我将文件保存到磁盘 更改就会从 更改 窗口中消失 我尝试卸载并重新安装 VS2013 但没有帮助
  • 使用 git 组织多个项目的最佳方式是什么

    我有 5 10 个独立项目 希望使用 Git 将其置于版本控制之下 组织项目 存储库的最佳方式是什么 每个项目使用一个存储库 对我的所有工作使用一个存储库 并为每个项目使用子目录 或者完全不同的东西 什么对你最有效 为什么 我肯定会说每个项
  • Git:需要递归地'git rm'所有bin和obj文件夹的内容

    有人不小心将所有 bin 和 obj 文件夹提交到我们的存储库 大约有 40 个这样的文件夹 我想做一个git rm r在所有这些文件夹上 有命令可以执行此操作吗 有备份 find type d name bin exec git rm r
  • 如何欺骗 git-svn 来识别使用 svn 进行的合并?

    我们有一个 SVN 设置 具有稳定的主干和不稳定的开发分支 开发工作 大部分 在分支上完成 然后在部署之前合并到主干 我使用 git svn 作为我的 SVN 客户端 我从unstable到trunk的合并过程如下 git svn fetc
  • 将开发分支合并到主分支的最佳实践是什么

    我们在远程git存储库中有两个分支 master分支和develop分支 当我将develop分支合并到master分支时 如何避免合并冲突 如果我解决了主分支中的冲突 那么我需要将主分支合并回开发分支以保持开发更新 我认为这不是一个好的做
  • git:如何在多台电脑之间正确共享本地副本

    我拉了一些公共存储库 在这里和那里做了一些更改 我将它们提交给我的本地副本 我经常从远程获取公共存储库中的更改 有时 我会处理来自不同 PC 的本地副本 并且需要在 PC 之间移动整个源代码 以便它们共享完全相同的更改 有几次我搞砸了复制并
  • 如何将发布档案转换为 git repo

    我有一个发布档案列表 MyProject 0 9 zip MyProject 1 0 zip MyProject 1 3 tar gz MyProject 2 0 tar gz 每个文件都包含一个与存档同名的文件夹 不带文件扩展名 其中包含
  • 意外推送提交:更改 git 提交消息

    在我的本地存储库中 我有一次提交的提交消息不正确 我已经发布了错误的提交消息git push 现在 远程存储库 由 GitHub 托管 也有错误的提交消息 我已经尝试过了git commit amend 但发现在这种情况下它对我不起作用 因
  • 说它已提交,但在 GitHub 中它没有显示

    我刚刚在 Ubuntu 机器上安装了 Rails 我设置了 git 并创建了一个 ssh 密钥来链接到我的帐户 我创建了一个要提交的存储库 并创建了一个示例项目来测试 名为first app 当我提交时 它说一切都已提交 但我去了 gith
  • 如何在 SourceTree 中执行 gitcherry-pick --continue ?

    解决冲突后 如何继续使用 SourceTree 进行挑选 如果我正在执行变基操作并且遇到冲突 那么在单击提交 SourceTree 解决冲突后 我可以继续进行变基操作 但如何继续樱桃采摘操作呢 cherry pick有效地将提交 A 中的更
  • 如何查看 Git 中分支的远程更改?

    我在学习 Git 的时候肯定忽略了一些东西 毕竟我对此还很陌生 我的同事说他推迟了他对我在远程存储库中的提交所做的一些更改 然而 git log 没有这个新推送的记录 我怎样才能看到他推了什么 从而知道要拉哪个分支 你必须git fetch
  • 如何让 git 忽略目录的所有内容?

    我有一个 git 目录 其中包含一大堆文件 然后有一个名为 sessions 的目录 sessions 包含我的 web py 程序的 cookie 信息 我需要将 sessions 文件夹保留在 git 存储库中 因为如果没有该文件夹 程
  • 如何临时更改git ssh用户进行远程推送?

    是否可以临时更改 ssh 用户为 git Push Remote Master 而不会弄乱 git config 或 git Remote 或使用整个远程 URL root host gitrepo git push otheruser r
  • 执行“挤压和合并”后可能出现问题?

    I used Squash and Merge用于合并dev分支到main因为我不想要来自的一些提交消息dev出现在的分支main但现在我发现main比 dev 提前 1 次提交 并且该图显示 两者之间没有联系dev and main 这是

随机推荐

  • Logstash 输出到 AWS EC2 上的 Elasticsearch

    我在配置 Logstash 以输出到 AWS EC2 上的 Elasticsearch 集群时遇到问题 我正在使用 Logstash 版本 1 1 5 和 Elasticsearch 1 19 8 这是我在logstash中的输出配置 ou
  • SQL 开发人员:为其他用户生成数据库文档

    我的数据库中有一个管理员用户 管理员用户可以访问所有数据库对象 我没有管理员用户的凭据 我的应用程序还具有普通用户 该用户对管理员用户的许多对象具有访问权限 选择 删除授权等 因此 在 SQL 开发人员中 当我使用普通用户创建连接时 我可以
  • 我可以在不创建临时数组的情况下移动 NSMutableArray 中的对象吗?

    我以为我已经拥有了 void shiftArray NSMutableArray mutableArray NSUInteger shift for NSUInteger i 0 i lt mutableArray count i NSUI
  • 如何增加 Android 应用程序的堆大小?

    我正在编写一个使用多个 3D 模型的 Android 应用程序 这种带有纹理的模型会占用大量内存 我发现制造商对应用程序可以使用的堆大小设置了限制 例如我的平板电脑三星 Galaxy Tab 8 9 P7310 可以占用 64MB 内存 有
  • 解决非图(绘图方块)

    今天是星期五下午 让我们来解决一个有趣的谜题 算法问题 我最喜欢的任天堂 DS 游戏之一是绘图方块 DS http en wikipedia org wiki Picross Ds 游戏非常简单 它涉及解决称为连线图 http en wik
  • ViewModel 还是 ViewBag?

    我对 MVC4 EF5 和 ASP Net 相当陌生 而且我似乎无法在任何地方找到好的答案 基本上 一切都应该通过视图模型完成还是也可以合并视图包 假设我有一个填充下拉列表的方法 并且我正在使用视图模型来表示视图的输出 我可以使用吗View
  • Github API 的错误凭证

    我有以下脚本 我正在尝试在 bash 中测试它 使用curl 做几件事 一是创建一个新的存储库 第二个 尚未实现 是从 json 中获取 git url返回 我不确定我的是否parse json函数将让我这样做 然后最后将示例提交消息推送到
  • 如何从同一个域名为 Kubernetes 后端和 Firebase 托管前端提供服务?

    我想使用我已有的三个组件来设置网络应用程序 在domains google com 上注册的域名 前端 Web 应用程序托管在 Firebase 托管上并由以下位置提供服务example com 负载均衡器后面的 Kubernetes 集群
  • 仅缩放背景图像

    我只想缩放背景图像 prod img hover webkit transform scale 1 04 moz transform scale 1 04 o transform scale 1 04 ms transform scale
  • 如何在调试模式下启动解决方案中的另一个项目

    我有一个 WCF 主机应用程序 它由带有一些动态参数的可执行文件启动 现在我想调试这个应用程序 但由于它是由其他工具启动的 因此 VS NET 不会在调试模式下加载它 是否可以编写一些仅调试代码来强制它在调试模式下执行此过程 以便它会遇到断
  • ggplot2 facet_wrap 错误:谓词必须是闭包

    将其加载到新的 R 会话中 我不明白出了什么问题 library ggplot2 ggplot mtcars aes mpg wt geom point facet wrap cyl Error Error predicate must b
  • URL 通过 Route 53 使用 AWS S3 静态站点转发而不是屏蔽

    当使用 Route 53 让带有别名的 A 记录指向 S3 静态站点时 域会转发到 S3 url 而不是屏蔽它 当我输入 example com 我希望它在我的存储桶中显示 index html 页面 相反 它会将我转发到 example
  • 使用 PHP Excel 转换 Excel 日期

    我正在从 Excel 中读取日期 其格式为 12 5 2012 日 月 年 使用此代码来读取 使用 PHP EXCEL PHPExcel Style NumberFormat toFormattedString value A YYYY M
  • 将“Object.defineProperty”与 RangeError 一起使用

    我正在尝试使用Object defineProperty更新我的obj对象有一个get and set访问器打开obj name var obj Object defineProperty obj name get function ret
  • 为什么 tkinter 中 widget.winfo_rootx() 和 widget.winfo_rootx() 总是 0?

    这是我的代码 from tkinter import root Tk a Button text str 1 a place x 100 y 100 widget x widget y a winfo rootx a winfo rooty
  • EDMX 模型与我的数据库模型不同步

    我使用的是代码优先方法 但我不确定为什么会遇到这个问题 这是我的 AccountViewModel 的一部分 public class LoginViewModel Required Display Name User name publi
  • JSON 输入意外结束 Angular 2(4) http get 请求

    事情是这样的 我在 ASP NET Core 上有一个 REST api网络 API 服务器 当我尝试获取数据时在邮递员 我像这样向控制器发出 http post 请求http localhost 5000 api account logi
  • 单击第一个图表中的数据点时,dc.js 访问多个图表中的数据点

    使用同一数据集的不同维度 屏幕上会显示三个 dc js 折线图 当用户单击任何折线图上的数据点时 我希望从所有其他图表 包括单击的图表 中找到并返回该对应点的数据值 我还尝试 在鼠标悬停时 将悬停的数据点的圆圈填充颜色更改为红色 以及所有其
  • Mac 中的 Homebrew 安装出现错误

    我想在我的 mac 系统上安装 homebrew 但无法安装 安装过程给我错误 error could not lock config file usr local Homebrew git config Permission denied
  • 即使使用了 --keep-empty,交互式变基后也会删除空提交

    我在使用时遇到一些问题 keep empty的选项git rebase 而我是 不确定我是否误解了此选项的作用 或者存在错误 这是一个最小的例子 Setup 创建一个新的 Git 存储库和一个初始的 不相关的提交 git init echo