当我从一个裸的远程存储库尝试pull
时,git返回Already up-to-date
。
据我了解,如果本地存储库有一些更改,我提交它们从而推进HEAD
,不应该pull
从裸存储库中获取不同的文件(工作树已正确配置)并将其与本地覆盖更改合并?
如果本地存储库已经更改并且提交了这些更改,那么推送当然是有效的 - 另一方面,拉动却没有。如果远程存储库发生更改,并且我pull
,fetch --all
或clone
,则会收到相同的up-to-date
消息或旧文件/以前推送的文件。
我做错了什么?
修改,提供有关我想要做的更多信息。
我确实有一个包含两个文件foo.c
和foo.exe
的本地存储库,以及一个配置了post-receive挂钩的裸远程存储库,用于将所有推送的文件放入工作树中。
发出git push remote master
后,我可以在工作树目录中看到foo.c
和foo.exe
。如果在本地存储库中修改了这两个文件中的任何一个,git add .
和git commit -m "commit"
将跟踪已修改的文件,随后的git push remote master
将更新服务器上的文件。
如果在服务器上添加foo.h
,无论如何,我尝试git fetch remote master
,git说本地分支是最新的并且没有合并(它取代了提取的提交文件当地人,是吗?)是必需的。那怎么回事?我是否需要首先在远程存储库上提交更改?
答案 0 :(得分:0)
根据对问题的编辑更新
...来自裸的远程存储库(工作树已正确配置)......
所以我理解这意味着您将repo初始化为--bare
,然后添加了worktree
(更新配置以允许接收更新已签出分支的推送)以便有效推送部署你的可执行文件。
所以你原来说
如果远程存储库发生了变化,我从中获取,获取--all或克隆,我会获得相同的最新消息或旧文件/以前推送的文件。
后来添加了
如果在服务器上添加了foo.h,无论如何,我尝试git获取远程主服务器,git说本地分支是最新的并且没有合并(用本地分支替换获取的提交文件) ,是吗?)是必需的。那怎么回事?我是否需要首先在远程存储库上提交更改?
所以这里的问题是说“添加到远程存储库”的意思。
每个回购(裸或其他)的工作方式相同。您认为服务器repo是一个远程服务器因为它在您的克隆中配置,但在服务器上,它只是一个本地存储,恰好设置为以某种方式对推送作出反应。
所以你知道如果你把一个文件放在你的本地工作树中,但是你没有添加并提交它,它就不会与其他的repos共享。服务器上也是如此。将foo.h放在服务器上只是意味着工作树中有一个未跟踪的文件。 (并且您要小心在服务器上进行无需更改的更改;它们可能会导致未来推送尝试混乱。)
push
和fetch
操作共享数据库之间的引用和对象(提交及其依赖关系)。这些操作并不关心“发送方”工作树上的内容。除了可能的安全措施以避免破坏文件外,他们也不关心“接收方”工作树上的内容。
简而言之:是的,在服务器上你必须添加并提交文件,在分支上创建一个新的提交,然后再拉动工作站就可以了。
我原来的答案中没有包含在上面的部分继续从这里开始:
如果本地存储库有一些更改,并且我提交它们从而推进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 pull
与git fetch
+ git merge
类似。因此,如果远程提交,则会获取它们。然后,如果当前分支有来自远程分支的更改,但尚未在当前分支上进行更改,则它们将被合并。
值得使用gitg
或gitk
工具来显示提交和分支标签的图表,以便更好地了解内部的内容。