Domanda

Ho due rami che sono completamente uniti insieme.

Tuttavia, dopo aver completato l'unione, mi rendo conto che un file è stato incasinato dall'unione (qualcun altro ha fatto un formato automatico, gah), e sarebbe solo più semplice passare alla nuova versione nell'altro branch e quindi reinserire il mio cambio di una riga dopo averlo portato nel mio branch.

Quindi qual è il modo più semplice in git per farlo?

È stato utile?

Soluzione

Esegui dal ramo in cui vuoi che finisca il file:

git checkout otherbranch myfile.txt

Formule generali:

git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>

Alcune note (dai commenti):

  • Usando l'hash di commit puoi estrarre i file da qualsiasi commit
  • Funziona con file e directory
  • sovrascrive il file myfile.txt e mydir
  • I caratteri jolly non funzionano, ma i percorsi relativi funzionano
  • È possibile specificare più percorsi

un'alternativa:

git show commit_id:path/to/file > path/to/file

Altri suggerimenti

Ho finito con questa domanda con una ricerca simile. Nel mio caso stavo cercando di estrarre un file da un altro ramo nella directory di lavoro corrente che era diversa dalla posizione originale del file. Risposta :

git show TREEISH:path/to/file >path/to/local/file

Che dire dell'utilizzo del comando checkout:

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

Seguendo la risposta di madlep puoi anche semplicemente copiare una directory da un altro ramo con il BLOB di directory.

git checkout other-branch app/**

Per quanto riguarda la domanda dell'op se hai cambiato solo un file, funzionerà bene ^ _ ^

1) Assicurati di essere nel ramo in cui hai bisogno di una copia del file. ad esempio: voglio un file di succursale secondario nel master, quindi è necessario effettuare il checkout o dovrebbe trovarsi nel master git checkout master

2) Ora controlla solo il file specifico che desideri dal ramo secondario al master,

git checkout sub_branch file_path/my_file.ext

qui sub_branch indica dove hai quel file seguito dal nome del file che devi copiare.

Si noti che nella risposta accettata, la prima opzione mette in scena l'intero file dall'altro ramo (come git add ... era stato eseguito) e che la seconda opzione comporta solo la copia del file, ma non mette in scena le modifiche (come se avessi appena modificato il file manualmente e avessi differenze eccezionali).

Copia il file da un altro ramo senza metterlo in scena

Modifiche messe in scena (ad es. git aggiungi nome file) :

$ git checkout directory/somefile.php feature-B

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   directory/somefile.php

Modifiche in sospeso (non messe in scena o impegnate):

$ git show feature-B:directory/somefile.php > directory/somefile.php

$ git status
On branch feature-A
Your branch is up-to-date with 'origin/feature-A'.
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   directory/somefile.php

no changes added to commit (use "git add" and/or "git commit -a")
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top