即使我有本地更改,git push 仍然显示“一切都是最新的”

349

我有一个远程的gitosis服务器和一个本地的git代码库,每次当我对代码进行重大更改时,我都会将这些变更推送到该服务器。

但是今天我发现,尽管我有一些本地的更改并且提交到了本地仓库,但在运行git push origin master时,它显示“Everything up-to-date”,但是当我使用git clone在远程服务器上检出文件时,它并不包含最新的更改。而且我只有一个名为“master”的分支和一个名为“origin”的远程服务器。

PS: 这是运行ls-remote时git显示的内容,我不确定它是否有帮助。

$ git ls-remote origin
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
$ git ls-remote .
49c2cb46b9e798247898afdb079e76e40c9f77ea        HEAD
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/heads/master
df80d0c64b8e2c160d3d9b106b30aee9540b6ece        refs/remotes/origin/master
3a04c3ea9b81252b0626b760f0a7766b81652c0c        refs/tags/stage3

https://dev59.com/WG435IYBdhLWcg3w3EEi - Drew
最好再仔细检查一下你所在的目录!特别是当你有子模块时,你可能会将git响应误认为是父级目录的响应。 - geotheory
在我的情况下,我在执行commit时出现了错误,但我没有注意到并尝试推送代码。 - Zohab Ali
11
忘记提交了吗? - ldgorman
1
我不知道为什么会这样,但重置提交 (git reset),关闭控制台窗口,然后返回到起点帮了我一个大忙。 - O-9

初始化Github访问

git config --global user.email "mail@mail.com" git config --global user.name "iamgit" ### 提交 git commit -am "compile" ### 推送到Git git push -f origin master
- Роман Зыков
32个回答

326

你是否碰巧在处理一个分离的 HEAD

就像这样:

分离的 HEAD

这表示你的最新提交不是分支头。

警告:以下执行了一条git reset --hard命令:如果要保存当前修改的文件,请务必先使用git stash

$ git log -1
# note the SHA-1 of latest commit
$ git checkout master
# reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

正如在git checkout手册页中所提到的(重点是我的):

有时候能够检出一个不在你的分支末尾的提交是很有用的。
最明显的例子是检出标记的官方发布点的提交,像这样:

$ git checkout v2.6.18
早期版本的 git 不允许这样做,会要求你使用 -b 选项创建一个临时分支。但是从1.5.0版本开始,上面的命令会将你的 HEAD 分离出当前分支,并直接指向标记所对应的提交(例如上面的 v2.6.18)。在此状态下,你可以使用所有的 git 命令。你可以使用 git reset --hard $othercommit 来进一步移动。你甚至可以在分离 HEAD 的基础上进行更改并创建新的提交。你甚至可以使用 git merge $othercommit 创建合并。当你的 HEAD 分离时,你所处的状态不会被任何分支记录(这是很自然的-你没有在任何分支上)。这意味着你可以切换回现有分支(例如 git checkout master)来放弃你的临时提交和合并,后续的 git prune 或 git gc 将清理它们。如果你误操作了,可以通过 reflog 查看 HEAD 所在位置,例如:
$ git log -g -2 HEAD
虽然git push显示“everything up-to-date”,但你仍然可以在技术上推送一个分离的HEAD,正如评论中由Jonathan Benn所指出的那样。
 git push origin HEAD:main

由于源不是一个分支,也没有上游目标分支,所以您必须指定目标分支。


6
我现在不太清楚自己是怎么陷入这种状态的(正在使用git-svn进行一些乱搞),但是这已经足够让我回到正确的位置。谢谢。 - Christopher Schmidt
1
@John,你需要在分支中才能进行推送。只要你处于分离的HEAD模式下,那是行不通的。将你的分支重置到当前位置:git branch -f myBranch HEAD,然后检出该分支并推送它。在你的情况下,如果你正在合并nodeAPI,那么myBranch可能是master - VonC
1
请注意,在运行此命令后可能会丢失所有本地更改!在执行此类操作之前,请考虑使用git stash和备份代码。 - kta
1
当你的本地Git处于分离HEAD状态时,仍然可以推送到远程仓库:git push origin HEAD:master - Jonathan Benn
1
@JonathanBenn 很好的建议。我已经编辑了答案,以便更多人能看到您的评论。 - VonC
显示剩余2条评论

224

如果你是Git的新手,你确定在执行git push之前已经执行了git commit吗?我第一次就犯了这个错误!


18
在我这种情况下,应该是git commit -a -m "在此处输入消息" - ᴍᴇʜᴏᴠ
1
每次我想要在Github上添加新项目时,我总是会忘记,然后错误信息会让我觉得自己做错了什么事情。当我创建新的备份存储库并且忘记提交时,这种情况只会发生在我身上。我太蠢了! - Tom Stickel
2
@FoxMcCloud 提交是一个重要的步骤,需要有意识地去完成。如果你还没有喜欢上它,我相信你很快就会爱上它的 :) ~ git add -Agit diff --staged浏览更改 嗯,看起来非常不错,git commit -m 'bam!'git push - AFOC
1
在我的情况下(有点傻),我在提交 Git 后被“告诉我你是谁”所困扰。在这种情况下,Git 要求你重新运行 git commit。 - universvm

88

也许你正在推送一个新的本地分支?

必须明确地推送一个新的本地分支:

