使用不包含 master 包含的所有文件的另一个分支更新 master 分支?

Update master branch using another branch which doesn't have all the files master contains?

我是 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

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

git checkout unit-testing
git merge master

现在,如果您遇到冲突,请解决它们,

git commit
git checkout master
git merge unit-testing

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

如果您想将删除的文件保留在 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

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

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

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

您打算如何使测试代码与主要项目代码保持同步,因为每个代码都会发生变化?你怎么知道测试分支上的 哪个 提交应该测试主分支上的哪个提交? "The 5th commit tests the 5th commit"?将限制您对 git 的使用,直到它最终失败。 "Documentation based on tags or commit ID's or some such"?不是一门实用的纪律。

如果您解决了以违背其原则的方式使用分支的潜在问题,您将不会遇到上述问题。