我有一个远程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

当前回答

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

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

我最终通过重新基于origin/master,然后使用显式分支名称来解决它,就像这样:

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

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

其他回答

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

现在来看:

$ 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重置——很难:如果你想保存当前修改的文件,请确保首先使用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

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

另一个可能罕见的情况,但值得一提的是-当你在本地环境中配置了预提交钩子(扫描代码以查找错误,例如Python安全,flake8, black, isort, bandit等),如果其中一个失败了,你的提交也失败了。这在控制台中应该是显而易见的,但是由于来自钩子的错误可能会充斥控制台中,因此您可能没有意识到您的提交将无法工作,直到预提交钩子被配置为忽略问题或问题得到解决。

git branch -M <desired branch>

这招对我很管用。

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