- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我有两个分支——A 和 B。B 是从 A 创建的。
两个分支的工作并行进行。在分支 A 上的工作很糟糕(导致无法工作的版本),而在分支 B 上的工作很好。在此期间,分支 B 有时会 merge 到分支 A(但不是相反)。
现在我想让分支 A 与分支 B 相同。我不能使用 git revert,因为我需要还原太多提交 - 我只想还原在分支 A 上完成的提交,但不是 merge 分支 B 的结果.
我找到的解决方案是将分支 B 克隆到另一个文件夹中,从分支 A 的工作文件夹中删除所有文件,从临时分支 B 文件夹中复制文件并添加所有未跟踪的文件。
是否有执行相同操作的 git 命令?我错过了一些 git revert 开关?
最佳答案
有很多方法可以做到这一点,你应该使用哪一种取决于你想要什么结果,特别是你和任何与你合作的人(如果这是一个共享存储库)希望在 future 看到什么。
执行此操作的三种主要方法:
A
,创建一个新的 A2
,然后使用它。git reset
或等效于将 A
重新指向别处。A
开始。每个人都在 A2
上开发一段时间。然后,一旦每个人都在使用 A2
,就完全删除名称 A
。现在 A
消失了,您甚至可以将 A2
重命名为 A
(当然,其他使用它的人都必须进行相同的重命名)。在这一点上,使用方法 1 的情况和使用方法 2 的情况有什么不同? (有一个地方您可能仍然可以看到差异,这取决于您的“长期运行”有多长以及旧的 reflog 何时过期。)-s theirs
,但它是 doesn't exist ,你必须伪造它。o
节点(以及标记为
*
的节点)代表提交,
A
和 0x2518122413 是分支
o <- * <- o <- o <- o <- o <-- A
\
o <- o <- o <-- B
B
和
A
分别指向分支的最顶端提交,或者更准确地说,通过从某个提交开始并返回所有可到达的提交而形成的分支数据结构,每个提交都指向某个父提交。
B
以便您位于分支
git checkout B
上,并进行新提交,则新提交将使用前一个提示
B
作为其(单个分支)父级,并且 git 名称下存储的 5x2133143 更改了
B
指向新的最尖端提交:
o <- * <- o <- o <- o <- o <-- A
\
o <- o <- o <- o <-- B
标记为
B
的提交是两个分支提示的 merge 基础。此提交以及所有较早的提交都在两个分支上。1 merge 基础对于 merge (duh :-) )很重要,但对于
B
和其他发布管理类型的操作也很重要。
*
偶尔会 merge 回
git cherry
:
git checkout A; git merge B
这会生成一个新的 merge 提交,这是一个具有 two2 父项的提交。第一个父级是当前分支的前一个提示,即
B
的前一个提示,第二个父级是命名提交,即分支
A
的最尖端提交。更紧凑地重绘上面的内容(但添加更多
A
使
B
更好地排列),我们开始:
o--*--o--o--o--o <-- A
\
o---o--o---o <-- B
并最终得到:
o--*--o--o--o--o--o <-- A
\ /
o---o--o---* <-- B
我们将
-
移动到新的 merge 基
o
和
*
(实际上是
A
的尖端)。大概我们然后向
B
添加更多提交,并可能再 merge 几次:
...---o--...--o--o <-- A
/ /
...-o--...--*--o--o <-- B
git 默认使用
B
做什么
B
),然后运行
git merge <thing>
并至少给它一个参数,通常是另一个分支名称,如
A
。 merge 命令首先将名称转换为提交 ID。分支名称变成分支上最尖端提交的 ID。
git merge
找到 merge 基。这些是我们一直用
B
标记的提交。 merge 基础的技术定义是提交图中的最低公共(public)祖先(在某些情况下可能不止一个),但为了简单起见,我们将在这里使用“标记为
git merge
的提交”。
*
命令。3 第一个
*
将提交
git diff
与
git diff
进行比较,即当前分支的提交。第二个差异比较提交
*
与参数提交,即另一个分支的提示(你可以命名一个特定的提交,它不需要是分支的提示,但在我们的例子中,我们将
HEAD
merge 到 0x2518131241获取这两个分支提示提交)。
*
的默认
B
策略有
A
选项
git merge
和 0x251812241313141 我们不想要的。这些只是说在发生冲突的情况下,git 应该通过选择“我们的更改”(
recursive
)或“他们的更改”(
-X
)来自动解决该冲突。
ours
命令完全有另一种策略,
theirs
:这个策略说,不要将 merge 基础与两个提交进行比较,只需使用我们的源树。换句话说,如果我们在分支
-X ours
上运行
-X theirs
,git 将进行新的 merge 提交,第二个父项是分支
merge
的尖端,但源树尖端与 .81231413413413413131351313513135131351313513135135135135135135135135135135135143513513513513513512512512512512512512512512512222231231231312313123123123123123143123143123141223141222314122314122313141 分支相匹配。也就是说,新提交的代码将与其父提交的代码完全匹配。
-s ours
。我认为最简单的解释是这个序列:
git checkout A
git merge --no-commit -s ours B
git rm -rf . # make sure you are at the top level!
git checkout B -- .
git commit
第一步是确保我们像往常一样位于分支
A
上。第二个是启动 merge ,但避免提交结果(
git merge -s ours B
)。为了使 git 的 merge 更容易——这不是必需的,它只是让事情更快更安静——我们使用
B
以便 git 可以完全跳过差异步骤,我们避免所有 merge 冲突的投诉。
A
的提示提交的工作树,而是来自
-s theirs
的提示的工作树。然后我们从
A
的尖端检查每个文件,使其准备好提交。
--no-commit
的旧尖端,第二个父级是
-s ours
的尖端,但具有来自提交
A
的树。
...---o--...--o--o <-- A
/ /
...-o--...--*--o--o <-- B
那么新图现在是:
...---o--...--o--o--o <-- A
/ / /
...-o--...--o--o--* <-- B
新的 merge 基点和往常一样是
B
的尖端,从提交图的角度来看,这个 merge 看起来和任何其他 merge 完全一样。不寻常的是
B
尖端的新 merge 的源树与
A
尖端的源树完全匹配。
B
或其他各种技巧来移动分支标签)。然而,一旦我们开始 merge , merge 基地显然不再是起点,一个合理的起点变得更加难以定位。
关于git - 使两个分支相同,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36320517/
我时不时地输入“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
我是一名优秀的程序员,十分优秀!