将分支A合并到B但不合并已删除的文件

时间:2016-06-03 19:22:43

标签: git version-control merge

我有两个Git分支,A和B.在分支B上,我删除了分支A中的一堆文件,我还对两个分支中的现有文件进行了一些更改。我想将B中的更改合并到A中,但我不想删除分支A中的任何文件。是否可以执行此操作?

请注意,在分支B上,我使用$ git rm --cached

“删除”了文件
  

实际发生了什么:

我不得不处理这个问题,因为对于一个特定的项目,分支B是我的公共(已发布的分支),而分支A是一个私有分支。当我决定发布分支A时,我签出一个新的分支B,删除一堆私有文件,然后将其推送到公共远程。

最终发生的事情是我最终意外地在分支B而不是分支A上工作,因为我忘记切换回分支A.

2 个答案:

答案 0 :(得分:2)

您不能将分支B合并到A中,也不能删除A中已删除的文件。

您可以在分支A上查看B中的单个文件或整个目录:

git checkout A
git checkout B -- path/to/files/
git commit -m "merged files from B"

这在真正的版本控制中是不可取的,因为你不会从B分支获得提交历史记录;这就像在那里破坏文件并以其方式覆盖所有内容。您将有一个粗略的提交,反映添加的文件中的所有更改。

如果您需要更多工作,可以保留提交的cherry-pick逐个或the range of commits,并忽略涉及删除文件的提交:

git checkout A
git cherry-pick SHA-a-FromB
git cherry-pick SHA-c-FromB..SHA-z-FromB

进一步的建议 - 取决于你在B中的“私人文件” - 是简单地从git中忽略它们。我这样说是假设您正在处理类似于数据库凭证文件的内容,您希望覆盖与开发数据库的生产连接,反之亦然。

在这种情况下,我通常有一个文件,如credentials.inc.php,其中包含一个基本shell,用于执行设置连接,定义常量等操作。然后在该文件中,有一行如下所示: :

if (file_exists(credentials.local.inc.php))
   require_once(credentials.local.inc.php);

credentials.local.inc.php内部,我使用特定的本地环境条件覆盖所有变量。

credentials.local.inc.php添加到.gitignore并跟踪存储库中的.gitignore

echo "credentials.local.inc.php" >> .gitignore
git add .gitignore
git commit -m "Add credentials.local.inc.php to .gitignore"

现在,您可以自由地合并和发布任何方向,确保环境细节保留在各自的预定位置。如果您具有默认的dev凭据,它将始终使用这些凭据,除非在具有敏感凭据的生产服务器上覆盖。如果您想要启动测试,那么只需使用QA凭证附加到本地文件。

答案 1 :(得分:0)

只需进行合并#include <stdio.h> void getUserWord(char* str); int main(void) { char baseWord[21] = ""; /* initialize for avoiding undefined behavior in case no data is read */ getUserWord(baseWord); printf("%s", baseWord); return 0; } void getUserWord(char* str) { scanf("%s", str); } ,无论git的automerge无法按照您的意愿行事,修复它。

--no-commit

记录的历史记录很重要,而不是你如何得到它。