来自远程裸存储库的Git pull

时间:2017-06-21 12:20:19

标签: git version-control git-bare

当我从一个裸的远程存储库尝试pull时,git返回Already up-to-date

据我了解,如果本地存储库有一些更改,我提交它们从而推进HEAD,不应该pull从裸存储库中获取不同的文件(工作树已正确配置)并将其与本地覆盖更改合并?

如果本地存储库已经更改并且提交了这些更改,那么推送当然是有效的 - 另一方面,拉动却没有。如果远程存储库发生更改,并且我pullfetch --allclone,则会收到相同的up-to-date消息或旧文件/以前推送的文件。

我做错了什么?

修改,提供有关我想要做的更多信息。

我确实有一个包含两个文件foo.cfoo.exe的本地存储库,以及一个配置了post-receive挂钩的裸远程存储库,用于将所有推送的文件放入工作树中。

发出git push remote master后,我可以在工作树目录中看到foo.cfoo.exe。如果在本地存储库中修改了这两个文件中的任何一个,git add .git commit -m "commit"将跟踪已修改的文件,随后的git push remote master将更新服务器上的文件。

如果在服务器上添加foo.h,无论如何,我尝试git fetch remote master,git说本地分支是最新的并且没有合并(它取代了提取的提交文件当地人,是吗?)是必需的。那怎么回事?我是否需要首先在远程存储库上提交更改?

2 个答案:

答案 0 :(得分:0)

根据对问题的编辑更新

  

...来自裸的远程存储库(工作树已正确配置)......

所以我理解这意味着您将repo初始化为--bare,然后添加了worktree(更新配置以允许接收更新已签出分支的推送)以便有效推送部署你的可执行文件。

所以你原来说

  

如果远程存储库发生了变化,我从中获取,获取--all或克隆,我会获得相同的最新消息或旧文件/以前推送的文件。

后来添加了

  

如果在服务器上添加了foo.h,无论如何,我尝试git获取远程主服务器,git说本地分支是最新的并且没有合并(用本地分支替换获取的提交文件) ,是吗?)是必需的。那怎么回事?我是否需要首先在远程存储库上提交更改?

所以这里的问题是说“添加到远程存储库”的意思。

每个回购(裸或其他)的工作方式相同。您认为服务器repo是一个远程服务器因为它在您的克隆中配置,但在服务器上,它只是一个本地存储,恰好设置为以某种方式对推送作出反应。

所以你知道如果你把一个文件放在你的本地工作树中,但是你没有添加并提交它,它就不会与其他的repos共享。服务器上也是如此。将foo.h放在服务器上只是意味着工作树中有一个未跟踪的文件。 (并且您要小心在服务器上进行无需更改的更改;它们可能会导致未来推送尝试混乱。)

pushfetch操作共享数据库之间的引用和对象(提交及其依赖关系)。这些操作并不关心“发送方”工作树上的内容。除了可能的安全措施以避免破坏文件外,他们也不关心“接收方”工作树上的内容。

简而言之:是的,在服务器上你必须添加并提交文件,在分支上创建一个新的提交,然后再拉动工作站就可以了。

我原来的答案中没有包含在上面的部分继续从这里开始:

  
    

如果本地存储库有一些更改,并且我提交它们从而推进HEAD,则不应该从裸存储库中提取不同的文件

  
     

更确切地说,pull执行了fetch和'合并',并且您要求fetch不应从merge引入来自远程的fetch文件}。答案是:只有自上次pull / fetch以来他们发生了变化。消息“已经是最新的”意味着远程端没有任何变化,超出了你已经A --- B --- C <--(master) 编辑的变化,所以没有什么新东西可以合并。考虑:

     

遥控器包含一些提交

clone
  

你{@ 1}}回购,或fetch进入现有的克隆,所以你现在拥有相同的东西;然后你做了一些工作并提交它

A --- B --- C <--(origin/master)
             \
              D <--(master)
  

现在你pull,这会导致fetch。但fetch不直接下载文件 - 它下载提交。您已拥有源中的所有提交,因此无需下载;这很好,因为文件的历史(因为它们出现在原点)已经被考虑(从你fetch编辑C开始的时候开始。

答案 1 :(得分:0)

git fetch / push不对文件进行操作。他们在提交时运作。遥控器上有很多提交(如果它裸露或没有,则无关紧要)。如果您在本地更改了某些文件并进行了提交,则本地存储库与远程存储库之间存在差异。

在您的情况下,您已经拥有本地所有远程可用的提交,因此无需获取任何内容。这就是最新消息的原因。

如果在这种情况下运行git status,您将获得一个信息,即您在本地存储库中的某些更改未与远程资源共享:

On branch master
Your branch is ahead of 'origin/master' by 1 commit.
  (use "git push" to publish your local commits)

nothing to commit, working directory clean

当您按照建议发布更改时,两个存储库(本地和远程)将具有相同的提交(假设没有其他人正在修改远程存储库),因此,再次,拉不会获取任何内容,这些更改已在本地可用

但是,如果您在远程存储库上有一些提交,但在本地提交时没有提交,则情况会有所不同。

git fetch将获取这些提交,但它不会修改工作区中的文件。要修改文件,您需要手动移动到新提交。例如,通过运行git merge命令 - 它将新获取的更改合并到本地分支,并将活动提交更改为本地分支的一个提示。值得注意的是,merge仅合并当前分支上尚未提供的更改。所以,如果您过去有一些提交并运行git merge old_commit_id,则不会发生任何事情。

对于当前分支,

git pullgit fetch + git merge类似。因此,如果远程提交,则会获取它们。然后,如果当前分支有来自远程分支的更改,但尚未在当前分支上进行更改,则它们将被合并。

值得使用gitggitk工具来显示提交和分支标签的图表,以便更好地了解内部的内容。