Git-Push-Fehler ‘[remote rejected] master -> master (Zweig ist derzeit ausgecheckt)’

Lesezeit: 11 Minuten

Git Push Fehler remote rejected master master Zweig ist derzeit ausgecheckt
hap497

Gestern habe ich eine Frage zum Klonen eines Git Repository von einer meiner Maschinen zu einer anderen, Wie kann ich von einer anderen Maschine aus git klonen?.

Ich kann jetzt erfolgreich ein Git-Repository von meiner Quelle (192.168.1.2) zu meinem Ziel (192.168.1.1) klonen.

Aber wenn ich eine Datei bearbeitet habe, a git commit -a -m "test" und ein git pusherhalte ich diesen Fehler an meinem Ziel (192.168.1.1):

git push                                                
hap@192.168.1.2's password: 
Counting objects: 21, done.
Compressing objects: 100% (11/11), done.
Writing objects: 100% (11/11), 1010 bytes, done.
Total 11 (delta 9), reused 0 (delta 0)
error: refusing to update checked out branch: refs/heads/master
error: By default, updating the current branch in a non-bare repository
error: is denied, because it will make the index and work tree inconsistent
error: with what you pushed, and will require 'git reset --hard' to match
error: the work tree to HEAD.
error: 
error: You can set 'receive.denyCurrentBranch' configuration variable to
error: 'ignore' or 'warn' in the remote repository to allow pushing into
error: its current branch; however, this is not recommended unless you
error: arranged to update its work tree to match what you pushed in some
error: other way.
error: 
error: To squelch this message and still keep the default behaviour, set
error: 'receive.denyCurrentBranch' configuration variable to 'refuse'.
To git+ssh://hap@192.168.1.2/media/LINUXDATA/working
! [remote rejected] master -> master (branch is currently checked out)
error: failed to push some refs to 'git+ssh://hap@192.168.1.2/media/LINUXDATA/working'

Ich verwende zwei verschiedene Versionen von Git (1.7 auf dem Remote- und 1.5 auf dem lokalen Computer). Ist das ein möglicher Grund?

  • Kann jeder Oldtimer die akzeptierte Antwort auf stackoverflow.com/a/9283833/397872 ändern und den Thread ins Archiv verschieben oder so? Oder den Besitzer wechseln oder was auch immer?

    – Jacek Krysztofik

    16. September 2012 um 18:28 Uhr

  • Sie haben jetzt tatsächlich eine sichere Möglichkeit, mit Git 2.3.0 (Februar 2015) und git config receive.denyCurrentBranch=updateInstead: stackoverflow.com/a/28262104/6309

    – VonC

    1. Februar 2015 um 12:37 Uhr

  • Das ist der neue Link des Buches, das @stigi erwähnt hat: git-scm.com/book/en/v1/Git-on-the-Server

    – Abdelilah El Aissaoui

    19. August 2016 um 7:01 Uhr

  • Mögliches Duplikat von Was ist diese Git-Warnmeldung, wenn Änderungen an ein Remote-Repository übertragen werden?

    – Trevor Boyd Smith

    18. September 2018 um 16:35 Uhr

  • Aber ich verstehe nicht, warum und wie es funktioniert? Es funktioniert, ja, aber das ist alles.

    – Tilak Maddy

    20. Juni 2019 um 18:03 Uhr

Git Push Fehler remote rejected master master Zweig ist derzeit ausgecheckt
Robert Gould

Ich hatte gerade den gleichen Fehler, als ich anfing zu lernen Git. Einige der anderen Antworten sind eindeutig nichts für Git-Neulinge!

Ich werde nicht technische Begriffe verwenden, um die Idee zu vermitteln. Wie auch immer, was passiert ist, dass Sie zwei Repositories haben, eines ist das Original, das Sie zuerst erstellt haben, und das andere die Arbeit, die Sie gerade erstellt haben.

