我在分支上工作,我们将其命名为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
...
答案 0 :(得分:13)
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 push和git config文档中,虽然在我的1.8.4.3文本版本中它很难阅读,我上面链接的在线版本是,如果有的话更糟糕的是: - )
当命令行未指定要使用&lt; refspec&gt;推送的内容时... 参数或--all, - mirror, - batgs选项,命令查找 默认通过咨询远程。*。推送配置,如果它 找不到,尊重push.default配置来决定推送什么 (有关push.default的含义,请参阅gitlink:git-config [1]。)
为了简化这一点,我可以告诉 2 你没有设置remote.origin.push
或push.default
,所以你得到了&#34;默认默认&#34;,称为matching
,这意味着您的git push
在隐喻互联网电话上调出origin
并说
嘿,你有什么分支?
它说:
我有
master
和feature/mybranch
。
所以你的git然后说:
好的,好吧,这就是我认为的
master
应该是什么,以及我认为feature/mybranch
应该是什么。
他说:
哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇哇
......当你得到master
时就是这样。
所以,有几个非常简单的解决方案。
如果您仍然可以使用原始! [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
)。
master
如果你跑:
push
你的Git和起源的Git会有一个较短的对话。而不是你的Git问他&#34;嘿,whaddaya到了那里?&#34;然后尝试推送所有&#34;匹配&#34;分支机构,你的只会说:&#34;我有git push origin feature/mybranch
&#34;的一些更新。您feature/mybranch
背后的事实将无关紧要;你和你的Git,以及远程Git都不会看到那里。
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
的人可能已经知道所有这些内容。
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
。
一旦你确定在工作树中破坏任何东西是安全的 - 你已经将所有你的工作都省去了 - 你可以这样做来重新同步你的.gitignore
到master
:
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)
您的第一个git push
因master
落后于origin/master
而失败,因此无法安全推送。错误消息解释了这一点。
然后在git checkout master
git pull
之后origin/master
无法正常工作,因为您的待更改会与来自git checkout master
的传入更改发生冲突。在使用git checkout -f
切换分支之前,您必须已经进行了这些挂起的更改。正如错误消息所示,您应该提交这些更改,或者存储它们。第三种选择是丢弃它们,您使用git checkout -f
由于您执行了git pull
,因此不应再有待处理的更改,git reset
将起作用,除非您已进行了分阶段更改。如果您已经进行了阶段性更改,并且您确定不需要它们,那么您应该使用git reset --hard
或{{1}}删除它们。但要小心,这些变化将完全丧失。
答案 2 :(得分:1)
检查你的主人
git diff
如果没有变化,仍然会遇到同样的问题检查未跟踪的文件添加文件和存储taht文件之后拉取原始主文件并尝试再次推送
答案 3 :(得分:0)
似乎您更改了其中一个文件时发生冲突。 只需添加它们并提交,之后您就可以完成。拉后你也可能必须解决冲突然后再次提交。
我希望它有所帮助!