我有两个Git分支,A和B.在分支B上,我删除了分支A中的一堆文件,我还对两个分支中的现有文件进行了一些更改。我想将B中的更改合并到A中,但我不想删除分支A中的任何文件。是否可以执行此操作?
请注意,在分支B上,我使用$ git rm --cached
实际发生了什么:
我不得不处理这个问题,因为对于一个特定的项目,分支B是我的公共(已发布的分支),而分支A是一个私有分支。当我决定发布分支A时,我签出一个新的分支B,删除一堆私有文件,然后将其推送到公共远程。
最终发生的事情是我最终意外地在分支B而不是分支A上工作,因为我忘记切换回分支A.
答案 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
记录的历史记录很重要,而不是你如何得到它。