Git推送说“一切都是最新的”;即使我有局部的变化

我有一个远程gitosis服务器和一个本地git存储库,每次我在代码中做大的更改时,我也会将更改推到该服务器。

但是今天我发现,即使我有一些本地更改并提交到本地存储库,当运行git push origin master时,它说“一切最新”,但当我使用git clone在远程服务器上签出文件时,它不包含最新的更改。我只有一个名为“master”的分支机构和一个名为“origin”的远程服务器。

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

$ 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
389400 次浏览

你是否正在使用分离的头 ?

如:

detached 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来创建一个merge 当你的HEAD被分离时,你所处的状态不会被任何分支记录(这是自然的——你不在任何分支上)。
这意味着您可以通过切换回现有分支来放弃临时提交和合并(例如git checkout master)和后面的git prunegit gc将对它们进行垃圾回收。
如果你错误地这样做了,你可以问reflog HEAD你在哪里,例如

$ git log -g -2 HEAD

虽然git push表示“所有内容都是最新的”,但从技术上讲,你仍然可以推送一个分离的HEAD,如的评论 by 乔纳森Benn中所述

 git push origin HEAD:main

你必须指定目标分支,因为源是一个分支,并且没有上游目标分支。

另一种需要注意的重要情况是:git的默认状态是您正在“master”分支中工作。在很多情况下,您只需要将其作为主要的工作分支(尽管有些人会变得花哨并做其他事情)。

不管怎样,这只是一个分支。所以我可能会遇到这样的情况:

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

所以我习惯性地将主分支推到共享回购…对我来说,这可能是一件干净的好事……

但是我已经忘记了我一直在做的改变还没有在主分支!!

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

因此,我将我的分支合并到master中,然后执行push,一切都恢复正常。

我也遇到过类似的情况;当我做出改变并试图 git push origin master,它说一切都是最新的。

我必须git add更改的文件,然后git push origin master。从那时起,它就开始工作了。

呃. .如果你是一个git新手,你确定你在git push之前有git commit吗?我第一次就犯了这个错误!

见上面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时,它说< I > "错误:未能推动一些参考。为了防止您丢失历史记录,非快进更新被拒绝,合并远程更改(例如。'git pull'),然后再推。" < / i > < / p >

所以我做了'git拉remoterepo master',它发现了一个冲突。我再次执行git reset --hard <commit-id>,将冲突文件复制到备份文件夹,再次执行git pull remoterepo master,将冲突文件复制回我的项目中,执行git commit,然后执行git push remoterepo master,这一次它工作了。

Git不再说“一切都是最新的”,也不再抱怨“快进”。

从你的git状态来看,你的情况可能和我的不一样。

但无论如何,这是发生在我身上的事情。我遇到了以下错误:

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

这里更有意义的信息是遥控器挂了。结果是由于超过了http post缓冲区的大小。解决办法是增加

git config http.postBuffer 524288000

验证您没有篡改远程URL。

我还想提一下,我在本地Jenkins构建配置中启用Git作为CVS后遇到了这个问题。Jenkins似乎签出了我给它的分支的最近提交,并重置了我的远程以对应于我给它的repo的路径。不得不再次签出我的功能分支,并修复我的原始远程url与'git remote set-url'。不要把构建工具指向你的工作目录,否则你会有一段糟糕的时间。我的遥控器被设置为我工作目录的文件路径,所以当我试图用相同的源和目标推送更改时,它自然会报告所有最新的内容。

也许你想在当地开一家新分公司?

必须显式地推送一个新的本地分支:

git push origin your-new-branch-name

这是关于少年犯的一件事…你克隆一个回购,创建一个分支,提交一些更改,推送…“一切都是最新的”。我理解为什么会发生这种情况,但这种工作流程对新人非常不友好。

另一种可能是您在.gitignore文件中命名了一个被排除的目录。这样新的提交就不会被推送。我碰巧命名了一个目录来忽略“search”,但那也是我源代码树中的一个目录。

当我在Github上合并一个分支并继续在本地开发时,我自己也遇到了这种情况。我的解决办法与其他人的建议略有不同。

首先,我从我的旧本地分支(我不能推)上分支了一个新的本地分支。然后我将新的本地分支推送到原始服务器(Github)。即。

$ git checkout -b newlocalbranch oldlocalbranch
$ git push origin newlocalbranch

这得到的变化显示在Github上,虽然在newlocalbranch而不是oldlocalbranch。

我的问题是本地分支与远程分支的名称不同。我可以通过以下方法来推动:

$ git push origin local-branch-name:remote-branch-name

(Credit to https://penandpants.com/2013/02/07/git-pushing-to-a-remote-branch-with-a-different-name/)

我找到了一条捷径。转到你的。git文件夹,打开HEAD文件,把你所在的分支改回master。例如:refs/heads/master

我今天遇到了这个问题,它和其他答案没有任何关系。以下是我所做的以及我是如何解决它的:

我的一个仓库最近移动了,但我有一个本地副本。我从我的本地“主”分支分支出去,并做了一些更改——然后我记得存储库已经移动了。我使用git remote set-url origin https://<my_new_repository_url>来设置新的URL,但当我推送时,它只会说“Everything up to date”,而不是将我的新分支推送到master。

我最终通过基于origin/master来解决这个问题,然后用显式的分支名称来推,像这样:

$ git rebase <my_branch> origin/master
$ git push origin <my_branch>

我希望这能帮助任何有我同样问题的人!

在我的例子中,我有2个远程回购。

git remote -v
originhttps https://asim_kt@...
originhttps https://asim_kt@...
origin  ssh:git@bitbucket.org:...
origin  ssh:git@bitbucket.org:...

两次回购都是一样的。只有一个是https,另一个是ssh。因此,删除不需要的,(在我的情况下ssh.)因为我使用https,因为ssh不工作!)为我修复了这个问题。

