基本问题
我只是删除了项目中某个文件的所有代码,并将更改提交到本地git(故意的)。
git pull upstream master
从上游获取并合并(因此理论上删除的代码应该会回来)。
Git告诉我一切都是最新的。
一切肯定不是最新的--所有被删除的代码仍然被删除。
其他相关信息
我只有一个分支叫"大师"。
我最近设置了"大师"这样追踪上游:
分支主机设置为从上游跟踪远程分支主机。
命令git branch -vv
产生:
* master 7cfcb29 [upstream/master: ahead 9] deletion test
为什么为什么会发生这种情况?我正准备给我的项目经理发电子邮件,告诉他我对代码所做的任何修改。
更新
我以为这很明显,但无论如何这是我的目标:
- 获取系统上最新的代码。**
请原谅我的愤怒,但为什么这么简单的任务要这么难呢?
8条答案
按热度按时间2admgd591#
我认为你的基本问题是你误解了git的功能以及为什么要这么做。
当你克隆其他仓库时,git会复制“那边”的仓库,也会复制“他们的”分支标签,比如
master
,并复制在你的git树中“全名”为(通常情况下)remotes/origin/master
(但在您的情况下,remotes/upstream/master
)。大多数情况下,您也可以省略remotes/
部分,因此可以将原始副本称为upstream/master
。如果你现在对一些文件做了一些修改,你是唯一一个做了这些修改的人。同时其他人可能会使用原始存储库(你做克隆的来源)来做其他的克隆并修改这些克隆。当然,他们是唯一一个做了修改的人。但是最终,有人可能会把修改发回给原始所有者(通过“推送”或补丁或其他方式)。
git pull
命令主要是git fetch
后面跟git merge
的简写,这一点很重要,因为它意味着您需要了解这两个操作的实际作用。git fetch
命令要求回到你克隆的地方(或者设置为提取的地方),找到“其他人添加、更改或删除的新东西”。这些更改会被复制并应用到你之前从他们那里得到的东西的副本上。它们不会应用到你自己的作品上,只会应用到他们的作品上。git merge
命令更复杂,也是你出错的地方。它所做的,有点过于简单,是比较“你在你的副本中更改了什么”和“你从别人那里获取的更改,因此被添加到别人的工作副本中”。如果你的更改和他们的更改看起来没有冲突,merge
操作将它们混合在一起,并为您提供一个“合并提交”,将您的开发和它们的开发联系在一起(尽管有一个非常常见的“容易”的情况,即您没有任何更改,并获得一个“快进”)。您现在遇到的情况是,您已经进行了更改并提交了它们--实际上,提交了9次,因此出现了“提前9”--而它们没有进行任何更改。因此,
fetch
尽职尽责地什么也不获取,然后merge
获取它们缺少的更改,也什么也不做。您需要的是查看,或者甚至“重置”到“他们”的代码版本。
如果您只是想查看它,您可以简单地 checkout 该版本:
这就告诉git你想把当前目录移动到全名为
remotes/upstream/master
的分支,你会看到他们的代码是上次运行git fetch
时的最新代码。如果你想放弃你自己的修改,你需要做的是改变git对你的标签
master
应该命名哪个修订版本的想法,现在它命名你最近的提交。如果你回到那个分支:那么
git reset
命令将允许您“移动标签”,就像它原来那样。唯一剩下的问题(假设您真的准备放弃您所做的一切)是找到标签应该指向的位置。git log
将允许您查找数字名称(如7cfcb29
),这些名称是永久的(永远不会更改)名称,并且还有许多其他命名方式,但在本例中,您只需要名称upstream/master
。要移动标签,清除您自己的更改(您提交的任何更改实际上都可以恢复相当长的一段时间,但在此之后要困难得多,所以请 * 非常 * 确定):
--hard
告诉git清除你正在做的事情,移动当前分支标签,然后 checkout 给定的提交。git reset --hard
并删除一堆工作并不是什么特别常见的事情。一个更安全的方法(如果你觉得有些工作是值得的,那么恢复这些工作就容易多了)是重命名你现有的分支:然后创建一个名为
master
的本地分支来“跟踪”(我不太喜欢这个术语,因为我认为它会让人感到困惑,但这是git术语:-))源(或上游)master:然后你就可以开始了
最后三个命令(有快捷键使其仅为两个命令)的作用是更改粘贴在现有标签上的名称,然后创建一个新标签,然后切换到该标签:
在做任何事情之前:
git branch -m
之后:git branch -t master upstream/master
之后:这里
C0
是你第一次提交git clone
时得到的最新提交(一个完整的源代码树),C1到C9是你的提交。请注意,如果您先选择
git checkout bunchofhacks
,然后选择git reset --hard HEAD^^
,则最后一张图片将更改为:原因是
HEAD^^
将修订版从当前分支的头部向上命名为第二个(刚好在复位之前是bunchofhacks
),然后reset --hard
移动标签。提交C8和C9现在几乎不可见(你可以使用像reflog和git fsck
这样的东西来找到它们,但这不再是微不足道的)。你的标签是你的,你可以随心所欲地移动。fetch
命令负责处理以remotes/
开头的字符串。传统做法是将“yours”与“theirs”匹配(因此,如果他们有remotes/origin/mauve
,您也会将您的命名为mauve
),但是你可以在任何时候输入“他们的”来命名/查看你从“他们”那里得到的提交。(记住,“一次提交”是指整个源代码树,如果需要,你可以从一次提交中挑选出一个特定的文件,例如git show
。)afdcj2ne2#
我和你有同样的问题。
我做了
git status
git fetch
git pull
,但我的分支仍然落后于原点。我有文件夹和文件推到远程,我在网上看到了文件,但在我的本地,它们不见了。最后,这些命令更新了我本地的所有文件和文件夹:
或者如果你想要一个分支
jhiyze9q3#
您提交的任何更改,如删除所有项目文件,在拉取后仍然存在。拉取所做的一切就是将其他地方的最新更改合并到您自己的分支中,如果您的分支已经删除了所有内容,那么当上游更改影响到您删除的文件时,您最多会遇到合并冲突。因此,简言之,是的,所有内容都是最新的。
如果你描述你想要什么结果,而不是"所有文件删除",也许有人可以建议一个适当的行动过程。
获取我系统上的最新代码
你似乎不明白的是,你已经有了最新的代码,这是你的。如果你真的想看到 * 别人 * 在master分支上的最新工作,只要做:
请注意,这不会让您立即(重新)开始自己的工作。如果您需要知道如何撤消已做的某项工作或还原您或其他人所做的更改,请提供详细信息。此外,请考虑阅读有关版本控制的内容,因为您似乎误解了其基本用途。
pkbketx94#
虽然这些答案对我都不起作用,但我能够使用以下命令修复这个问题。
git fetch origin
这对我来说是个骗局。
nom7f22z5#
就像其他人说的那样,pull将上游的修改合并到你的存储库中。如果你想用上游的内容替换你的存储库中的内容,你有几个选择。即兴的,我会同意
oknrviil6#
最好的答案在给出的信息的广度和深度方面要好得多,但似乎如果您希望您的问题几乎立即得到解决,并且不介意使用版本控制的一些基本原则,您可以...
1.切换到主服务器
1.删除不需要的分支。(注意:它必须有-D,而不是普通的-d标志,因为你的分支比主分支提前了很多次提交。
1.创建新分支
p5cysglq7#
如果您的本地文件不在github中,而您的
git status
显示您的分支是最新的'origin/master'。没有要提交的,正在清理树
如果文件位于
.gitignore
中,则可能发生此情况试试跑
看看这些文件是否在那里出现,这就解释了为什么git不想把它们移到遥控器上。
gdrx4gfi8#
我也遇到了这个问题,Git fetch和git pull都说“already up to date”,但我可以在其他计算机和网络浏览器(bitbucket)的分支上看到更多的推送提交,这些提交不在我的代码中,我无法拉取。
这里写的东西对我都没用。
对我来说,唯一的解决方案是创建一个新分支(在web工具中或在另一台机器上),然后在 checkout 那个新分支后,一切都恢复了。