gpt4 book ai didi

Git 重置行为

转载 作者:太空狗 更新时间:2023-10-29 13:14:34 25 4
gpt4 key购买 nike

我有以下情况:

ma​​ster 分支有一个稳定的应用程序版本。

开发人员 A 最近创建了一个名为 branch-a 的功能分支,其中包含多个提交(让它们成为 a-1a-2 , a-3).此处实现的功能基于 ma​​ster 的最新代码,目前已经过良好测试。

开发人员 B 有一个名为 branch-b 的功能分支,其中包含多个提交(例如,b-1b-2b-3)。由于某种原因,B 先生在他的功能分支中有一个过时的版本(基于 master 一两周前的状态)并且根本没有测试代码。

两位开发人员 merge 了他们的功能分支以掌握使用:

  1. git checkout 大师
  2. git pull origin master
  3. git merge branch-X(其中 X = a,b)
  4. git push origin master

没有使用 rebase 命令。这个序列首先由 B 完成,接下来由 A 完成。

当我(开发人员 C)从 master pull 时,我在 git log 中看到类似这样的内容:

  • a-merge:由开发者A与master merge
  • a-3
  • a-2
  • a-1
  • b-3(是的,这个提交紧接在 merge 之后)
  • b-merge-conflicts:由开发者 B 与 master merge (数千个文件冲突)
  • b-2
  • b-1
  • master-stable:以前的稳定提交

结果,B 先生在 merge 时以某种方式 强制旧版本的代码覆盖稳定版本(导致 b-merge-conflicts 提交)。

现在我想重写历史并保存 b-1 + b-3 + a-1 + a- 2 + a-3 更改和撤消 b-2b-merge-conflictsa-merge.

我的想法是撤消几个顶级提交,直到 b-1,然后使用 cherry-pick 补丁来应用 b-3a-1a-2a-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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com