- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我经常发现自己想要从我的本地存储库中压缩两个或多个提交。我这样做的策略是从软重置开始,然后提交所有重置的更改。
对于软重置,我使用以下命令:
git reset --soft HEAD~n
其中 n 是我要重置的提交数。如果我没有将 merge 提交包括在我想要重置的提交数量中,这就可以正常工作——例如,如果我在我当前的分支上提交了四次并且想要软重置 HEAD~4。
但是,假设在我的 4 次提交之后,我将另一个分支 merge 到我当前的分支上。 Git 隐式提交 merge 更改,并在我执行 git 日志时显示。现在,如果我想软重置回 HEAD~5(4 次提交 + merge 提交),除了我打算重置的 4 次提交之外,git 将忽略 merge 提交并重置下一个最新的非 merge 提交.本质上,我应该重置回 HEAD~4 - git 在重置时似乎忽略了 merge 提交。
为什么 Git 会这样?我如何将这些 merge 提交包含在软重置中?
(举个例子:我按时间顺序提交了 A-B-C-D-E-F,F 是 merge 提交。git reset --soft HEAD~4 会将分支重置为 A:提交 BCDE 已重置,提交 F 不包含在 4.)
最佳答案
嗯,这不是因为 git 忽略了 merge 提交。这是因为 ~
和 ^
在 Git 中是如何工作的。
~n
表示通过第一个父级在层次结构中上升 n 级
。如果将其指定为 ^n
,则表示转到 n th
父级,从左边开始。
如果我们在您的 git 存储库(您给出的示例)中运行 git log --graph --pretty=oneline
,我们可能会得到如下内容:
* da497fa213169e75b9cec382e28561d5e56f6daf (HEAD -> master) f (merge)
|\
| * aaa519bce409d0fb5e187dff6ed82d73d7cd437b (Dev) e
|/
* f537237e48fc7218af288ddc91a02c1e24ea1887 d
* 2c41ee71ee7b9b450cd10eab685e0007fe92b688 c
* 411c96c85a2e34bf798cab5c0e6f4532a5ebfe35 b
* c9d38077a5704df382b0fd0d83d4fcdf7c408f23 a
请注意提交 f
有两个父项(由于 merge 提交)。现在当你说 HEAD~4 时,它会在 HEAD 之后的层次结构中从左开始寻找 4 个提交,即 b
。 (它不会占用 e
,因为它在 f
的 second parent
中。)
您可以使用 git rev-parse
命令来解析并获取特定的提交 ID。
例如:如果您运行 git rev-parse HEAD~4
,您将看到它返回 a
的提交 ID。
在我看来,您不必担心这一点,因为最终,git 会将您的分支重置为给定的提交 ID。但是如果你想重置你的分支以提交 e
,现在你需要告诉它访问它的正确方法。
所以你可以告诉它,选择 HEAD 的第二个父级,然后重置为那个。
那等于:HEAD^2
你也可以将它扩展到 a
到 e
,如果你给出你的重置命令:
git reset --soft HEAD^2~3
。
但我认为,您的情况不需要这样做。
这是对上述内容的一个很好的表示,取自 git rev-parse
文档。
G H I J
\ / \ /
D E F
\ | / \
\ | / |
\|/ |
B C
\ /
\ /
A
A = = A^0
B = A^ = A^1 = A~1
C = A^2 = A^2
D = A^^ = A^1^1 = A~2
E = B^2 = A^^2
F = B^3 = A^^3
G = A^^^ = A^1^1^1 = A~3
H = D^2 = B^^2 = A^^^2 = A~2^2
I = F^ = B^3^ = A^^3^
J = F^2 = B^3^2 = A^^3^2
https://git-scm.com/docs/git-rev-parse/1.8.0#_specifying_revisions
希望对您有所帮助:)
关于git - 在进行软重置时如何告诉 git 包含我的 merge 提交?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51591873/
为了遵循务实的编程原则,我试图根据“告诉,不要询问”原则来决定如何处理用户密码更改。 我有一个用户对象,其密码每 30 天过期一次。如果密码过期,我需要能够显示密码过期/更改密码 View 。询问对象
我试图在接收文件时绕过任何本地存储。根据documentation ,如果“合理”,Flask 会将文件保存在内存中,否则会将它们存储在临时位置。 我只找到了一种通常使用 MAX_CONTENT_LE
SAS 在 proc 中返回 sci-notation 意味着总和输出,我不能将其用于进一步的速率计算过程。如何抑制 SAS 产生 sci-notation,有什么想法吗?提前致谢。 “解决了一个类似
当使用 nohup 时,脚本的输出会被缓冲,只有在脚本执行完毕后才会转储到日志文件 (nohup.out) 中。以接近实时的方式查看脚本输出以了解其进展情况将非常有用。有没有办法让 nohup 在脚本
假设我们定义了以下路由: const routes: Routes = [ { path: '', component: WelcomeComponent }, {
我正在尝试以下操作: a a > 1 1 > 2 2 > 3 3 我想要的是: a b > 1 1 > 2 2 > 3 3 有没有办法告诉 R 使用存储在对象( "b" )中的字符串( a
我想在安装二进制文件之前使用 automake 处理/修改它们。例如,我想将二进制文件中的符号提取到单独的文件和位置(如 this )。另一个示例是收集关键 Assets 的 md5sum 以发布报告
我的应用程序有一个主要的 pro 文件,我想告诉 qmake 在与应用程序同时编译一个单独的库。该库的目录中还有一个 pro 文件。这可能吗? 最佳答案 将 lib 和应用程序放在单独的子目录中,并使
我的 vimrc 中有以下内容: nnoremap :!screen -S foo -p run -X stuff '!!^M' 但是,当单击 F1 时,出现错误:没有上一个命令。 我想要的
我正在使用 Swagger 和 Scala 来记录我的 REST API。我想为 POST、PUT 和 DELETE 启用批量操作,并希望相同的路由接受单个对象或对象集合作为正文内容。 有没有办法告诉
我有一个 SAS 代码,它为我的计算创建了很多中间表。事情是,我在工作完成后并不真正关心这张 table ,我只关心决赛的结果。 但是,每次我运行这段代码时,SAS 都会添加所有生成的表来做我的流程,
有没有办法告诉 UglifyJS 跳过特定的代码部分,也许使用这样的注释: // uglifyjs:skipStart filter = function(item){ /* some crazy f
在 macOS 上通过 homebrew 安装包时,如果我的网络不稳定并且一次下载失败,homebrew 将下载源并从源开始构建。这将需要很长时间和高 CPU 使用率,这是不需要的。如何在下载失败时告
有没有办法告诉 GORM 不要保留属性?我计划在我的 User 类上定义一个确认密码属性,用于验证,但不应保留。 最佳答案 使用 transient 关键字 GORM 可以指示不持久化特定属性。 以下
我正在为 jQuery 编写一个幻灯片放映应用程序(单击按钮,然后滑动浏览图像列表),但我遇到了一个小错误,它将响应 即使在动画发生时也会发出 click() 请求。我已经在使用 animate()
我可以告诉 Xcode 4 我不在项目中使用自动布局吗? 目前,每个新创建的 xib 都会启用自动布局,这意味着我必须在创建 xib 后手动将其关闭,而我不希望这样。 最佳答案 这是自动布局的问题。您
因此,我正在使用目前手动运行的 AzCopy,但我要通过我们的一台服务器上的任务计划程序来运行它。如果我手动执行批处理文件,这会将文件从一个容器复制到另一个容器,并且可以完美运行。然而,它问我: Ov
我正在 OSX 中编写一个基于文档的应用程序。我发现当我更改文档的内容时,应用程序不知道文档已更改。我可以在没有警告的情况下关闭文档,这会导致我未保存的内容丢失。 如何告诉 NSDocument 文档
根据NSWindow Class Reference ,您应该“很少需要调用”NSWindow 方法“display”或“setViewsNeedDisplay”。那么重新显示窗口内容的常用方法是什么
为了重写开源 iMedia 框架项目(目前有数十名开发人员正在使用),我们正在切换到 IKImageBrowserView,并且在缓存方面遇到了麻烦。 看来 IKImageBrowserView 喜欢
我是一名优秀的程序员,十分优秀!