- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
目标:我需要对上游项目的先前发行版进行自定义补丁,并且我希望能够将这些补丁应用于更高版本。
问题:从维护分支重新定位到更高版本会与未在维护分支中修改的文件产生冲突。
怀疑:我要为完成的工作错误地应用 merge 或重新定基。
示例:这是我要完成的事情的逻辑示例,但是请理解,带标记的发行版v1.0和v2.0之间的提交历史记录可以介于两者之间的数百次提交中。
我用一个具有主要提交历史记录A到D的带有多个标记发行版(v1.0和v2.0)的上游 repo fork 。B是标记v1.0的最后一次提交。 C是标签v2.0的最后一次提交。 D正在开发中。
$ git clone git@server:repo
A<--B(v1.0)<--C(v2.0)<--D Master
$ git checkout v1.0 -b v1.1
E<--G<--H v1.1
/
A<--B<--C<--D Master
\
F v2.1
E<--G<--H v1.1
/
A<--B<--C<--D Master
\
F<--G'<--H' v2.1
$ git rebase v2.1 v1.1
Falling back to patching base and 3-way merge
...
Failed to merge in the changes.
$ git checkout v2.1
$ git rebase v1.1
Falling back to patching base and 3-way merge
...
Failed to merge in the changes.
最佳答案
我建议您编辑问题,以包含尝试将--onto用作基础的确切命令。那应该是您完成尝试的方式,但是您可能已经以某种超出实际需要的触发基础的方式运行了该命令。
如果您的rebase命令重写了v1.0
和v.2.0
之间的所有内容,那么如果该历史记录包含通过非快进 merge 解决的冲突,则可能会导致很多不必要的痛苦。
为了清楚起见,我将关于 merge 冲突和重新定级的解释移到了此答案的底部。但是,该部分仅仅是猜测,请参阅您尝试的rebase --onto
的示例,这将对您有所帮助。现在没有可用的功能,我将提供您认为应该做的事情。话虽如此,让我们开始您的解决方案。
解决方案
重新设置--on到
我喜欢阅读--onto的论点,以便更好地理解。向后读,--onto <1> <2> <3>
读为-接受<3>
上的所有提交,而不接受<2>
上的任何提交,并将它们应用于<1>
。提交不会被“移动”,而是被“克隆”,因此您的旧提交仍在原处(重新设置基础),仅创建它们的副本并在<1>
之后应用它们。
重要的是要知道,在执行rebase --onto
之后,您可能最终会陷入 headless 状态。如上所述,将应用新的提交,但是它们不会立即更改分支的状态。这在该过程中增加了一个额外的步骤,但同时也使您更加安全,因为知道 rebase 不能破坏您的分支机构-您将有机会在将变更应用到分支机构之前查看已更改的历史记录。
从此图开始。
E<--G<--H v1.1
/
A<--B<--C<--D Master
\
F v2.1
G
和
H
遵循
F
,而不包括
E
,根据您的描述似乎是这种情况,那么您应该尝试以下命令。
git rebase --onto F G^ v1.1
v1.1
上存在的所有提交,而不是立即继续进行
G
的提交上存在的所有提交,并将它们应用在
F
之后。由于实际被重写的唯一提交是
G
和
H
,因此没有理由要使与这两个提交所更改的内容无关的任何冲突发生。
E<--G<--H v1.1
/
A<--B<--C<--D Master
\
F v2.1
\
G'<--H' (currently checkout out headless state)
F
,但是您已经创建了
A<--B<--C<--F<--G'<--H'
的新历史记录。这就是您想要的,但不在
v2.1
分支中。因此,现在查看您的历史记录并验证其是否想要您的记录。如果需要,甚至可以对其进行测试。验证后,您只需 checkout v2.1并运行以下命令...
git checkout v2.1
git merge H'
H'
中没有的新提交。为确保这一点,您可能需要在 merge 中使用
--ff-only
标志,以便它将拒绝 merge 而不是创建 merge 提交。
git rebase --onto
不会在您的实际分支上造成困惑。如果您发现重新设置没有达到预期的效果-您可以简单地 check out
v2.1
并看到这样做没有任何危害。
E<--G<--H v1.1
/
A<--B<--C<--D Master
\
F<--G'<--H' v2.1
git checkout v2.1
git cherry-pick G^..H
git rebase --onto v2.1 G^ H
git checkout v2.1
git reset --hard <hash> <-- were hash is the commit the rebase kicks you into.
v2.1
。同样如前所述,bove rebase --onto不会直接影响分支,因此在出现问题时更容易从分支中恢复。两者都“克隆”了他们带来的提交,而原始文件则保持不变。
git rebase --onto v1.1 F v1.1
F
中的所有不在
v1.1
上的提交都被添加到
v1.1
的末尾。如上所述,这将导致
B
和
F
之间的每个提交都被一次重新提交。如果其中存在通过非快进 merge 解决的冲突,那么您将在重新提交的基础上重现这些冲突中的每一个,尽管这些提交已提交。
F
中。这不应该导致任何奇怪的冲突,但是会极大地混淆您的历史。
关于git - git merge-git : what is the correct merging or rebasing workflow to modify a maintenance branch and apply those patches to another branch?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15973964/
我时不时地输入“git”,然后想到别的东西,然后输入例如“git checkout master”。当然,这给我留下了 $ git git checkout master git: 'git' is
我做到了 git 克隆 git://foo.git 光盘富 ...编辑文件.. 现在我想重新开始。我不在乎我已经做出的任何改变,但我不想再次克隆整个巨型 foo.git,只是丢失我所有的更改。我怎
我在我的电脑上开发代码,我的计算节点很少。 为了让我的程序保持同步,我决定使用 git。以前,我以一种单向模式使用它来“下推”从 PC 到计算节点的更改。但是时不时遇到计算节点特有的小bug,现场修复
虽然它似乎什么也没做,但它没有给出任何警告或错误消息。有什么想法吗? 最佳答案 来自 Git 源的注释: /* * Read a directory tree. We currently ignor
我知道如何为这样的 HTTPS 请求提供用户名和密码: git clone https://username:password@remote 但我想知道如何像这样向 Remote 提供用户名和密码:
Git GUI、Git Bash 和 Git CMD 之间有什么区别?我是初学者,为了进行安装,我发现自己通常同时使用 git bash 和 git CMD 最佳答案 Git CMD 就像使用 git
有人能告诉我git中文件索引被删除是什么意思吗?这些文件在我的 VS Code 中标记为红色,但我仍然可以修改文件并将更改推送到将反射(reflect)这些更改的远程存储库。我认为这一切都是在我使用命
我通过 git 子树将 GLFV 库添加到项目中,但出现此警告“看起来您的 git 安装或您的 git-subtree 安装已损坏”。还描述了几个原因,为什么这可能是: 如 git --exec-pa
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我有需要外部 git 项目的 repo,但我不想使用子模块,因为我想在 github 上存档所有文件,所以我认为我只是将具有 git repo 的整个目录添加到 git 但它不t 添加里面的 .git
我一直在阅读一篇文章,作者在其中指示:在现有存储库中创建一个新存储库,并想知道这是否是他忽略的错误。稍后我会与他核实。 这些是我要检查的条件: 将现有目录制作成仓库的条件,并且已经 checkin 主
我确实在不同的计算机上处理相同的项目,我想知道是否有一种方法可以跟踪该 .git 文件夹,这样我就不必在所有本地文件中重新配置配置文件。 我将所有工作推送到 bitbucket。 最佳答案 不,没
这个问题在这里已经有了答案: How does git store files? (3 个答案) 关闭 9 年前。 我为我的许多项目创建了一个远程存储库,所以它是我的push 的目的地。与 git
应该如何在 git 中查看文件内容的完整历史记录? 一个文件在 git 中的历史很短,存储库通过 git-svn 同步,但在 svn 中的历史很长。 git 中的历史记录到达文件移动的位置。要查看历史
我是confused here ... 如何对修改后的文件进行git commit,以及如何对新文件进行git commit? 还有,你如何在git中单独提交文件? 最佳答案 git 提交过程分为两个
正在搜索 throw SO 来寻找答案。遇到这个似乎没有给出任何答案的旧线程。重新触发此线程,希望有人知道! 有人能告诉我 git subtree 和 git filter-branch 的区别吗?为
我想知道是否有一种方法可以避免在每个 Git 命令的开头键入单词 git。 如果有一种方法可以在打开命令提示符进入 “Git 模式” 后只使用一次 git 命令就好了。 例如: git> 之后,我们键
当您修改工作目录中的文件时,git 会告诉您使用“git add”暂存。 当您向工作目录添加新文件时,git 会告诉您使用“git add”开始跟踪。 我对这两个概念有点困惑,因为我假设跟踪文件的更改
为什么 git://有效 $ git clone git://github.com/schacon/grit.git Cloning into 'grit'... ... Checking conne
我在以下沙箱中练习 git:https://learngitbranching.js.org/?NODEMO 我在两个单独的 session 中运行了两组命令。第一组命令顺序如下: git clone
我是一名优秀的程序员,十分优秀!