2009-05-06 10 views
18

Was würde möglicherweise einen "git push" dazu bringen, sich auf zwei Zweige zu begeben? Ich habe meine eigene Zweigstelle, an der ich arbeite, die auf dem geteilten Repo ... und einer Hauptniederlassung ist. Im Moment wollte ich nur zu meinem persönlichen Zweig drängen, der ganz gut durchging, aber es versuchte auch zu masteren und wurde abgelehnt. Sah etwas wie folgt aus:Warum schiebt Git in diesem Git Push auf zwei Zweige?

foo$ git push 
Counting objects: 38, done. 
Delta compression using 2 threads. 
Compressing objects: 100% (19/19), done. 
Writing objects: 100% (21/21), 9.73 KiB, done. 
Total 21 (delta 14), reused 0 (delta 0) 
To ssh://example.com/project.git 
    8184634..86b621e mybranch -> mybranch 
! [rejected]  master -> master (non-fast forward) 
error: failed to push some refs to 'ssh://example.com/project.git' 

Meine Config wie folgt aussieht:

remote.origin.url=ssh://example.com/project.git 
remote.origin.fetch=+refs/heads/*:refs/remotes/origin/* 
branch.master.remote=origin 
branch.master.merge=refs/heads/master 
branch.mybranch.remote=origin 
branch.mybranch.merge=refs/heads/mybranch 

Esko stellt fest, dass es sowohl drängt, weil sie in meine Config sind. Was, wenn ich zu beiden drängen will, nur nicht gleichzeitig? Wenn ich Mybranch ausgecheckt habe und ich Push drücke, dann will ich eindeutig Mybranch schieben und nicht beherrschen. Es gibt Zeiten, in denen ich den Master auschecke, den Code bearbeite und das auch übernehmen will. Gibt es eine Möglichkeit, dass beide koexistieren?

Antwort

26

Wenn git push ohne Argumente verwendet wird, werden alle lokalen Zweige mit einem entsprechenden Remote-Zweig mit demselben Namen übertragen. Da Ihr lokales Repository über die Zweige master und mybranch verfügt und auch das Remote-Repository die Zweige master und mybranch enthält, wird Git beide verschieben.

Wenn Sie nur einen Zweig schieben möchten, können Sie explizit, dass der Zweig Git sagen Sie schieben wollen: git push origin mybranch

Wenn Sie Master schieben wollen, können Sie diesen Fehler beheben, indem man zuerst vom Master ziehen. Git beklagt sich darüber, dass die Zusammenführung nicht schnell vorankommt, da jemand anders seit dem letzten Mal, als Sie vom Master abgezogen wurden, eine Commit-Anweisung an Master übergeben hat.

+0

Was passiert, wenn ich sich beide schieben will, nur nicht auf dem gleiche Zeit?Es gibt Zeiten, in denen ich einfach nur meine Mutter schieben will, und es gibt Zeiten, in denen ich meine Mutter in den Meister füge und den Meister schieben will. Was macht man in diesem Fall? – Coocoo4Cocoa

+0

Sie können den Zweig, den Sie drücken möchten, immer explizit benennen, indem Sie das Formular "git push " verwenden. Siehe http://www.kernel.org/pub/software/scm/git/docs/git-push.html –

+0

Neuere Versionen von Git ermöglichen Ihnen, dieses Verhalten anzugeben. – Dustin

3

Wenn Sie nur aktuelle Zweig drücken möchten, können Sie "git push Herkunft HEAD" oder vielleicht sogar "git push HEAD" (mit modernen git) verwenden.

Das Standardverhalten, wenn keine Refspec für Push (Sie definiert Refspec haben in der Config holen, aber nicht für Push) ist passende Refs zu drücken. Von git-push(1):

git push [...] [<Repository><Refspec> ...]

<Refspec> ...

Die special refspec: (oder +: um nicht schnelle Vorwärts-Updates zu ermöglichen) weist git an, "übereinstimmende" Zweige zu drücken: für jeden Zweig, der auf der lokalen Seite existiert, wird die entfernte Seite aktualisiert, wenn auf der entfernten Seite bereits ein Zweig desselben Namens existiert. Dies ist die Standard Betriebsart wenn keine explizite Refspec gefunden wird (dh weder auf die Kommandozeile noch ...

+0

Wenn ich "git push" mit einem neuen (er) git (sagen wir 1.6.3.1) starte, bekomme ich eine große Warnung, dass ich push.default setzen sollte oder das Repository push refspecs konfigurieren soll. Ich kann nicht für das Leben von mir herausfinden, wie man die zweite Sache macht. Google war nicht hilfreich. (Ich möchte das Reitory konfigurieren, da die potenziellen Pushers in meine Repositories mit der großen fetten Warnung verwirrt/verärgert sein werden, und ich möchte nicht, dass sie irgendetwas nach "git clone ..." konfigurieren müssen) – asjo

+2

Sie konfigurieren (einrichten) Remote. .Push, wo wäre wahrscheinlich in Ihrem Fall "Herkunft", und für die Spiegelsynchronisation zu verwenden Push-to-bare-Repository wäre "+ refs/heads/*: refs/heads/*" (und das gleiche für Tags) –