$ git push origin local_branch:remote_branch

解释

我有同样的错误&花了好几个小时才弄明白。最后我找到了。 我不知道的是,像这样的git push origin branch-x将尝试在本地搜索branch-x,然后推送到远程branch-x。

在我的例子中,我有两个远程url。当我试图从y本地推到x远程时,我做了从branch-x分支y的签出,我有消息说一切都是最新的,这是正常的,因为我正在推到第二个远程的x。

长话短说,为了不落入这种陷阱,你需要指定源ref和目标ref:

$ 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 commitgit push进行自动驾驶,并且没有读取git commit的输出。结果,这是一条错误消息,因为我忘记了-am。

[colin] ~/github/rentap.js [master] M % git commit 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'
error: pathspec 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers' did not match any file(s) known to git.
[colin] ~/github/rentap.js [master] M % git push
Enter passphrase for key '/home/colin/.ssh/id_ecdsa':
Everything up-to-date

通过将-am放在我通常做的地方来修复它:

[colin] ~/github/rentap.js [master] M % git commit -am 'figured out some more stuff with the forms in views and started figuring out row and mode in models so also made matching routes and controllers'

超级罕见-但仍然:在Windows上,可能是packed-refs有一个带有一个字母大小写的分支(即dev/mybranch),而参考文献文件夹有另一个大小写(即dev/mybranch)。Ignorecase设置为true。

解决方案是手动从packed-refs中删除相关行。没找到更干净的解决办法。

我也有同样的问题。在我的例子中,这是因为必须为同一个遥控器命名。它创建了标准的“起源”,但我已经使用“github”作为我的遥控器很长一段时间了,所以它也在那里。只要我移除了“origin”遥控器,错误就消失了。

我犯的另一个非常简单但又愚蠢的错误:我只是忘记在提交中添加消息-m修饰符。所以我写道:

git commit 'My message'

而不是正确的:

git commit -m 'My message'

注意:它不会抛出任何错误!但是你将不能推你的提交,而总是得到Everything up to date

这里,我的解决方案与上面的不同。我还没有弄清楚这个问题是怎么发生的,但我解决了它。有点出乎意料。

现在来看:

$ git push origin  use_local_cache_v1
Everything up-to-date
$ git status
On branch test
Your branch is ahead of 'origin/use_local_cache_v1' by 4 commits.
(use "git push" to publish your local commits)
......
$ git push
fatal: The upstream branch of your current branch does not match
the name of your current branch.  To push to the upstream branch
on the remote, use


git push origin HEAD:use_local_cache_v1


To push to the branch of the same name on the remote, use


git push origin test
    

$ git push origin HEAD:use_local_cache_v1
Total 0 (delta 0), reused 0 (delta 0)
remote:

对我有效的命令是

$git push origin HEAD:use_local_cache

(希望你们能尽快走出困境)

另一种可能是,您的提交不会影响您所推送的目录。在我的例子中,我有一个这样的结构

- .git
- README.md
- client/
- package.json
- example.js
- api/
- requirements.txt
- example.py

然后我提交了一个master modify README.md,然后运行git subtree push --prefix client heroku-client master并得到消息Everything up-to-date

当我遇到这个欺骗性错误时,我正在使用Jupyter-Notebook

我无法通过上面提供的解决方案来解决,因为我既没有< >强分离头< / >强,也没有< /强> < >强不同的名称用于我的强大的< > < / >强< >强远程< / >强回购。

但我所拥有的是我的文件大小略大于1 mb,最大的几乎是~ 2 mb

我使用如何减小我的iPython笔记本的文件大小?技术减小了每个文件的文件大小。

它通过清除输出来帮助减小文件大小。我能够推动代码,从此以后,因为它使我的文件大小以kb为单位。

我也遇到过同样的问题。因为我没有对暂存区进行更改。 我直接尝试使用命令将代码推到远程回购:

git push origin master

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

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

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

我们需要添加文件并提交已经更改/添加的文件 执行以下命令

Git添加。或者git add nameoffile #,它将添加项目中现有的文件

Git commit -m“第一次提交”;#提交项目中的所有文件

Git push origin master

我有多个遥控器。除了一个人以外,所有人都正确地推了,所以我知道我没有一个独立的头或提交问题。

结果,我不小心给了两个遥控器相同的URL。复制URL的远程失败,因为我正在推到一个已经被推到的URL !

使用git remote -v显示了我的远程列表和它们的url,在那里我意识到问题。

重置失败的远程到其正确的URL修复了这个问题:
git remote set-url <remote-name> <correct-url> < / p >

我遇到过这样的情况,我在一个特征分支上,而我的同事也创建了他自己的特征分支。我运行了git fetch -agit push origin <coworkers_branch>。它一直告诉我一切都是最新的。

我通过签入<coworkers_branch>然后从我的特征分支中抽取,然后提交并推回到coworkers_branch>

我真诚地希望这能帮助到一些人,因为我花了太多的时间在这上面。

git branch -M <desired branch>

这招对我很管用。

在我的情况下,问题的原因是我正在执行git push/pull命令从一个符号链接文件夹在git bash! 我在一个git项目中的符号链接文件夹中指向另一个git项目,git pull/push命令回答Everything up-to-date。 当我将(cd)移动到实际文件夹的路径(不是通过符号链接)时,git push/pull命令起作用了