Git fetch/merge on amended commit不工作

hpcdzsge  于 12个月前  发布在  Git
关注(0)|答案(1)|浏览(75)

在我的开发文件夹中有一个Git存储库,另一个存储库用作团队测试的稳定基础。两者都在同一台机器上。
测试文件夹将development文件夹作为其远程源。所以当我想发布一些东西供我的团队测试时,我会做一个

git fetch orgin
git merge origin/master

字符串
我的测试文件夹
这次我在development文件夹中提交了一次,像往常一样,在test文件夹中提取并合并,所有工作正常。
但后来我意识到我在其中一个文件上留下了调试,所以我删除了调试行,暂存并修改了开发文件夹上的前一个提交,但当我试图在测试目录中提取和合并时,它显示了以下消息:

user@machine:/opt/testfolder$ git fetch origin
remote: Counting objects: 47, done.
remote: Compressing objects: 100% (23/23), done.
remote: Total 25 (delta 16), reused 0 (delta 0)
Unpacking objects: 100% (25/25), done.
From /home/user/dev/php/devfolder
 + 4dcc4dd...e48254a master     -> origin/master  (forced update)
user@machine:/opt/testfolder$ git merge origin/master
Merge made by the 'recursive' strategy.


修改过的文件也没有更新。如果我再试一次,我会收到一条“已经更新”的消息。
我该怎么解决这个问题?Stack Overflow上关于这个主题的问题不是来自修正的提交。或者至少我找不到。我也找不到任何关于修改后的提交错误的文档。

qoefvg9y

qoefvg9y1#

所以如果我理解正确的话,你是直接在一个仓库(/home/user/dev/php/devfolder)中进行提交,这个仓库也被用作远程仓库。如果是这样的话,那么“永远不要重写历史”的规则(即--amend)on the commits that have been pushed to the remote”变成了“never rewrite history,period”。这是因为您在/home/user/dev/php/devfolder中所做的每一次提交都可以被认为是立即“推送”的,因为其他repo正在从中提取。实际情况是,您在dev文件夹中提交了带有“debug行”的文件,然后将其拉到了testfolder中。在这一点上,就git而言,提交是历史的一部分。然后当你在devfolder中修改提交时,git删除了旧的提交并替换为新的提交(没有debug行)。然后当你再次拉入testfolder时,git会将其视为一个新提交,它不是旧提交的直接后代,而是旧提交的对等提交。(当你在fetch消息中看到“强制更新”时,你可以知道发生了什么)。因此,git合并了原始提交和修改后的提交,并在原始提交中看到添加的行,因此将其添加到结果中。
虽然您可以在dev和test文件夹中使用一系列git reset来修复这个问题,但如果其他人从test文件夹中提取了这些错误的更改,那么这些错误的更改就会不断返回。最好的办法是做一个未修改的提交来删除它。如果您打算直接在dev文件夹上执行此操作,请确保首先将fromtest拉入dev。
展望未来,我强烈建议您在dev文件夹中创建一个裸存储库,该存储库仅用于远程存储。然后在“本地”存储库中进行所有更改(就像您在测试目录中所做的那样),并在裸存储库中进行推送/拉取。
顺便说一句,我可能会选择一个你和你的团队都用作远程的裸存储库,它上面有稳定和开发代码,每个都在不同的分支中,而不是你现在的设置。然后,当你想让你的团队测试它时,你只需将开发分支合并到稳定分支中。

相关问题