【问题标题】:git use only from specific range of commitgit 仅使用特定范围的提交
【发布时间】:2021-09-29 15:48:13
【问题描述】:

我有一个包含多个提交的分支,例如:

commit40
commit39
commit38
...
commit02
commit01

如何使用具有一系列提交的前一个分支创建一个新分支?假设从提交 38 到 40

【问题讨论】:

  • 38-40 是什么意思?你的分支必须从哪里开始?
  • 从 38 开始。我想忽略以前通过合并另一个分支添加的提交,该分支包含一些我在新分支中不需要的代码。在 38 到 30(示例)之间有一个“合并”,添加了很多我在新分支中不需要的代码
  • @pmiranda git 是Merkle Structure,所以后面的提交依赖于之前的提交;您是想在没有旧历史的情况下开始一个新分支,还是简单地省略一个范围? (恢复它们就足够了,还是应该消除它们?)在这种情况下,我相信我可能会在我对How to revert multiple git commits? 的回答中涵盖您正在寻找的内容
  • 从概念上讲,一个分支是多个提交。从技术上讲,它只是一个指向单个提交的指针。 (人类倾向于将分支视为提交及其所有祖先)。所以....为一个分支使用一系列提交的概念有点没有意义。

标签: git


【解决方案1】:

您可以使用樱桃挑选技术。 https://www.atlassian.com/git/tutorials/cherry-pick

【讨论】:

  • 我现在正在这样做,从最旧的开始,但我说的是 250 次提交,并且在每次挑选樱桃之后我都必须解决一些冲突,我想知道是否有办法选择一个范围
  • 如果你真的开始一个 new 分支,就不会有冲突;您是否试图将存在于一个分支中的提交带入另一个既存在又具有不同提交的提交?
  • 您可以使用 SourceTree 等 GUI 工具,而不是使用 CLI
  • @ti7 - 你开一个新分支是什么意思?新分支只能从其他分支开始,这意味着它将拥有所有提交
  • @Dmitry 你可以从“无”开始一个分支(打破其他分支的历史记录),然后从任何提交状态开始,就好像它是第一次提交一样,尽管这会在以后造成麻烦,但有时会可取的(尽管我会质疑是否只是启动一个新的存储库不是更好)
【解决方案2】:
  1. 从 commit37 签出一个新分支

    git checkout -b

  2. 删除所有内容并提交。

    rf -rm ./*;混帐添加。 ; git commit -m "清理";

  3. 从 38 到 40 的 Cherry-pick 提交

    git cherry-pick commit37..commit40

在cherry pick命令中不包含commit37。

【讨论】:

  • 已更正,谢谢
  • 明白了,再次感谢
【解决方案3】:

根据 OP 的评论,其中包括这句话:

在 38 和 30 之间有一个“合并”(示例),它添加了很多我在新分支中不需要的代码...

我认为最适合您的是拥有一个提交 1-30,然后是 38-40 的分支。您可以在没有任何先前提交 1-38 的情况下执行类似的过程,但是,您越接近您想要的状态越好,因此最好“跳过”尽可能少的提交以避免未来冲突。鉴于此,以下是如何简单地省略提交 31-37:

git fetch
git switch -c new-branch <commit30>
git merge <commit37> --strategy=ours # this "skips" commits 31-37
git merge <commit40> -X theirs

在最后一次合并中添加-X theirs 可以减少发生冲突的机会,但如果文件被添加或删除,并且还被编辑过,您仍然可能会遇到冲突。至少你只会拥有它们一次,而不是在每次提交的基础上(例如使用变基或挑选范围)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-12-09
    • 1970-01-01
    • 2018-08-13
    • 2013-09-01
    • 1970-01-01
    • 2018-10-17
    • 2012-02-19
    相关资源
    最近更新 更多