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

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

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

当前回答

见上面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>

我这么做了,但是当我尝试着去推remoterepo master时,它说 "错误:未能推动一些参考。为了防止您丢失历史记录,非快进更新被拒绝,合并远程更改(例如。'git pull'),然后再推。”

所以我做了'git拉remoterepo master',它发现了一个冲突。我再次做了git reset——hard <commit-id>,将冲突文件复制到备份文件夹,git再次拉出remoterepo master,将冲突文件复制回我的项目,git提交,然后git推送remoterepo master,这一次它成功了。

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

其他回答

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

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

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

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

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

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

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

你是在用一个分离的脑袋工作吗?

如:

指示您的最新提交不是分支头。

警告:以下是一个git重置——很难:如果你想保存当前修改的文件,请确保首先使用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签出手册页中提到的(重点是我的):

有时能够签出不在分支顶端的提交是有用的。 最明显的例子是在标记的官方发布点检出提交,就像这样:

$ git checkout v2.6.18

Earlier versions of git did not allow this and asked you to create a temporary branch using the -b option, but starting from version 1.5.0, the above command detaches your HEAD from the current branch and directly points at the commit named by the tag (v2.6.18 in the example above). You can use all git commands while in this state. You can use git reset --hard $othercommit to further move around, for example. You can make changes and create a new commit on top of a detached HEAD. You can even create a merge by using git merge $othercommit. The state you are in while your HEAD is detached is not recorded by any branch (which is natural --- you are not on any branch). What this means is that you can discard your temporary commits and merges by switching back to an existing branch (e.g. git checkout master), and a later git prune or git gc would garbage-collect them. If you did this by mistake, you can ask the reflog for HEAD where you were, e.g. $ git log -g -2 HEAD


虽然git push表示“所有内容都是最新的”,但从技术上讲,你仍然可以推送一个分离的HEAD,正如Jonathan Benn在评论中所指出的那样

 git push origin HEAD:main

您必须指定目标分支,因为源不是分支,也没有上游目标分支。

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

我的错误不同于上面提到的所有错误。如果你不知道为什么你会有一个分离的头,那么你可能不会。我正在使用git commit和git 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'

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

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