即使我有本地更改,git push也会说所有内容都是最新的

Zel*_*luX 216 git gitosis

我有一个远程gitosis服务器和一个本地git存储库,每次我对我的代码进行重大更改,我都会将更改推送到该服务器.

但是今天我发现即使我有一些本地更改并提交到本地存储库,当运行git push origin master时它会说"Everything up-date",但是当我使用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
Run Code Online (Sandbox Code Playgroud)

Von*_*onC 243

你不会有任何机会与一个超然的头

如:

分离的头

表明您的最新提交不是分支负责人.

$ 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>
Run Code Online (Sandbox Code Playgroud)

git checkout手册页中所述(强调我的):

有时候能够签出一个不在你的某个分支顶端的提交是有用的.
最明显的例子是在标记的官方发布点检查提交,如下所示:

$ git checkout v2.6.18
Run Code Online (Sandbox Code Playgroud)

早期版本的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垃圾收集来丢弃您的临时提交和合并.
如果你错误地这样做了,你可以向HEAD询问reflog,例如

$ git log -g -2 HEAD
Run Code Online (Sandbox Code Playgroud)

  • 我并不完全清楚我是如何进入这种状态的(此刻正在对git-svn进行一些修改),但这足以让我回到正确的位置.谢谢. (4认同)

Laz*_*Laz 128

呃..如果你是一个git noob,你确定你git commit以前有过git push吗?我第一次犯了这个错误!

  • 这是`git commit -a -m"你的信息就在这里"`在我的情况下 (9认同)
  • @FoxMcCloud 提交是需要意识到的重要一步,我相信如果您还没有的话,您会学会喜欢它:) ~ `git add -A`,`git diff --staged`,*滚动浏览变化* 嗯看起来非常好,`git commit -m 'bam!'`,`git Push` (2认同)

Rom*_*kov 51

也许你正在推动一个新的本地分支机构?

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

git push origin your-new-branch-name
Run Code Online (Sandbox Code Playgroud)

关于git的其中一个...你克隆一个仓库,做一个分支,提交一些变化,推动......"一切都是最新的".我理解为什么会这样,但这个工作流程对新手来说非常不友好.

  • 谢谢!这解决了我的问题"一切都是最新的"我有一个新的分支 (3认同)

cam*_*den 34

我的问题是我的本地分支的名称与远程分支的名称不同.我能够通过执行以下操作来推动:

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

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


小智 28

需要注意的另一个重要情况是:git的默认状态是你在"master"分支中工作.在很多情况下,你只是作为你的主要工作分支(尽管有些人喜欢并做其他事情).

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

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

所以我习惯性地将主分支推送到共享仓库......这可能是一件很干净的东西,在我看来......

但我忘记了我一直在努力的变化还没有进入主分支!

因此,每当我尝试git push,我看到"一切都是最新的",我想尖叫,但当然,这不是git的错!这是我的.

所以相反,我将我的分支合并到主人,然后做推,然后一切都很开心.


小智 14

我遇到了同样的问题。因为我没有对暂存区添加更改。我直接尝试使用命令将代码推送到远程仓库:

git push origin master

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

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

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


Mel*_*hia 13

$ git push origin local_branch:remote_branch
Run Code Online (Sandbox Code Playgroud)

说明

我有同样的错误,并花了几个小时试图找出它.最后我发现了它.我不知道的是,像这样推送git push origin branch-x将尝试在本地搜索branch-x然后推送到远程branch-x.

就我而言,我有两个远程网址.当我尝试从本地y推送到x遥控器时,我做了一个从branch-xbranch-y的结帐.我得到的消息一切都是最新的,这是正常的,因为我正在推送到第二个遥控器的x.

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

$ git push origin local_branch:remote_branch
Run Code Online (Sandbox Code Playgroud)

  • 这对我有帮助,我有另一个名为远程分支的本地分支,这引起了混乱。 (2认同)

rod*_*lin 6

请参阅上面的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>
Run Code Online (Sandbox Code Playgroud)

我这样做了,但是当我尝试时git push remoterepo master,它说 "错误:未能推送一些引用.为了防止您丢失历史记录,非快进更新被拒绝,合并远程更改(例如'git pull')之前再推一次."

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

Git不再说"一切都是最新的" - 它停止抱怨"快速前进".