- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有以下情况:
master 分支有一个稳定的应用程序版本。
开发人员 A 最近创建了一个名为 branch-a 的功能分支,其中包含多个提交(让它们成为 a-1、a-2 , a-3).此处实现的功能基于 master 的最新代码,目前已经过良好测试。
开发人员 B 有一个名为 branch-b 的功能分支,其中包含多个提交(例如,b-1、b-2、 b-3)。由于某种原因,B 先生在他的功能分支中有一个过时的版本(基于 master 一两周前的状态)并且根本没有测试代码。
两位开发人员 merge 了他们的功能分支以掌握使用:
没有使用 rebase 命令。这个序列首先由 B 完成,接下来由 A 完成。
当我(开发人员 C)从 master pull 时,我在 git log 中看到类似这样的内容:
结果,B 先生在 merge 时以某种方式 强制旧版本的代码覆盖稳定版本(导致 b-merge-conflicts 提交)。
现在我想重写历史并保存 b-1 + b-3 + a-1 + a- 2 + a-3 更改和撤消 b-2、b-merge-conflicts 和 a-merge.
我的想法是撤消几个顶级提交,直到 b-1,然后使用 cherry-pick 补丁来应用 b-3、a-1、a-2、a-3 提交给新的主人。
但是当我尝试时:
git reset --hard HEAD~7我可以看到仅包含旧提交(在 master-stable 之前)的历史,而没有 branch-a 和 branch-b 的历史。
当我尝试时:
git reset --hard HEAD~2
我可以在历史记录中看到顶部只有 master-stable 提交,但不是我想要的 a-2。
看起来 git reset 不会将 HEAD 之后的数字转换为要重置的提交数量(正如我从文档中理解的那样),而是通过 git pull 进行的一些 HEAD 更改(在我的示例中有 2 ).
如何正确撤消前 7 个提交 b-2 .. a-merge 并重写从 b-1 开始的历史记录?
我使用了(没有 --all 来排除额外信息)
git log --oneline --decorate --graph
* ef7d93f Merge with master by Developer A
|\
| * 2b9dd31 b-4
| * 924a452 b-3
| * 1f9489d b-2
| * e3cd7a6 Merge by Developer B [2]: Merge branch 'master' from https://github.com ....
| |\
| * | aece506 Merge by Developer B [1]: merge branch
| * | 487e7ee b-1
* | | d9404f8 a-1
| |/
|/|
* | 9b202ce master-stable last commit
最佳答案
git log
在骗你。它以线性方式呈现 Git 历史,它按日期顺序向您展示提交。那不是很有用。 git log --graph --decorate
将通过向您展示提交树(真正的图形)来为您提供更清晰的故事。据我所知,您的存储库如下所示。
a1 - a2 - a3
/ \
origin c1 - c2 - c3 - c4 - b-merge - b3 -------- a-merge [master]
\ /
b1 -------------b2
如您所见,“返回七次提交”可以有多种解释。这就是为什么您应该避免将多个提交移回的表示法,而是引用提交 ID。
你要的是这个
a1 - a2 - a3 [branch-a]
/
c1 - c2 - c3 - c4 [master]
\
b1 - b3 [branch-b]
要到达那里,请在 c4 之外创建 A 和 B 分支,这样您就有了一个可以构建的地方。
git branch branch-a c4
git branch branch-b c4
[branch-b] a1 - a2 - a3
[branch-a] / \
c1 - c2 - c3 - c4 - b-merge - b3 -------- a-merge [master]
\ /
b1 -------------b2
现在检查这些分支并挑选适当的更改到它们上,修复所有冲突。
b1b - b3b [branch B]
/
| a1a - a2a - a3a [branch A]
| /
| / a1 - a2 - a3
|/ / \
c1 - c2 - c3 - c4 - b-merge - b3 -------- a-merge [master]
\ /
b1 -------------b2
这可能看起来一团糟,但现在 checkout master 和 git reset --hard c4
以及 master 处于 merge 状态而保持活力的所有困惑都将消失(这是一个善意的谎言, origin/master 将在您推送之前保持它可见,而且 Git 实际上不会在数周内丢弃提交)。
b1b - b3b [branch B]
/
| a1a - a2a - a3a [branch A]
|/
c1 - c2 - c3 - c4 [master]
现在可以正常 merge A和B了。当你完成后,你必须 push --force
因为 master 不是 origin/master 的 child 。
这只是实现您想要的目标的一种方式。重要的是能够可视化存储库图、您希望它位于的位置以及将转换它的命令。
关于Git 重置行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28648769/
我正在尝试使用谷歌浏览器的 Trace Event Profiling Tool分析我正在运行的 Node.js 应用程序。选择点样本后,我可以在三种 View 之间进行选择: 自上而下(树) 自上而
对于一个可能是菜鸟的问题,我们深表歉意,但尽管在 SO 上研究了大量教程和其他问题,但仍找不到答案。 我想做的很简单:显示一个包含大量数据库存储字符串的 Android ListView。我所说的“很
我已经开始了一个新元素的工作,并决定给 Foundation 5 一个 bash,看看它是什么样的。在创建带有水平字段的表单时,我在文档中注意到的第一件事是它们使用大量 div 来设置样式。所以我在下
我有一个 Windows 窗体用户控件,其中包含一个使用 BeginInvoke 委托(delegate)调用从单独线程更新的第 3 方图像显示控件。 在繁重的 CPU 负载下,UI 会锁定。当我附加
我有一堆严重依赖dom元素的JS代码。我目前使用的测试解决方案依赖于 Selenium ,但 AFAIK 无法正确评估 js 错误(addScript 错误不会导致您的测试失败,而 getEval 会
我正在制作一款基于滚动 2D map /图 block 的游戏。每个图 block (存储为图 block [21][11] - 每个 map 总共 231 个图 block )最多可以包含 21 个
考虑到以下情况,我是前端初学者: 某个 HTML 页面应该包含一个沉重的图像(例如 - 动画 gif),但我不想强制客户缓慢地等待它完全下载才能享受一个漂亮的页面,而是我更愿意给他看一个轻量级图像(例
我正在设计一个小软件,其中包括: 在互联网上获取资源, 一些用户交互(资源的快速编辑), 一些处理。 我想使用许多资源(它们都列在列表中)来这样做。每个都独立于其他。由于编辑部分很累,我想让用户(可能
我想比较两个理论场景。为了问题的目的,我简化了案例。但基本上它是您典型的生产者消费者场景。 (我关注的是消费者)。 我有一个很大的Queue dataQueue我必须将其传输给多个客户端。 那么让我们
我有一个二元分类问题,标签 0 和 1(少数)存在巨大不平衡。由于测试集带有标签 1 的行太少,因此我将训练测试设置为至少 70-30 或 60-40,因此仍然有重要的观察结果。由于我没有过多地衡量准
我是一名优秀的程序员,十分优秀!