为什么Git说我的master分支“已经是最新的”,即使它不是?

nimxete2  于 2023-01-19  发布在  Git
关注(0)|答案(8)|浏览(710)

基本问题

我只是删除了项目中某个文件的所有代码,并将更改提交到本地git(故意的)。

git pull upstream master

从上游获取并合并(因此理论上删除的代码应该会回来)。
Git告诉我一切都是最新的。
一切肯定不是最新的--所有被删除的代码仍然被删除。

其他相关信息

我只有一个分支叫"大师"。
我最近设置了"大师"这样追踪上游:
分支主机设置为从上游跟踪远程分支主机。
命令git branch -vv产生:

* master 7cfcb29 [upstream/master: ahead 9] deletion test

为什么为什么会发生这种情况?我正准备给我的项目经理发电子邮件,告诉他我对代码所做的任何修改。

更新

我以为这很明显,但无论如何这是我的目标:

    • 获取系统上最新的代码。**

请原谅我的愤怒,但为什么这么简单的任务要这么难呢?

2admgd59

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 checkout upstream/master

这就告诉git你想把当前目录移动到全名为remotes/upstream/master的分支,你会看到他们的代码是上次运行git fetch时的最新代码。
如果你想放弃你自己的修改,你需要做的是改变git对你的标签master应该命名哪个修订版本的想法,现在它命名你最近的提交。如果你回到那个分支:

git checkout master

那么git reset命令将允许您“移动标签”,就像它原来那样。唯一剩下的问题(假设您真的准备放弃您所做的一切)是找到标签应该指向的位置。
git log将允许您查找数字名称(如7cfcb29),这些名称是永久的(永远不会更改)名称,并且还有许多其他命名方式,但在本例中,您只需要名称upstream/master
要移动标签,清除您自己的更改(您提交的任何更改实际上都可以恢复相当长的一段时间,但在此之后要困难得多,所以请 * 非常 * 确定):

git reset --hard upstream/master

--hard告诉git清除你正在做的事情,移动当前分支标签,然后 checkout 给定的提交。

  • 真的 * 想要git reset --hard并删除一堆工作并不是什么特别常见的事情。一个更安全的方法(如果你觉得有些工作是值得的,那么恢复这些工作就容易多了)是重命名你现有的分支:
git branch -m master bunchofhacks

然后创建一个名为master的本地分支来“跟踪”(我不太喜欢这个术语,因为我认为它会让人感到困惑,但这是git术语:-))源(或上游)master:

git branch -t master upstream/master

然后你就可以开始了

git checkout master

最后三个命令(有快捷键使其仅为两个命令)的作用是更改粘贴在现有标签上的名称,然后创建一个新标签,然后切换到该标签:
在做任何事情之前:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "master"

git branch -m之后:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

git branch -t master upstream/master之后:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

这里C0是你第一次提交git clone时得到的最新提交(一个完整的源代码树),C1到C9是你的提交。
请注意,如果您先选择git checkout bunchofhacks,然后选择git reset --hard HEAD^^,则最后一张图片将更改为:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 -    "bunchofhacks"
                                                      \
                                                       \- C8 --- C9

原因是HEAD^^将修订版从当前分支的头部向上命名为第二个(刚好在复位之前是bunchofhacks),然后reset --hard移动标签。提交C8和C9现在几乎不可见(你可以使用像reflog和git fsck这样的东西来找到它们,但这不再是微不足道的)。你的标签是你的,你可以随心所欲地移动。fetch命令负责处理以remotes/开头的字符串。传统做法是将“yours”与“theirs”匹配(因此,如果他们有remotes/origin/mauve,您也会将您的命名为mauve),但是你可以在任何时候输入“他们的”来命名/查看你从“他们”那里得到的提交。(记住,“一次提交”是指整个源代码树,如果需要,你可以从一次提交中挑选出一个特定的文件,例如git show。)

afdcj2ne

afdcj2ne2#

我和你有同样的问题。
我做了git statusgit fetchgit pull,但我的分支仍然落后于原点。我有文件夹和文件推到远程,我在网上看到了文件,但在我的本地,它们不见了。
最后,这些命令更新了我本地的所有文件和文件夹:

git fetch --all
git reset --hard origin/master

或者如果你想要一个分支

git checkout your_branch_name_here
git reset --hard origin/your_branch_name_here
jhiyze9q

jhiyze9q3#

您提交的任何更改,如删除所有项目文件,在拉取后仍然存在。拉取所做的一切就是将其他地方的最新更改合并到您自己的分支中,如果您的分支已经删除了所有内容,那么当上游更改影响到您删除的文件时,您最多会遇到合并冲突。因此,简言之,是的,所有内容都是最新的。
如果你描述你想要什么结果,而不是"所有文件删除",也许有人可以建议一个适当的行动过程。

    • 更新日期:**

获取我系统上的最新代码
你似乎不明白的是,你已经有了最新的代码,这是你的。如果你真的想看到 * 别人 * 在master分支上的最新工作,只要做:

git fetch upstream
git checkout upstream/master

请注意,这不会让您立即(重新)开始自己的工作。如果您需要知道如何撤消已做的某项工作或还原您或其他人所做的更改,请提供详细信息。此外,请考虑阅读有关版本控制的内容,因为您似乎误解了其基本用途。

pkbketx9

pkbketx94#

虽然这些答案对我都不起作用,但我能够使用以下命令修复这个问题。
git fetch origin
这对我来说是个骗局。

nom7f22z

nom7f22z5#

就像其他人说的那样,pull将上游的修改合并到你的存储库中。如果你想用上游的内容替换你的存储库中的内容,你有几个选择。即兴的,我会同意

git checkout HEAD^1  # Get off your repo's master.. doesn't matter where you go, so just go back one commit
git branch -d master  # Delete your repo's master branch
git checkout -t upstream/master  # Check out upstream's master into a local tracking branch of the same name
oknrviil

oknrviil6#

最好的答案在给出的信息的广度和深度方面要好得多,但似乎如果您希望您的问题几乎立即得到解决,并且不介意使用版本控制的一些基本原则,您可以...
1.切换到主服务器

$ git checkout upstream master

1.删除不需要的分支。(注意:它必须有-D,而不是普通的-d标志,因为你的分支比主分支提前了很多次提交。

$ git branch -d <branch_name>

1.创建新分支

$ git checkout -b <new_branch_name>
p5cysglq

p5cysglq7#

如果您的本地文件不在github中,而您的git status显示
您的分支是最新的'origin/master'。没有要提交的,正在清理树

如果文件位于.gitignore中,则可能发生此情况

试试跑

cat .gitignore

看看这些文件是否在那里出现,这就解释了为什么git不想把它们移到遥控器上。

gdrx4gfi

gdrx4gfi8#

我也遇到了这个问题,Git fetch和git pull都说“already up to date”,但我可以在其他计算机和网络浏览器(bitbucket)的分支上看到更多的推送提交,这些提交不在我的代码中,我无法拉取。
这里写的东西对我都没用。
对我来说,唯一的解决方案是创建一个新分支(在web工具中或在另一台机器上),然后在 checkout 那个新分支后,一切都恢复了。

相关问题