Sie befinden sich gerade in Ihrem Arbeitsrepository und verwenden die master sich verzeigen. Aber Sie sind auch in Ihrem ursprünglichen Repository bei demselben “eingeloggt”. master sich verzeigen. Da Sie jetzt im Original „eingeloggt“ sind, befürchtet Git, dass Sie etwas vermasseln könnten, weil Sie am Original arbeiten und Dinge vermasseln könnten. Sie müssen also zum ursprünglichen Repository zurückkehren und dies tun git checkout someotherbranchund jetzt können Sie ohne Probleme drücken.

  • +1 Viel hilfreicher, danke Robert. In meinem Fall machte es keinen Sinn, in ein Bare-Repo zu konvertieren. Sie müssen lediglich den Zweig, zu dem Sie pushen möchten, “deaktivieren”. Macht Sinn.

    – Eric Muyser

    1. Februar 2011 um 2:21 Uhr

  • @FMaz008: erstelle einfach einen Dummy-Zweig (git checkout -b dummy)

    – Dror Cohen

    3. April 2011 um 11:17 Uhr

  • Mann, das ist weitaus besser als die am meisten gewählte Antwort 🙂 Danke. Obwohl die andere Antwort auch einen guten Punkt macht 🙂

    – Ivan Ivanic

    12. November 2011 um 10:13 Uhr

  • Nur um das klarer zu machen, im Repo ist das das Ziel des Pushs: git checkout -b tmp. Dann im Source Repo: git push. Dann zurück ins Ziel (optional): git checkout master; git branch -d tmp

    – Hari Ehre

    19. Mai 2012 um 14:57 Uhr

  • Haris Kommentar ist das einfachste Rezept. Ich muss nur sagen, dass git zwar in vielerlei Hinsicht großartig sein kann, da es von svn oder wahrscheinlich jedem anderen rvs kommt, aber diese ganze Sache erstaunlich nicht intuitiv ist.

    – MickeyfAgain_BeforeExitOfSO

    5. Dezember 2012 um 21:50 Uhr

  • Danke. Wie kann ich mein Problem beheben? In meiner 192-Box habe ich ‘$ cd (Projektverzeichnis) $ git init $ (einige Dateien hinzufügen) $ git add .’ und dann habe ich in meiner 191-Box einen ‘Git-Klon’ gemacht und einige Dateien bearbeitet und dann versucht, ‘Git-Push’ zu machen.

    – hap497

    12. Mai 2010 um 7:24 Uhr

  • Nun, ich habe die Möglichkeiten in meiner Antwort beschrieben. Entweder können Sie zur 192-Box gehen und aus der 191-Box holen (vielleicht möchten Sie die 191-Box als benannte Fernbedienung hinzufügen – siehe git remote add box191 <191url> ), oder Sie können von der 191-Box zu einem alternativ benannten Zweig (z git push origin master:refs/heads/upload ), dann zum Feld 192 und zusammenführen (zB git merge upload ).

    – CB Bailey

    12. Mai 2010 um 7:31 Uhr

  • Sie haben jetzt tatsächlich eine sichere Möglichkeit, mit Git 2.3.0 (Februar 2015) und git config receive.denyCurrentBranch=updateInstead:stackoverflow.com/a/28262104/6309: Sie brauchen Option 2 nicht mehr.

    – VonC

    1. Februar 2015 um 12:38 Uhr

1646882292 898 Git Push Fehler remote rejected master master Zweig ist derzeit ausgecheckt
Nirgendwo, Mann

Zusammenfassung

Sie können nicht auf den einen ausgecheckten Zweig eines Repositorys pushen, da dies den Benutzer dieses Repositorys auf eine Weise durcheinander bringen würde, die höchstwahrscheinlich mit enden wird Verlust von Daten und Verlauf. Sie können jedoch auf jeden anderen Zweig desselben Repositorys pushen.

Da bei Bare-Repositories niemals ein Branch ausgecheckt ist, können Sie immer auf jeden Branch eines Bare-Repositorys pushen.

Je nach Bedarf gibt es mehrere Lösungen.

Lösung 1: Verwenden Sie ein Bare-Repository

Wie vorgeschlagen, wenn Sie auf einem Computer das Arbeitsverzeichnis nicht benötigen, können Sie in ein Bare-Repository wechseln. Um zu vermeiden, dass Sie mit dem Repository herumspielen, können Sie es einfach klonen:

machine1$ cd ..
machine1$ mv repo repo.old
machine1$ git clone --bare repo.old repo

Jetzt können Sie alles, was Sie wollen, an die gleiche Adresse wie zuvor pushen.

Lösung 2: An einen nicht ausgecheckten Branch pushen

Aber wenn Sie den Code auf Ihrer Fernbedienung überprüfen müssen <remote>, dann können Sie einen speziellen Zweig zum Pushen verwenden. Nehmen wir an, Sie haben in Ihrem lokalen Repository Ihre Fernbedienung aufgerufen origin und du bist auf branch master. Dann könntest du es tun

machine2$ git push origin master:master+machine2

Dann müssen Sie es zusammenführen, wenn Sie in der sind origin Remote-Repo:

machine1$ git merge master+machine2

Autopsie des Problems

