我正在尝试将Git存储库合并到一个大型存储库下的子文件夹中。一切都很好,我基本上都在做:
git remote add -f <name> <url>
git merge <name>/master
但是,在执行上述步骤后,我意外删除了来自遥控器的新文件。我然后git承诺。我想再次“添加”它们,所以我做了另一个git merge / master,但没有出现,控制台输出“已经是最新的”。在我看来,遥控器是名称/主机,它本质上指向我要添加的GitHub目录AKA文件;因为我的本地主分支指向一堆缺少远程文件的文件,所以我可以将它们合并为wah-lah。但显然我肯定在这里误解了一些东西..
我是这一切的新手,所以我认为拥有一个带指针的图表并且描述上述步骤的作用,以及删除文件时出了什么问题是非常有帮助的?
欣赏任何见解!
答案 0 :(得分:2)
你的错误并不是你删除了新文件(它可能发生在任何人身上),你的错误就是新的提交。当你这样做时,你的本地分支继续你的工作,然后你的远程分支是一个提交。这就是为什么新的git合并不起作用(所有的存储库都已合并)。
也许,你可以撤消上一次提交:
$ git commit ...(removed files)
$ git reset --soft HEAD~1 (undo last commit)
见这个类似的例子:
答案 1 :(得分:1)
在删除文件之前,以下是您本地仓库的状态。请注意,我假设您的遥控器的名称是“origin”。另请注意,箭头指向从子提交到父提交,即时间从左向右流动:
然后,您提交了文件的删除。这使master
向前移动以指向新提交:
然后你做了git merge origin/master
。这基本上意味着“使其origin/master
可以master
”。但正如您从图表中看到的那样,origin/master
已经 <{1}}。master
这就是为什么Git说master
是“最新的”;事实上,它是更多而不是“最新”,它实际上是origin/master
的提前。
所以问题是,如何撤消此提交?嗯,有两种选择。如果您尚未推送,则只需将master
移至指向上一次良好提交,即git reset --hard C3
。 这将删除工作目录中的任何本地更改,因此请小心。在此步骤之后,repo将看起来像第一个图。
但是,如果将推送到中央存储库,则最好进行与C4
完全相反的提交。您可以使用git revert C4
执行此操作。如果您这样做,您的仓库将如下所示:
在这种情况下,C3和C5将完全相同,您将恢复文件。
顺便说一句,我强烈建议您仔细阅读Git book,因为它会详细解释所有这些内容,以及更详细的内容。