git push origin your-new-branch-name

Git中的一件事情就是...你克隆一个仓库,创建一个分支,提交一些更改,推送... "一切都是最新的"。我知道为什么会发生这种情况,但这种工作流程对于新手来说非常不友好。


5
谢谢!这解决了我的问题。我创建了一个新分支,出现了“everything up-to-date”的提示,但现在已经可以了。 - Pangu
“your-new-branch-name” 是什么意思?顺便说一句,你对新手的看法太正确了。 - www-0av-Com
@user1863152 这是你创建的新本地分支的名称。看起来你没有这样做,所以请检查其他答案。 - Roman Starkov
完全同意“这个工作流对新手非常不友好”的说法。我已经为此苦苦挣扎了一个小时。我设置了远程和本地仓库。修改了本地的README文件,试图将其推送到远程,但在远程没有任何变化。 - G_real
这并不完全可行,因为在分离 HEAD 状态下,您需要指定要使用的本地分支/引用。 - Jonathan Benn

68

这种情况的特定命令是:git push origin HEAD:master - Jonathan Benn

37
$ git push origin local_branch:remote_branch

说明

我也遇到了同样的错误,花费数小时来解决它。最终我找到了解决方法。我不知道的是,像这样推送代码 git push origin branch-x 将尝试在本地搜索 branch-x 然后推送到远程的 branch-x。

在我的情况下,我有两个远程 URLs。 当我试图从 y 本地推送到 x 远程时,我从 branch-x 切换到了 branch-y ,我得到了消息“一切都是最新的”,这很正常,因为我在第二个远程的 x 上推送。

长话短说,要避免这种情况,您需要指定源引用和目标引用:

$ git push origin local_branch:remote_branch

更新:

如果您每次推送分支时都需要运行此命令,则可能需要使用以下命令在本地分支和远程分支之间设置上游:

$ git push --set-upstream origin local_branch:remote_branch

或者

$ git push -u origin local_branch:remote_branch

“git push upstream dev:master” 的意思是将源代码从dev分支推送到master分支。对吗? - Dhaduk Mitesh
2
这对我很有帮助,我有另一个本地分支与远程分支同名,导致了混淆。 - Hubert Kubiak
好的,这对我来说肯定有效,但每次我想将某些内容推送到远程时都必须这样做。我该如何一劳永逸地解决它? - SamuraiJack
你可能需要使用以下命令在本地分支和远程分支之间建立上游关系:$ git push --set-upstream origin local_branch:remote_branch - Melchia

29

还有一种情况需要注意:git的默认状态是你在“master”分支工作。对于很多情况,你只需将其作为主要的工作分支(尽管有些人可能会花样百出,做其他事情)。

无论如何,那只是一个分支。所以我可能会遇到这样的情况:

我的活动分支实际上不是主分支。但是我习惯性地执行命令:git push (之前已经执行了git push origin master,所以这是一个快捷方式)。

因此,我习惯性地将主分支推送到共享存储库……在我的情况下,这可能是一件好事……

但是我忘记了我正在工作的更改还没有合并到主分支中!!!

因此,每次我尝试git push,并看到“Everything up to date”时,我想尖叫,但当然,这不是git的错!这是我的错。

因此,我将我的分支合并到主分支中,然后进行推送,一切又变得愉快了。


23

我曾经遇到过相同的问题。因为我没有将更改添加到暂存区,直接使用以下命令尝试将代码推送到远程仓库:

git push origin master

它会显示消息Everything up-to-date

要解决这个问题,请尝试以下步骤:

  1. git add .
  2. git commit -m "Bug Fixed"
  3. git push -u origin master

7
请参考VonC上面的回答 - 我需要额外的步骤:
$ git log -1
- note the SHA-1 of latest commit
$ git checkout master
- reset your branch head to your previously detached commit
$ git reset --hard <commit-id>

我按照你的指示执行了操作,但在尝试 git push remoterepo master 时,它显示了以下错误信息:"error: failed to push some refs. To prevent you from losing history, non-fast-forward updates were rejected, Merge the remote changes (e.g. 'git pull') before pushing again." 所以我执行了'git pull remoterepo master',然后发现有冲突。我再次执行了git reset --hard <commit-id>,将冲突文件复制到备份文件夹中,再次执行了git pull remoterepo master,将冲突文件复制回项目中,执行了git commit,然后执行了git push remoterepo master,这一次它成功了。
Git不再说'everything is up to date',也不再抱怨'fast forwards'了。

4

我犯了一个非常简单却很新手的错误:我忘记在我的提交中加入消息-m修饰符。所以我写成:

git commit 'My message'

改为正确的方式:

git commit -m 'My message'

注意:它不会抛出任何错误!但是你将无法推送你的提交并始终得到 Everything up to date


1
我不明白为什么会犯这样的小错误,还需要在stackoverflow上找到解决方法。这只是给未来的自己提醒,务必要执行“git status”来检查是否已经提交了代码。 - Hidayat Riva'i

3

根据您的git状态,您可能与我有不同的情况。

但无论如何,以下是我遇到的情况。 我遇到了以下错误:

fatal: The remote end hung up unexpectedly
Everything up-to-date

这里更有用的信息是远程连接被挂断了。原因是由于超过了http post缓冲区大小。解决方法是增加它的大小: git config http.postBuffer 524288000

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接