it-swarm.com.de

Übertragen einer Datei in einen anderen Zweig ohne Auschecken

Ist es möglich, eine Datei in einem Git-Zweig festzuschreiben, ohne diesen Zweig auszuchecken? Wenn das so ist, wie?

Grundsätzlich möchte ich in der Lage sein, eine Datei in meinem Github Pages-Zweig zu speichern, ohne ständig den Zweig zu wechseln. Irgendwelche Gedanken?

Update: Es ist nicht möglich zu tun, was ich will (siehe Kommentare unten für den Anwendungsfall). Am Ende habe ich mein aktuelles Verzeichnis programmgesteuert in ein tmp-Verzeichnis geklont, dann meinen Zweig in diesem tmp-Verzeichnis ausgecheckt (wirkt sich nicht auf mein Arbeitsverzeichnis aus) und meine Dateien in das tmp-Verzeichnis kopiert. Wenn ich fertig bin, gehe ich zurück in mein Arbeitsverzeichnis und lösche das tmp-Verzeichnis. Zum Kotzen, aber es ist die einzige Möglichkeit, Dateien an einen anderen Zweig zu übertragen, ohne den aktuellen Arbeitszweig des Arbeitsverzeichnisses zu ändern. Wenn jemand eine bessere Lösung hat, können Sie diese gerne unten hinzufügen. Wenn es besser ist als "es geht nicht", akzeptiere ich deins.

30
Schneems

Es ist nicht möglich.

Die Änderungen, die Sie festschreiben, beziehen sich auf die aktuelle Arbeitskopie. Wenn Sie einen Commit für einen anderen Zweig ausführen möchten, bedeutet dies, dass Sie Änderungen von Ihrer Arbeitskopie übernehmen, diese jedoch von einem anderen Kopierstatus aus übernehmen können.

Dies ist keine natürliche Art und Weise, Ihre Arbeit zu versionieren. Aus diesem Grund müssen Sie verschiedene Schritte ausführen (Änderungen am Stash, Auschecken des Zweigs, Pop-Stash und Festschreiben), um dies zu erreichen.

Für Ihren speziellen Anwendungsfall können Sie auf einfache Weise zwei Kopien Ihrer Arbeit aufbewahren, eine im Zweig master und die andere im Zweig pages.

Fügen Sie in der Arbeitskopie pages die Kopie master als Remote-Repo hinzu.

  • Sie übergeben Seiten für master
  • Ziehen Sie von master auf die pages-Kopie
  • Push to GitHub
  • setzen Sie den Hauptzweig auf seinen vorherigen Zustand zurück.
17
CharlesB

Dies kann durch erneutes Implementieren von git commit geschehen.

Dies kann mit verschiedenen Aufrufen von git hash-object erfolgen

Dies ist jedoch schwer zu erreichen.

Bitte lesen Sie Progit Kapitel 9 für weitere Details und ein vollständiges Beispiel für die Simulation eines Commits.

11
p'tit fred

Wie mehrere andere gesagt haben, ist es buchstäblich möglich, aber unpraktisch.

Ab Git 2.5 (mit einigen wichtigen Fixes in 2.6 und kleineren seitdem) gibt es jedocheine praktische Methode, um dies mit git worktree add zu tun.

Nehmen wir zum Beispiel an, Sie möchten die Zweige main und doc "gleichzeitig" oder die Zweige develop und test "gleichzeitig" bearbeiten, aber die beiden fraglichen Zweige enthalten absichtlich unterschiedliche Dinge. (Beispielsweise enthält der Zweig doc eine Dokumentation, die außerhalb oder neben dem Code vorhanden ist, oder der Zweig test enthält Tests, die für den Code ausgeführt, aber nicht verteilt werden, oder bei denen Fehler erwartet werden, für die Tests absichtlich übersprungen werden develop Seite oder was auch immer.)

Anstatt nur:

git clone -b develop <source> theclone

gefolgt von der Arbeit in theclone mit ständigem Hin- und Herwechseln zwischen den beiden Zweigen würden Sie:

git clone -b develop <source> theclone

aber dann:

cd theclone
git worktree add ../ct test  # check out branch test in ../ct

oder nur:

git worktree add ../test     # check out branch test in ../test

Jetzt können Sie Ihre Tests in ../test ausführen, während Sie in theclone entwickeln. Sie können Änderungen auf die übliche Weise von einem Zweig zum anderen zusammenführen und/oder neu zusammenfassen: Das zugrunde liegende Repository ist bereits freigegeben, sodass kein git Push oder git fetch erforderlich ist. Sie haben einfach both branches ausgecheckt, und zwar in zwei separaten Arbeitsbäumen mit den Namen theclone und test von der obersten Ebene.

9
torek

Solange sich in Ihrem aktuellen Index nichts von Ihrem HEADunterscheidet, das Sie behalten möchten, können Sie so etwas tun. (Wenn Sie Ihren Index beibehalten möchten, können Sie die Umgebungsvariable GIT_INDEX_FILE vorübergehend exportieren, um für die Dauer dieser Befehle auf eine temporäre Datei zu verweisen.)

# Reset index and HEAD to otherbranch
git reset otherbranch

# make commit for otherbranch
git add file-to-commit
git commit "edited file"

# force recreate otherbranch to here
git branch -f otherbranch

# Go back to where we were before
# (two commits ago, the reset and the commit)
git reset [email protected]{2}

Wir haben otherbranchnoch nie ausgecheckt und unsere Arbeitsbaumdateien wurden nicht berührt.

8
CB Bailey

Derzeit gibt es keinen einzigen Befehl, um dies zu tun. Es gibt jedoch mindestens zwei weitere Optionen.

  1. Sie können die Github-API verwenden, um das Commit zu erstellen. Dieser Beitrag Details Erstellen eines Commits in einem Github-Repo.

  2. Erstellen Sie Github-Seiten als Submodul .

  3. Verwenden Sie eine Reihe von Installationsbefehlen, um das Commit zu erstellen.
    Das Git-Buch enthält eine Beschreibung der Installationsbefehle, die zum Erstellen eines Commits verwendet werden

hinweis: der befehl ist jetzt mktree und nicht mk-tree

3
codingFoo

Ich kann nicht zustimmen, dass es nicht möglich ist. Durch Mischen von git stash Push, git stash pop, git checkout, git checkout, git add und git commit ist dies möglich.

Wie ich das Problem verstehe:

Sie befinden sich auf dem Zweigmaster und haben einige Änderungen an der Datei patched.txt vorgenommen. Sie möchten diese Datei auf einen anderen Zweig übertragen.

Was Sie tun möchten, ist:

  • speichern Sie alle Änderungen in diesem Repo, indem Sie git stash ausführen
  • checkout file.txt from stashed stack
  • füge die Datei patched (und nur diese Datei) zu einem neuen Zweig hinzu
  • kehre zum Repo-Zustand zurück, bevor du file.txt modifizierst

Dies kann durch Ausführen der folgenden Befehle erreicht werden:

destBranch=patch
thisBranch=master
FileToPutToOtherBranch="file1.txt file2.txt 'file with space in name.txt'"
message="patched files $FileToPutToOtherBranch"
                                                                                  #assumption: we are on master to which modifications to file.txt should not belong
git stash &&\                                                                     #at this point we have clean repository to $thisBranch
git checkout -b $destBranch &&\           
git checkout [email protected]{0} -- $FileToPutToOtherBranch &&                              #if there are many files, repeat this step                                         #create branch if does not exist (param -b)
git add $FileToPutToOtherBranch &&\                                               # at this point this is equal to git add . --update
git commit -m "$message" &&\
git checkout $thisBranch &&\
git stash apply &&\                                                               # or pop if want to loose backup
git checkout $thisBranch -- $FileToPutToOtherBranch                               # get unpatched files from previous branch

Der Grund, warum ich "&&" verwende und das Ende ist, wenn jemand dieses Snippet kopieren und in das Terminal einfügen wird, selbst wenn ein Fehler auftritt, werden die nächsten Befehle ausgeführt, was nicht gut ist.\dient dazu, Shell darüber zu informieren, dass der Befehl in der nächsten Zeile fortgesetzt wird.

Um dies zu beweisen, stelle ich eine Testumgebung für dieses Snippet bereit

mkdir -p /tmp/gitcommitToAnyBranch && cd /tmp/gitcommitToAnyBranch &&\
git init 
echo 'this is master file' > file1.txt
echo 'this is file we do not want to have modified in patch branch because it does not     patches any feature' > docs.txt
git add file1.txt && git commit -m "initial commit" 
echo 'now this file gets patched' > file1.txt
git status

Nun, wenn Sie mein Skript mit Parametern ausführen

destBranch=patch
thisBranch=`git rev-parse --abbrev-ref HEAD`
FileToPutToOtherBranch="file1.txt"
message="patched file $FileToPutToOtherBranch"

file1.txt wird nur im Patch-Zweig geändert. Weitere Informationen finden Sie unter gitk --all.

3
test30

Ich habe ein kleines Tool erstellt, das genau das macht: https://github.com/qwertzguy/git-quick

Hiermit können Sie bestimmte Dateien aus einem anderen Zweig bearbeiten, ohne den anderen Zweig vollständig auszuchecken (nur die Dateien, die Sie bearbeiten möchten) und sie festschreiben. All dies, ohne Ihre Arbeitskopie oder Ihren Staging-Bereich zu beeinträchtigen.

Hinter den Kulissen wird eine Kombination aus Git Work Tree und Sparse Checkout verwendet. Die Quelle ist ziemlich klein, so dass Sie durchlesen können.

1
qwertzguy

Wenn Sie versehentlich Änderungen an der falschen Verzweigung vorgenommen haben, führen Sie die folgenden einfachen Schritte aus:

  1. Übernehmen Sie diese Änderungen.
  2. Füge sie in den rechten Zweig ein.
  3. Überprüfen Sie den Zweig, in dem Sie sich zuerst befanden, und setzen Sie ihn auf den vorherigen Commit zurück.
  4. Bereinigen Sie Ihre Änderungen mit "git checkout -.".

Danach sollte alles in Ordnung sein. Sie können Ihre Änderungen auch selektiv zusammenführen, zurücksetzen und bereinigen.

1
Arteymix

So mache ich es:

wenn ich eine saure Verpflichtung eingegangen bin, setzen Sie eine Verpflichtung zurück:

git reset --soft 'HEAD^'

fügen Sie die Dateien hinzu, die Sie hinzufügen möchten

git add .

erstelle einen neuen temporären Zweig:

git checkout -b oops-temp

Übernehmen Sie Ihre Änderungen:

git commit -m "message about this commit"

Überprüfen Sie die Filiale, die Sie überprüfen wollten:

git checkout realbranch

füge den alten Zweig zusammen:

git merge oops-temp

lösche den alten Zweig:

git branch -D oops-temp
0
jordan314