由于master中的奇怪变化,无法推分支

时间:2013-12-07 18:10:33

标签: git push

我在分支上工作,我们将其命名为mybranch。我不修改master。 我想推动origin/feature/mybranch的更改,但我遇到了一些问题。奇怪的是我之前已经做过几次而且没有任何问题。

$ git branch
develop
* feature/mybranch
master


$ git push
To http://......
! [rejected]        master -> master (non-fast-forward)
error: failed to push some refs to 'http://....'
hint: Updates were rejected because a pushed branch tip is behind its remote
hint: counterpart. If you did not intend to push that branch, you may want to
hint: specify branches to push or set the 'push.default' configuration variable
hint: to 'simple', 'current' or 'upstream' to push only the current branch.

什么?主?!因此,请查看master

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
 (use "git pull" to update your local branch)


$ git pull
Updating 45c7319..f6b8e97
error: Your local changes to the following files would be overwritten by merge:
    platform/....java
    services/....java
    ...

Please, commit your changes or stash them before you can merge.
Aborting

这显示了7个修改过的文件。

$ git status
# On branch master
# Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
# Changes not staged for commit:
#   (use "git add <file>..." to update what will be committed)
#   (use "git checkout -- <file>..." to discard changes in working directory)
#
#       modified:   platform/....java
#       modified:   algorithms/....java
#       ...
#
# Untracked files:
#   (use "git add <file>..." to include in what will be committed)
#
#       algorithms/.../
#       and over 1100 files in bin folder. I don't know why gitignore doesn't work now.

这显示了17个(不是上面的7个)修改过的文件。很奇怪......没关系。这些不是我的改变,我想丢弃它们。

$ git checkout -f
Your branch is behind 'origin/master' by 2 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

我仍然在master ...

中有这些奇怪的变化

4 个答案:

答案 0 :(得分:13)

第1部分:完成推送而不必担心master

(注意:实际上,它已经完成了。请参阅第1部分底部的注释。)

您正在运行git push而没有其他参数。

如果您使用另外两个参数运行git push,它们会准确指定要在哪里推送。 git文档称之为<repository><refspec>

在您的情况下,存储库始终是origin(这是克隆内容时git设置的通常标准)。所以refspec是更有趣的部分。

这里是长 1 形式:

git push origin feature/mybranch:feature/mybranch

这会限制git仅尝试推送您的分支feature/mybranch,告诉远程控制器origin它应该更新 侧的分支feature/mybranch

如果省略:<same-name>部分,则默认使用冒号左侧的分支名称,因此:

git push origin feature/mybranch

做同样的事情,命令输入少了一点。

现在,当你遗漏<refspec>时会发生什么?答案在git pushgit config文档中,虽然在我的1.8.4.3文本版本中它很难阅读,我上面链接的在线版本是,如果有的话更糟糕的是: - )

  

当命令行未指定要使用&lt; refspec&gt;推送的内容时...          参数或--all, - mirror, - batgs选项,命令查找          默认通过咨询远程。*。推送配置,如果它          找不到,尊重push.default配置来决定推送什么          (有关push.default的含义,请参阅gitlink:git-config [1]。)

为了简化这一点,我可以告诉 2 你没有设置remote.origin.pushpush.default,所以你得到了&#34;默认默认&#34;,称为matching,这意味着您的git push在隐喻互联网电话上调出origin并说

  嘿,你有什么分支?

它说:

  

我有masterfeature/mybranch

所以你的git然后说:

  

好的,好吧,这就是我认为的master应该是什么,以及我认为feature/mybranch应该是什么。

他说:

  

哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇

......当你得到master时就是这样。

所以,有几个非常简单的解决方案。

解决方案#0:什么都不做

如果您仍然可以使用原始! [rejected] master -> master (non-fast-forward)输出,那么您应该可以看到如下内容:

push

这意味着即使 a430f6d..676699a feature/mybranch -> feature/mybranch ! [rejected] master -> master (non-fast-forward) 的更改被拒绝,也会接受master -> master的更改。你想要推动的分支,你做到了!您刚刚收到这条令人讨厌的错误消息,以便成功(现在您想知道如何处理分支feature/mybranch -> feature/mybranch)。

解决方案#1:明确master

如果你跑:

push

你的Git和起源的Git会有一个较短的对话。而不是你的Git问他&#34;嘿,whaddaya到了那里?&#34;然后尝试推送所有&#34;匹配&#34;分支机构,你的只会说:&#34;我有git push origin feature/mybranch &#34;的一些更新。您feature/mybranch背后的事实将无关紧要;你和你的Git,以及远程Git都不会看到那里。

解决方案#2:更改master

这只适用于你的git足够新,但到目前为止,大多数是:

push.default

Git人员计划更改更改(从Git版本2.0开始)&#34;默认默认&#34;,因为git config --global push.default simple 变得更烦人而不是有用, 很多时候。新的&#34;默认默认&#34;将是matching。 (有关这意味着什么的详细信息,请参阅the git config documentation。)

