Git - failed to push some refs

Von in linux

Wer mit Git und unter­schied­li­chen Bran­ches arbei­tet, wird schon ein­mal beim Pushen über die Mel­dung “fai­led to push some refs” gestol­pert sein. Liest man sich die wei­te­ren Infor­ma­tio­nen die Git dabei lie­fert genau durch kommt man zu dem Schluss, dass übli­cher­wei­se der der­zei­tig gül­ti­ge Branch erfolg­reich über­mit­telt, gepusht wur­de, alle ande­ren Bran­ches, meist dann der Master-​Branch, aber einen Feh­ler gewor­fen haben. Ich erklä­re hier, war­um die­ses Phä­no­men auf­tritt und was man dage­gen unter­neh­men kann.

Die über­mit­tel­te Feh­ler­mel­dung könn­te zum Bei­spiel wie folgt aus­se­hen:

! [rejec­ted] mas­ter -> mas­ter (non-​fast-​forward)
error: fai­led to push some refs to …
hint: Updates were rejec­ted becau­se a pushed branch tip is behind its remo­te coun­ter­part. If you did not intend to push that branch, you may want to spe­ci­fy bran­ches to push or set the ‘push.default’ con­fi­gu­ra­ti­on varia­ble to ‘cur­rent’ or ‘upstream’ to push only the cur­rent branch.

Wie ich in dem Arti­kel Git Mer­ge with stra­te­gy recur­si­ve fai­led erklärt habe, kön­nen zwei Pro­jek­te nicht mit­ein­an­der fusio­niert wer­den, wenn anste­hen­de Ände­run­gen noch nicht über­mit­telt wur­den. Die­ser hier beschrie­be­ne Feh­ler tritt in der Regel auf, wenn zuvor im Repo­si­to­ry z.B. ein Entwicklungs-​Branch in den Mas­ter gemer­ged wur­de, die­se Fusio­nie­rung aber noch nicht lokal zur Ver­fü­gung steht. Damit ist der Master-​Branch im Repo­si­to­ry nicht mit dem loka­len Master-​Branch iden­tisch. Das Pushen schlägt fehl.

Übli­cher­wei­se kann man die­se Feh­ler­mel­dung igno­rie­ren, aller­dings hängt das davon ab, wie man Git benützt. Pusht man einen loka­len Entwicklungs-​Branch ins Repo­si­to­ry, um ihn dort in den Mas­ter zu mer­gen, ist man auf der siche­ren Sei­te, die Feh­ler­mel­dung ist nach­voll­zieh­bar und checkt man lokal nicht in den Master-​Branch aus, tut sie im Grun­de nichts zur Sache. Dar­um nervt die Feh­ler­mel­dung nur und ver­stellt ordent­lich die Sicht auf wich­ti­ge­re Vor­gän­ge.

Git stellt zur Lösung die­ses Pro­blems ein akku­ra­tes Mit­tel zur Ver­fü­gung, näm­lich die Kon­fi­gu­ra­ti­on von push.default:

warning: You can spe­ci­fy what action you want to take in this case, and avo­id see­ing this messa­ge again, by con­fi­gu­ring ‘push.default’ to:
‘not­hing’ : Do not push any­thing
‘matching’ : Push all matching bran­ches (default)
‘tracking’ : Push the cur­rent branch to wha­te­ver it is tracking
‘cur­rent’ : Push the cur­rent branch

Man kon­fi­gu­riert also Git für sei­ne Bedürf­nis­se wie folgt:
Für ein ein­zel­nes Pro­jekt:

git config push.default current

Oder glo­bal für die gesam­te Ent­wick­lungs­um­ge­bung:

git config --global push.default current

Ab sofort wird, ent­spre­chend zum obi­gen Bei­spiel, nur noch jener Branch gepusht, der gera­de aus­ge­checkt ist.

Share on Google+Share on RedditTweet about this on TwitterShare on LinkedInShare on FacebookShare on XingEmail this to someone