Wenn ein Branch ausgecheckt wird, fügt das Commit ein neues Commit mit dem Head des aktuellen Branch als übergeordnetes Element hinzu und verschiebt den Head des Branch zu diesem neuen Commit.

Damit

A ← B
    ↑
[HEAD,branch1]

wird

A ← B ← C
        ↑
    [HEAD,branch1]

Aber wenn jemand zwischendurch auf diesen Zweig pushen könnte, würde der Benutzer selbst in das hineinkommen, was Git aufruft abgetrennter Kopf Modus:

A ← B ← X
    ↑   ↑
[HEAD] [branch1]

Jetzt befindet sich der Benutzer nicht mehr in Zweig 1, ohne explizit darum gebeten zu haben, einen anderen Zweig auszuchecken. Schlimmer noch, der Benutzer ist jetzt außerhalb jeder Filialeund jeder neue Commit wird einfach sein baumeln:

      [HEAD]
        ↓
        C
      ↙
A ← B ← X
        ↑
       [branch1]

Wenn der Benutzer an diesem Punkt einen anderen Zweig auscheckt, wird dieser baumelnde Commit hypothetisch zu einem fairen Spiel für Git Müllsammler.

  • Eine technische Korrektur zu “Autopsie”: Git löst sich nicht wirklich HEAD im Push-to-Repository. HEAD zeigt immer noch auf die Verzweigung, und die Verzweigung zeigt wiederum auf die neu gepushten Commits; aber das Arbeitsverzeichnis und der Index/Staging-Bereich bleiben unverändert. Wer jetzt am gepushten Repository arbeitet, muss hart arbeiten, um sich von den Auswirkungen des Pushs zu erholen: Finden Sie heraus, ob Änderungen gespeichert werden müssen, und arrangieren Sie, wenn ja, das Speichern sorgfältig.

    – Torek

    23. Februar 2014 um 15:40 Uhr

  • Um Ihrer Antwort zusätzliche Informationen hinzuzufügen, gibt es nur sehr wenige Gründe, warum Sie möchten, dass ein Remote-Repository, auf das Benutzer zugreifen, nicht leer ist. Daher ist die Verwendung eines bloßen Repositorys die beste Lösung.

    Benutzer456814

    28. Juni 2014 um 17:52 Uhr

  • Tatsächlich habe ich viele Situationen gefunden, in denen ich in ein nicht-bares Repository pushen muss, und ich verwende Lösung 2 ziemlich häufig. Außerdem ist der Branch, in den ich auf das Non-Bare-Repository drücke, in keiner Weise ein temporärer Branch, er dient einem ähnlichen Zweck wie ein Remote-Tracking-Branch.

    – Nirgendwo, Mann

    6. August 2014 um 15:32 Uhr

  • Ich habe einen GIT-Ordner auf meinem Server erstellt, der ALLE Repositories hostet, die von mehreren Benutzern mit SourceTree erstellt wurden. Ich habe eine erstellt master Repositories auf meinem lokalen PC. Ich habe die hinzugefügt remotes in den Serverordner und versuche, mein Repository auf den Server zu schieben, damit ein anderer Benutzer es ziehen/abrufen kann, um daran zu arbeiten. Ich bekomme folgenden Fehler: ! [remote rejected] master -> master (branch is currently checked out) Wie kann ich es einchecken?

    – Suche nach Wissen

    24. Februar 2015 um 18:08 Uhr


  • @SearchForKnowledge, ist dir klar, dass du genau die Frage stellst, auf die ich antworte?!

    – Nirgendwo, Mann

    28. März 2015 um 0:17 Uhr

1646882292 636 Git Push Fehler remote rejected master master Zweig ist derzeit ausgecheckt
André Holzner

Sie können diese “Einschränkung” umgehen, indem Sie die bearbeiten .git/config auf dem Zielserver. Fügen Sie Folgendes hinzu, damit ein Git-Repository gepusht werden kann, selbst wenn es “ausgecheckt” ist:

[receive]
denyCurrentBranch = warn

oder

[receive]
denyCurrentBranch = false

Der erste lässt den Push zu, während er vor der Möglichkeit warnt, den Zweig zu beschädigen, während der zweite ihn einfach stillschweigend zulässt.

