- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
当我阅读 git rebase doc 时,我的问题出现了, 那
If the upstream branch already contains a change you have made (e.g., because you mailed a patch which was applied upstream), then that commit will be skipped. For example, running git rebase master on the following history (in which A' and A introduce the same set of changes, but have different committer information):
A---B---C topic
/
D---E---A'---F master will result in:
B'---C' topic
/
D---E---A'---F master
一种方法是使用 git patch-id 查看补丁 ID ,但这不是我想要的。
让我有 2 个分支。主题和大师,我只更改其中的一个文件。
Inserted 2 -> T2 M2 <-- Inserted 2 in new line
| |
Inserted 1 -> T1 M3 <-- Inserted 3 in new line
\ /
\ /
* <-- Contents similar here
现在在 T2 和 M2 中,尽管我们在文件的两个版本的相同新行中添加了 2
,但 patch 不被认为是相同的(发现这是 git patch-id)。这个发现让我很惊讶。我认为如果在一个文件的两个不同版本中应用同一行上的相同内容,补丁将是相同的。
这让我想到补丁,因此也依赖于我应用补丁的前一次提交。那么,当我们说 (patch1 on some branch) = (patch2 on some other branch) 时,他们的祖先也需要相同吗?如果是,我们可以递归地应用它,结果 2 个分支将是相同的,这是不合逻辑的。
所以,我的问题是,我们什么时候说 2 个补丁相等(不考虑补丁 ID)?
使用此脚本在本地重现上述内容:
#!/bin/bash
git init .
echo "10" >> 1.txt && git add . && git commit -m "1"
# Add 2 commits to master
echo "3" >> 1.txt && git commit -am "m3"
echo "2" >> 1.txt && git commit -am "m2"
#checkout topic branch
git checkout -b topic HEAD~2
echo "1" >> 1.txt && git commit -am "t1"
echo "2" >> 1.txt && git commit -am "t2"
#Show graph
git log --oneline --all --decorate --graph
最佳答案
So, when we say (patch1 on some branch) = (patch2 on some other branch) , then their ancestors also need to be same?
不适用于 git rebase
,不。 Rebase 使用与 git patch-id
相同的计算,这名义上是对精简的(行号和空格被删除)差异文本进行散列处理的结果。1
git rev-list
命令也可以做到这一点。查看它的--left-right
, --right-only
, --cherry-mark
, and --cherry-pick
选项,必须与对称差异三点符号提交选择器一起使用。
事实上,git rebase
使用 git rev-list
来完成这项工作。在过去,当 git rebase
主要是 shell 脚本时,很容易看出这是如何完成的。现在它全部构建为 C 代码,因此它没有运行 git rev-list
,而是编译了相同的 git rev-list
。
... thought patch will be same if same contents on same line ...
不,行号被删除了。这是有目的的:例如,一个补丁可能就像将传递 false
的调用替换为传递 true
的调用一样简单,这对 Git 来说是:
- foo(false)
+ foo(true)
(在 git diff
的情况下,有一些周围的上下文——不清楚 patch-ID 是否包含上下文,但我认为它包含)。假设此修复被上游接受,而您正在处理可能与修复相关或不相关的功能......但是上游,调用foo
位于第 42 行,现在位于第 47 行,因为在此点之上添加了五行不相关的代码?
Rebase 应该并且确实会忽略此补丁,因为它存在于您要重新设置基准的上游,这是通过执行 --left-right
传递上游的对称差异来确定的rebase 和 HEAD
的参数。所有左侧的提交都计算了它们的补丁 ID。所有右侧提交都已计算它们的 补丁 ID。如果补丁 ID 匹配,则提交被视为重复,并从要复制的提交集中删除。
1在 Git 2.39 中,补丁 ID 计算代码发生了变化,部分是为了修复一些错误,部分是为了允许保留与缩进相关的空白。请特别查看新的 --verbatim
选项,以及 the detail in this answer from VonC .
关于git - 什么时候 2 个补丁在 git 中被认为是相等的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58695585/
我正在尝试在站点列表中添加站点名称,以便在 publish:end:remote 上清除 HTML 缓存事件。 mysite 但是,它没有按预期工
我正在尝试使用不同目录中的多个文件制作补丁。我不想包含所有未提交的文件,因为我有很多不适用于补丁。 我知道这个命令可以使用特定文件创建补丁,唯一的问题是这是一个文件: svn diff -up ori
我经常使用 gnu-utils 补丁和差异。使用 git,我经常这样做: git diff 通常简单的更改会创建一个大补丁,因为唯一的更改是,例如,添加一个 if/else 循环,并且里面的所有内容都
我使用命令(从 ~ 执行)生成了一个 diff.txt 文件: diff -r /full/path/to/directory/A /full/path/to/directory/B > diff.t
我正在编写一个项目,我需要通过网络传输一组相似的图像。为了加快速度,我考虑过做大多数电影编解码器所做的事情。有关键帧,然后发送更改。 现在,我得到的是一组 BufferedImage,因此类似于文本文
我正在尝试将更改拆分为多个提交,但在手动编辑大块时我遇到了问题。 原始大块头: @@ -116,8 +116,8 @@ context context -
我想自动测试一组仍然干净利落地适用于(更新的)代码库的补丁。为此,我打算运行 patch -p 1 a echo b > b diff -Nu a b > p rm a b patch -p 1 <
我已经从一个模块中导入了一个类,但是当我尝试在没有模块作为前缀的情况下修补类名时,我得到一个类型错误: TypeError: Need a valid target to patch. You sup
最近我从 SVN 迁移到 git,我的团队已经开始在新的 git 存储库中工作。 后来我发现了一些转换问题,并从 SVN 制作了第二个 git repo,并进行了一些修复和历史重写。 现在我有了 SV
我正在尝试为我的应用程序创建一个补丁。实现描述的示例 here按预期工作。但是,每个版本的文件都存储在单独的目录中。 1.0 版文件在 c:sample\1.0 中,1.1 版文件在 c:sample
首先请原谅我的长文,但我会尽量详细。 我正在为一个开源项目 (DSpace) 进行开发。我没有对他们的 SVN 存储库的提交权限,所以我查看了源代码并一直使用 git 来管理我的版本控制。 在我的开发
有没有办法自动 merge (interdiff)2 个头分支和 1 个基分支之间的冲突? 我试图在补丁级别做这件事 版本A是我的基础 VersionB 是 VersionA 的分支 VersionB
我正在尝试申请 this修补到 MinGW 上的 GCC 以获取它 to compile GDC 2 ,但我不知道如何。 (我对 GCC 的内部结构还很陌生,甚至对一般的 *nix 工具也很陌生。)我
我对软件开发很陌生,所以这无疑是一个非常基本的问题。我得到了一个开源项目的 mercurial repo。我复制了它并做了一些工作。 promise 。工作更多,然后进行了第二次提交。所以我的树看起来
我想对这个错误 ( http://code.djangoproject.com/ticket/13095 ) 应用补丁,但我以前从未做过,也不知道从哪里开始。谁能给我指点教程? 最佳答案 在 Linu
我前段时间使用 p4 diff 生成了一个补丁。命令。 然而,现在我想应用它,我意识到没有办法在 Perforce 中应用补丁。 由于我没有使用 -du选项,补丁是那种晦涩难懂的 perforce 格
我可以使用 NSIS 的 Vpatch 生成从一个版本到另一个版本的补丁文件。假设我有 mydll.dll 版本 1,我有一个补丁可以将它更新到版本 2。然后我又有了一个新版本,因此我生成了另一个补丁
我有一个补丁,用 hg export 42 制作在另一个存储库中,修改文件 asd/fgh/foo/bar.c asd/fgh/foo/fish.h boo/hoo.txt 我需要将此补丁导入具有如下
我们有一个相当大的库,我们需要定期将其导入(然后修补)到我们的代码库中。 SVN Book 似乎推荐了一个“vendor branch”方案,我们保留了“vendor drops”的补丁版本。这会起作
我正在家里用 tensorflow 玩卷积神经网络(顺便说一句,我已经完成了 udacity 深度学习类(class),所以我有理论基础)。 运行卷积时,patch 的大小会产生什么影响?当图像变大/
我是一名优秀的程序员,十分优秀!