(设置simple版本会更改您的默认默认设置,但不会更改其他人。如果有任何存储库 - 您自己或其他人 - 具有本地--global设置,则会覆盖您的个人全球设置,但对于那些不适合的人,您的全局设置是git将使用的。您可以选择在每个仓库设置本地设置,这将影响您和使用您自己的回购的任何其他人,但是你需要记住在你的所有回购中设置它。)


1 实际上这只是半长形式:您可以在每个分支名称前添加push.default以使其更长。这只是为了炫耀。 : - )

2 我只是猜测,真的,但这是一个非常安全的赌注。配置refs/heads/remote.origin.push的人可能已经知道所有这些内容。


第2部分:为什么不会push.default更新?

我对此不太确定,但看起来好像有人意外地将一堆(17)master二进制文件提交到.java分支,可能是因为没有正确的master

在某些时候,他们注意到,哎呀,并不想要所有这些二进制文件!所以他们更新了.gitignore并承诺了,但实际上可能并非.gitignore所有这些,所以有些仍然被跟踪。如果以前列出的文件被忽略,那么git&#34;服从提交&#34;而不是忽略指令,你得到了很多:

git rm --cached

取决于您# Changes not staged for commit: # (use "git add <file>..." to update what will be committed) # (use "git checkout -- <file>..." to discard changes in working directory) # # modified: bin/b1 以及git add中可以添加存储库内跟踪文件(覆盖忽略条目)的方式,以及制作他们&#34;上演提交&#34;并提交它们。

在任何情况下,你的.gitignore都落后两个版本,并且肯定会有一些二进制文件 - 你的master分支可能会有一个&#34;坏&#34 ; feature/mybranch(对它有一些变化)也不会忽略&#34;右边的设置&#34;二进制文件。

Git注意到您的7个二进制文件(可能使用您的功能分支功能重新构建)与.gitignore分支上签入的内容不匹配。这些将是&#34;不安全&#34;破坏(至少,就git而言)。如果/当你做master(或类似的东西)时,git会破坏它们,但你仍然没有跟踪#34;未跟踪&#34;文件,暗示不好git checkout -f master

一旦你确定在工作树中破坏任何东西是安全的 - 你已经将所有你的工作都省去了 - 你可以这样做来重新同步你的.gitignoremaster

origin/master

假设您不想在分支机构中使用二进制文件,请检查各种git checkout -f master git fetch # resync with origin in case they've fixed more stuff git reset --hard origin/master 文件并确保它们正确无误 - 您可能需要修复一些文件。然后,使用.gitignore和/或git ls-files查看索引和回购中的内容(git ls-tree要求您指定特定的树对象,例如git ls-tree查看git ls-tree HEAD:bin树中的内容(如果存在)。

删除已提交(即使已忽略)的文件,例如删除bin中的所有内容:

bin

git rm --cached -r bin 表示只删除索引中的内容),或者你可以允许git删除二进制文件。一旦你有了正确的东西&#34; git rm&#34; -ed和任何更新的--cached文件,.gitignore这些变化:

git commit

(最后,根据需要重建任何已删除的二进制文件,运行测试,在适当的情况下执行推送等)。

(您可能 希望分支机构中的$ cat bin/.gitignore * !.gitignore $ git status # On branch master # Changes to be committed: # (use "git reset HEAD <file>..." to unstage) # # new file: bin/.gitignore # deleted: bin/b1 # deleted: bin/b2 # $ git commit -m 'remove binaries, ignore them in the future' [master ac60888] remove binaries, ignore them in the future 3 files changed, 1 insertion(+) create mode 100644 bin/.gitignore delete mode 100644 bin/b1 delete mode 100644 bin/b2 二进制文件,或者您没有,但没有人修复任何.java二进制文件1}}条目等等;这就是为什么我对此不太确定。)

答案 1 :(得分:1)

  1. 您的第一个git pushmaster落后于origin/master而失败,因此无法安全推送。错误消息解释了这一点。

  2. 然后在git checkout master git pull之后origin/master无法正常工作,因为您的待更改会与来自git checkout master的传入更改发生冲突。在使用git checkout -f切换分支之前,您必须已经进行了这些挂起的更改。正如错误消息所示,您应该提交这些更改,或者存储它们。第三种选择是丢弃它们,您使用git checkout -f

  3. 进行了丢弃

    由于您执行了git pull,因此不应再有待处理的更改,git reset将起作用,除非您已进行了分阶段更改。如果您已经进行了阶段性更改,并且您确定不需要它们,那么您应该使用git reset --hard或{{1}}删除它们。但要小心,这些变化将完全丧失。

答案 2 :(得分:1)

检查你的主人

 git diff

如果没有变化,仍然会遇到同样的问题检查未跟踪的文件添加文件和存储taht文件之后拉取原始主文件并尝试再次推送

答案 3 :(得分:0)

似乎您更改了其中一个文件时发生冲突。 只需添加它们并提交,之后您就可以完成。拉后你也可能必须解决冲突然后再次提交。

我希望它有所帮助!