Con Git, come posso commettere alcuni cambiamenti nella copia di lavoro ad un ramo diverso?

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

  •  12-09-2019
  •  | 
  •  

Domanda

Sto lavorando in un ramo, ed ha ottenuto una copia di lavoro con è davvero sporca. Quando si cerca attraverso i cambiamenti di commettere, volevo un paio oneliner fissa ad impegnarsi per il ramo master.

In questo caso, utilizzando git stash non è realmente aiutare, perché la mia copia di lavoro ha un sacco di altre modifiche che non si fonderà con maestro ancora.

C'è un modo più efficiente per risolvere questa situazione? (Ad esempio facendo un commit, e lo spostamento è genitore?)

È stato utile?

Soluzione 5

In base ai suggerimenti precedenti, questa è la soluzione che è venuta in mente:

Soluzione 1 con cherry-pick

Basta commettere il singolo cambiamento presso la sede stessa:

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

mossa da maestro, e cherry-pick

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

Torna nel ramo, può essere rapportati.

git checkout <branch>
git rebase master

Per ogni duplicato commit, vi verrà richiesto di digitare:

git rebase --skip

I commit duplicati vengono filtrati della patch-set nel ramo, e la storia è pulito. Il git merge finale può essere ancora fast-forward dopo tutto.

Soluzione 2, senza dover impegnare nel primo ramo

Prima di estrarre tutto per passare al maestro:

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

Poi passa a padroneggiare a commettere:

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

E torna nel ramo, può essere direttamente base di riferimento = punta del maestro:

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

Soluzione 3, fare un clone del ramo master corrente

Nel caso in cui non dispiacerebbe avere più copie di lavoro (ho sempre fatto con SVN in realtà), c'è una terza soluzione:

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.

Il setup clone viene effettuata manualmente qui perché git clone clona sempre il ramo attualmente attivo.


Per le situazioni più complesse, c'è sempre una guardia in più al sicuro con git diff > to-master.patch e git apply to-master.patch. Ciò consente una maggiore libertà di resettare tutto e provare più volte fino ad ottenere le cose a posto.

In questa situazione, abbiamo a che fare con un uno-linea di correzione in un file che esiste in entrambi i rami. Questo non darebbe alcun conflitto di unione, e permette alcune scorciatoie come checkout -m.

Altri suggerimenti

È possibile utilizzare git add -i da usare la modalità interattiva. Ci si può specificare, cosa commit e quello per saltare.

In questo modo è possibile confermare le oneliners come separato commette. Utilizzando git cherry-pick si può unirli al tuo padrone, più tardi.

Usa git add -i di scegliere ciò che si desidera impegnarsi in questo ramo, poi cambiare per master e commettere il resto.

Con add -i è possibile scegliere quali parti di quali file si desidera preparare per impegnarsi e poi commetterli, lasciando le altre parti degli stessi file dal commit.

git add -p vi porterà direttamente in modalità di patch per seguire il processo @ Arkaitz-jimenez raccomanda correttamente.

Non so se questo è ciò che si vuole, ma vorrei solo controllare l'altro ramo (che non perde modifiche non), e poi in modo selettivo il check-nelle modifiche desiderate a commettere.

Invece di usare git add -i / git add -p è anche possibile utilizzare la modalità add interattiva del git gui
(interfacce grafiche probabilmente altri Git, che sono clude commettere strumento, come ad esempio qgit, hanno questa caratteristica)

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top