Git Fetch + Merge的确切(用图表)是如何工作的?

时间:2015-06-13 23:17:42

标签: git github

我正在尝试将Git存储库合并到一个大型存储库下的子文件夹中。一切都很好,我基本上都在做:

git remote add -f <name> <url>
git merge <name>/master

但是,在执行上述步骤后,我意外删除了来自遥控器的新文件。我然后git承诺。我想再次“添加”它们,所以我做了另一个git merge / master,但没有出现,控制台输出“已经是最新的”。在我看来,遥控器是名称/主机,它本质上指向我要添加的GitHub目录AKA文件;因为我的本地主分支指向一堆缺少远程文件的文件,所以我可以将它们合并为wah-lah。但显然我肯定在这里误解了一些东西..

我是这一切的新手,所以我认为拥有一个带指针的图表并且描述上述步骤的作用,以及删除文件时出了什么问题是非常有帮助的?

欣赏任何见解!

2 个答案:

答案 0 :(得分:2)

你的错误并不是你删除了新文件(它可能发生在任何人身上),你的错误就是新的提交。当你这样做时,你的本地分支继续你的工作,然后你的远程分支是一个提交。这就是为什么新的git合并不起作用(所有的存储库都已合并)。

也许,你可以撤消上一次提交:

$ git commit ...(removed files)
$ git reset --soft HEAD~1 (undo last commit)

见这个类似的例子:

enter image description here

答案 1 :(得分:1)

在删除文件之前,以下是您本地仓库的状态。请注意,我假设您的遥控器的名称是“origin”。另请注意,箭头指向从子提交到父提交,即时间从左向右流动: Stage 1

然后,您提交了文件的删除。这使master向前移动以指向新提交: Stage 2

然后你做了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执行此操作。如果您这样做,您的仓库将如下所示: Stage 3

在这种情况下,C3和C5将完全相同,您将恢复文件。

顺便说一句,我强烈建议您仔细阅读Git book,因为它会详细解释所有这些内容,以及更详细的内容。