Dies kann verwendet werden, um Code auf einem Server “bereitzustellen”, der nicht zum Bearbeiten bestimmt ist. Dies ist nicht der beste Ansatz, aber ein schneller für die Bereitstellung von Code.

  • Eine technische Korrektur zu “Autopsie”: Git löst sich nicht wirklich HEAD im Push-to-Repository. HEAD zeigt immer noch auf die Verzweigung, und die Verzweigung zeigt wiederum auf die neu gepushten Commits; aber das Arbeitsverzeichnis und der Index/Staging-Bereich bleiben unverändert. Wer jetzt am gepushten Repository arbeitet, muss hart arbeiten, um sich von den Auswirkungen des Pushs zu erholen: Finden Sie heraus, ob Änderungen gespeichert werden müssen, und arrangieren Sie, wenn ja, das Speichern sorgfältig.

    – Torek

    23. Februar 2014 um 15:40 Uhr

  • Um Ihrer Antwort zusätzliche Informationen hinzuzufügen, gibt es nur sehr wenige Gründe, warum Sie möchten, dass ein Remote-Repository, auf das Benutzer zugreifen, nicht leer ist. Daher ist die Verwendung eines bloßen Repositorys die beste Lösung.

    Benutzer456814

    28. Juni 2014 um 17:52 Uhr

  • Tatsächlich habe ich viele Situationen gefunden, in denen ich in ein nicht-bares Repository pushen muss, und ich verwende Lösung 2 ziemlich häufig. Außerdem ist der Branch, in den ich auf das Non-Bare-Repository drücke, in keiner Weise ein temporärer Branch, er dient einem ähnlichen Zweck wie ein Remote-Tracking-Branch.

    – Nirgendwo, Mann

    6. August 2014 um 15:32 Uhr

  • Ich habe einen GIT-Ordner auf meinem Server erstellt, der ALLE Repositories hostet, die von mehreren Benutzern mit SourceTree erstellt wurden. Ich habe eine erstellt master Repositories auf meinem lokalen PC. Ich habe die hinzugefügt remotes in den Serverordner und versuche, mein Repository auf den Server zu schieben, damit ein anderer Benutzer es ziehen/abrufen kann, um daran zu arbeiten. Ich bekomme folgenden Fehler: ! [remote rejected] master -> master (branch is currently checked out) Wie kann ich es einchecken?

    – Suche nach Wissen

    24. Februar 2015 um 18:08 Uhr


  • @SearchForKnowledge, ist dir klar, dass du genau die Frage stellst, auf die ich antworte?!

    – Nirgendwo, Mann

    28. März 2015 um 0:17 Uhr

git config --local receive.denyCurrentBranch updateInstead

https://github.com/git/git/blob/v2.3.0/Documentation/config.txt#L2155

Verwenden Sie das auf dem Server-Repository, und es aktualisiert auch den Arbeitsbaum, wenn kein nicht verfolgtes Überschreiben stattfinden würde.

Es wurde hinzugefügt Git 2.3 wie von VonC in den Kommentaren erwähnt.

Ich habe Git 2.3 kompiliert und ausprobiert. Beispielnutzung:

git init server
cd server
touch a
git add .
git commit -m 0
git config --local receive.denyCurrentBranch updateInstead

cd ..
git clone server local
cd local
touch b
git add .
git commit -m 1
git push origin master:master

cd ../server
ls

Ausgabe:

a
b

Yay, b wurde geschoben!

  • Hat dies irgendwelche Probleme mit dem Festschreiben von Änderungen, die nicht auf dem Server aktuell sind?

    – Akos

    24. Oktober 2018 um 19:06 Uhr

  • @akozi Ich bin mir nicht sicher, was du meinst, wenn du dich vor dem Ziehen lokal festlegst, verhält es sich genau wie ein traditionelles --bare Klon denke ich: --force ist erforderlich, um zu pushen, und es führt dazu, dass Sie Commits auf der Fernbedienung “verlieren”.

    – Ciro Santilli Путлер Капут 六四事

    24. Oktober 2018 um 19:09 Uhr

  • @CiroSantilli新疆改造中心六四事件法轮功 Keine Sorge. Ich habe die Bedeutung der Optionen nachgeschlagen. Ich dachte, dass updateStatt gleichbedeutend mit force ist.

    – Akos

    24. Oktober 2018 um 19:12 Uhr

  • updateInstead ist kein gültiger Wert mehr für Receive.denyCurrentBranch

    – Jeter-Arbeit

    6. Dezember 2018 um 16:38 Uhr

  • @Xalorous hast du eine Referenz? github.com/git/git/blob/…

    – Ciro Santilli Путлер Капут 六四事

    6. Dezember 2018 um 16:46 Uhr

985880cookie-checkGit-Push-Fehler ‘[remote rejected] master -> master (Zweig ist derzeit ausgecheckt)’

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy