Mit Git, wie kann befehle ich einige Änderungen in der Arbeitskopie auf einen anderen Zweig?

StackOverflow https://stackoverflow.com/questions/1840898

  •  12-09-2019
  •  | 
  •  

Frage

Ich bin in einem Zweig arbeitet, und bekam eine Arbeitskopie mit wirklich unrein. Wenn durch die Änderungen der Suche zu begehen, wollte ich ein paar Einzeiler zum master Zweig begangen werden fixiert.

In diesem Fall git stash Verwendung ist nicht wirklich helfen, weil meine Arbeitskopie viele andere Änderungen hat, die mit dem Master noch nicht fusionieren.

Gibt es eine effizientere Möglichkeit, diese Situation zu beheben? (Zum Beispiel macht ein begehen, und bewegt es Eltern?)

War es hilfreich?

Lösung 5

Auf der Grundlage der vorherigen Vorschläge, das ist die Lösung, die ich habe kommen mit:

Lösung 1 mit cherry-pick

begehen Sie einfach die einzige Änderung in der Filiale selbst:

git add --patch <files>      # record every change to move to master
git commit

Zum Master und Kirsche-Pick

git stash
git checkout master
git cherry-pick <commitid>

Zurück in der Branche, kann es indexiert werden.

git checkout <branch>
git rebase master

Für jede Dubletten begehen, werden Sie aufgefordert zu geben:

git rebase --skip

Die doppelten Commits werden aus der Patch-Set in der Branche gefiltert, und die Geschichte ist sauber. Der endgültige git merge kann immer noch sein, vorspulen nach-all.

Lösung 2, ohne zuvor in der Branche zu begehen mit

Zuerst alles extrahieren, um Meister zu bewegen:

git add --patch <files>      # record every change to move to master

Dann wechseln Sie zu meistern zu begehen:

git stash --keep-index       # clear the working copy only
git checkout master -m       # merge the index.
git commit

Und wieder in der Branche, kann es direkt an die Spitze des Master umbasiert werden:

git checkout <branchname>
git rebase master            # move to branch start to the tip of master.
git stash apply              # restore working copy, auto merges the changes

Lösung 3, stellen Sie einen Klon des aktuellen Master-Zweig

Falls Sie nicht dagegen, mehrere Arbeitskopien mit (Ich tat dies immer mit SVN tatsächlich), gibt es eine dritte Lösung:

mkdir ../newrepos
cd ../newrepos
git init
git remote add origin /path/to/your/repository
git fetch master:remotes/origin/master  # fetch remote master to local remotes/origin/master
git checkout -t origin/master           # make new "master" branch, link to remote, checkout.

git commit
git push origin master                  # inject the change in the original repository.

Der Klon Setup manuell hier getan wird, weil git clone immer den aktuell aktiven Zweig klont.


Für komplexere Situationen gibt es immer einen extra sicheren Schutz mit git diff > to-master.patch und git apply to-master.patch. Dies ermöglicht es Ihnen mehr Freiheit alles zurücksetzen, und versuchen, über, bis Sie die Dinge richtig zu machen.

In dieser Situation sind haben wir es mit einer einzeiligen fix in einer Datei, die in beiden Zweigen besteht. Dies würde keine Zusammenführung Konflikte geben, und ermöglicht es einige Abkürzungen wie checkout -m.

Andere Tipps

Sie können mit git add -i verwenden der interaktive Modus. Dort können Sie angeben, was zu begehen und was zu überspringen.

Auf diese Weise können Sie Ihre oneliners begehen als separate verpflichtet. Durch die Verwendung von git cherry-pick Sie können sie fusionieren zu deinem Herrn, später.

Verwenden git add -i zu wählen, was Sie in diesen Zweig begehen wollen, dann Master ändern und den Rest zu begehen.

Mit add -i können Sie auswählen, welche Teile, welche Dateien Sie verpflichten vorbereiten wollen und sie dann verpflichten, während verlassen andere Teile der gleichen Dateien aus dem Commit.

git add -p gelangen Sie direkt in Patch-Modus fallen der Prozess @ arkaitz-Jimenez empfiehlt richtig zu folgen.

Ich weiß nicht, ob dies ist, was Sie wollen, aber ich würde nur check out den anderen Zweig (die nicht festgeschriebene Änderungen nicht verliert) und dann in den Änderungen selektiv überprüfen Sie begehen wollen.

Statt git add -i / git add -p verwenden können Sie auch interaktiven Zusatzmodus git gui
verwenden (wahrscheinlich andere git grafische Schnittstellen, die in clude sind begehen Werkzeug, wie zum Beispiel QGit, haben diese Funktion)

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top