gpt4 book ai didi

Git:在一个命令中将提交链复制到其他提交,不涉及分支

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

我有这些提交:(下面的 TL;DR...)

A <- B <- C

这些是在同事提交的基础上:

U <- V <- W <- A <- B <- C

现在同事将他的分支重新定位到新的 master,推送到更新 PR 的 github 仓库,然后添加一个提交,推送到 github 仓库,然后我解决了 github 上的冲突并提交到分支在 github 上,然后同事压缩了两个提交并添加了另一个,然后我们的团队负责人插话并开始使用 github 编辑器进行编辑。所以它最终是这样的:[1]

X' <- A'' <- U -> C <- W -> B ---> L --> O --> O  
<--- master' / | / <------ master
G ---------> M --/ \- abyssmal' <-- P --/

换句话说,原来的分支变得无关紧要,事物的新状态与原来的状态关系不大。我认为没有任何操作分支的 git 命令可以真正针对使用 .我只想利用我工作的残余(以几次连续提交的形式)并尝试使其适应今天的代码库。

我写这个故事是因为通常人们会尝试为我的潜在问题提供解决方案,这很好,但我更愿意知道这个特定的操作,如果 github 有办法做到这一点。另外,我说没有分支是因为只要很少有人在一个分支上工作,事情就会很快变得困惑并且分支失去任何意义。缺乏纪律或以错误的方式使用 Git。我知道。不解决这个问题,我会对这个问题的解决方案感到满意。

对我来说重要的是:


长话短说:

如何在一个命令中将任何提交链(假设它们被链接)复制到其他提交? IE。我有:

...hicSuntLeones <- myCommitA <- myCommitB <- myCommitC <- whatever...

我想要一个 super 简单的命令:

git copyCommits --since myCommitA --until myCommitC --putThemTo terraInrecognita

我希望它以这样的方式结束:

...terraIncognita <- myCommitA' <- myCommitB' <- myCommitC'

当然要解决中间冲突。


我正在查看 git rebase --onto,但这似乎适用于我需要的不同逻辑 - 它会让我“离婚”另一个分支,但我没有那个分支.如果我理解正确的话。

我在 stack overflow 和 web 上四处寻找,但还是找不到。 git 答案倾向于解释 git 是如何工作的,how git rebase works , 什么是 contrast of the design philosophy of git with the philosophy of a more traditional source control tool like svn ,SCM 的一般工作方式,relationships with parents are important 是如何工作的和其他东西。我不想听起来傲慢,但我只是在寻找执行上述操作的命令。有没有?谢谢:)

[1] 其实并没有那么糟糕,只是正常的日常困惑。但它仍然使这种方法比分支思考更容易。

编辑:未提供答案:Difference between 'rebase master' and 'rebase --onto master' from a branch derived from a branch of master这个引用的副本,也在问题中引用,没有回答我的问题。它对 git 如何工作、分支如何工作有很长的答案,但并没有真正回答我的问题。也许它暗示在那里但没有给出。

最佳答案

我的第一个想法是做一个git rebase。在 man git-rebase 页面中有一个带有三个参数的 rebase 有这个很好的例子(还有许多其他例子):

                               H---I---J topicB
/
E---F---G topicA
/
A---B---C---D master

$ git rebase --onto master topicA topicB

H'--I'--J' topicB
/
| E---F---G topicA
|/
A---B---C---D master

使用以下命令可以在您的存储库中实现类似的效果。

首先我们用我们感兴趣的最后一次提交创建一个分支,然后检查它:

$ git checkout -b newC myCommitC

然后我们将这个分支 rebase 到所需的位置。不要忘记指定第一个提交的父级,因为你必须告诉最后一个提交不包含在 rebase 中;

$ git rebase --onto terraIncognita myCommitA^ newC

完成了!现在你有 newC 指向新分支的尖端:

terraIncognita <- myCommitA' <- myCommitB' <- myCommitC'

关于Git:在一个命令中将提交链复制到其他提交,不涉及分支,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42078661/

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