【问题标题】:Update master branch using another branch which doesn't have all the files master contains?使用另一个没有 master 包含的所有文件的分支更新 master 分支?
【发布时间】:2018-07-16 09:57:13
【问题描述】:

我是git 的新手,这是我的情况:

我有两个分支:

  1. master - 包含 README.mdtests/all/*.pypackage/*.py
  2. unit-testing - 包含 tests/units/*.pypackage/*.py

unit-testing 分支包含README.mdtests/all/*.pymaster 确实包含。而且unit-testingpackage/*.py的内容比较新。

我希望unit-testingpackage/*.py 的新内容覆盖masterpackage/*.py 的旧内容。这可以由我来完成。但我也希望master 中的文件,例如 README.md,它们不在unit-testing 中,保持它们在master 中的状态。

但是当我尝试将merge unit-testing 转换为master 时,我看到不在unit-testing 中的文件会从master 中删除。我无法将master 合并到unit-testing,因为unit-testing 包含更新的内容。

更具体地说,我运行以下命令:

$ git checkout master $ git merge unit-testing

Git 从master 中删除README.mdtests/all/*.py

【问题讨论】:

  • 除非您在 unit-testing 中添加了对 tests/all/*.py 的删除,否则不会发生这种情况。
  • 我没有从master 中分叉出unit-testing。我创建了一个新分支unit-testing 并复制了所需的文件。我是初学者,不知道分叉。
  • 分叉?谁提到了分叉?我说的是unit-testing 分支。为什么要在新分支中复制文件?文件不是已经存在了吗?
  • 我后来在master 中创建了一些文件(在创建unit-testing 分支之后)。对不起,我要提到叉子;我没有正确理解你。
  • 你把我弄糊涂了......你能用你的提交的简化 git树更新你的问题吗?我想知道你做了什么。

标签: git version-control git-branch git-merge


【解决方案1】:

似乎unit-testing,或者更具体地说,它指向的提交,曾经在其历史记录中有README.mdtests/all/*.py,但随后它们被删除了。当您合并unit-testing 时,这些删除也会被引入master,因此README.mdtests/all/*.py 会从master 中删除。

如果您想将已删除的文件保留在 master 中,如果您打算将 unit-testing 合并到 master 但保留一些文件不变,这里有两种解决方案。

第一个:

git checkout master
git merge unit-testing --squash
git checkout HEAD -- README.md tests/all/*.py
git commit

这样,unit-testing 除了README.mdtests/all/*.py 的变化都被引入到master。但是当你查看他们的历史图表时,unit-testingmaster 仍然存在分歧,好像它们没有被合并一样。

第二个:

git checkout master
git merge unit-testing
git checkout ORIG_HEAD -- README.md tests/all/*.py
git commit

这样unit-testing的所有变化都引入了master,所以首先将README.mdtests/all/*.py去掉。但是后来他们被git checkout ORIG_HEAD -- README.md tests/all/*.py带回来了。

这两种方法对文件几乎做同样的事情,但创建不同的历史。您可以通过git log --oneline --graph --decorate unit-testing master 看到这两种情况的差异。

如果您想在尝试后返回它们所在的位置,请运行 git reflog mastergit reflog unit-testing 以找出它们在哪个提交上。假设masterabc111,您可以通过以下方式恢复:

git checkout master
git reset abc111 --hard

【讨论】:

    【解决方案2】:

    您已接受的答案可能已引导您找到解决方案,而另一个答案如实描述了您的情况,可能导致解决方案;但他们都在治疗症状。

    分支不适用于将测试代码与生产代码(或更一般地说是项目的一部分与另一部分)分开。如果你创建了一个分支,并在其中删除了相当大的项目块,你应该重新考虑你的工作流程。

    您想通过将测试代码放在自己的分支上来解决什么问题?对于您要解决的任何问题,您是否查看过更典型的解决方案?

    您打算如何使测试代码与主项目代码保持同步,因为它们都发生了变化?您如何知道测试分支上的 哪个 提交应该测试主分支上的哪个提交? “第 5 次提交测试第 5 次提交”?将限制您对 git 的使用,直到它最终失败。 “基于标签或提交 ID 或类似的文档”?不是一门实用的学科要跟上。

    如果你解决了使用分支的根本问题,而这种方式违背了它们的本质,你就不会遇到上述问题。

    【讨论】:

      【解决方案3】:

      我认为您从“ma​​ster”分支创建了“unit-testing”分支。如果是,您可以将主分支合并到单元测试分支中。有时这会给你带来冲突。解决冲突并再次将“单元测试”合并到“主”分支中。在执行此操作之前最好先备份项目。

      git checkout unit-testing
      git merge master
      

      现在如果你有冲突解决它们,

      git commit
      git checkout master
      git merge unit-testing
      

      【讨论】:

      • 成功了!感谢您的帮助。
      猜你喜欢
      • 2022-06-13
      • 2018-03-08
      • 2021-04-29
      • 2021-08-01
      • 2016-01-12
      • 1970-01-01
      • 1970-01-01
      • 2021-04-16
      • 2020-09-06
      相关资源
      最近更新 更多