Jak skopiować wersję pojedynczego pliku z jednej gałęzi git do drugiej?

Mam dwie gałęzie, które są w pełni połączone ze sobą.

Jednak po zakończeniu scalania zdaję sobie sprawę, że jeden plik został popaprany przez scalanie (ktoś inny zrobił auto-format, gah), i byłoby po prostu łatwiej zmienić na nową wersję w drugiej gałęzi, a następnie ponownie wstawić moją zmianę jednej linii po przeniesieniu jej do mojej gałęzi.

Więc jak najłatwiej w git to zrobić?

Author: einpoklum, 2008-11-21

7 answers

Uruchom to z gałęzi, w której chcesz, aby Plik się skończył:

git checkout otherbranch myfile.txt

Formuły ogólne:

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

Kilka uwag (z komentarzy):

  • używając skrótu commit możesz pobierać pliki z każdego commit
  • to działa dla plików i katalogów
  • nadpisuje plik myfile.txt i mydir
  • symbole wieloznaczne nie działają, ale ścieżki względne działają
  • można określić wiele ścieżek

Alternatywa:

git show commit_id:path/to/file > path/to/file
 1804
Author: madlep,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-01-03 17:11:49

Skończyło się na tym pytaniu na podobnym poszukiwaniu. W moim przypadku chciałem wyodrębnić plik z innej gałęzi do bieżącego katalogu roboczego, który różnił się od oryginalnej lokalizacji pliku. Odpowiedź :

git show TREEISH:path/to/file > path/to/local/file
 91
Author: lkraav,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-19 02:04:04

A co z poleceniem checkout:

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"
 52
Author: RzR,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-29 16:54:04

Użyłbym git restore (dostępne od git 2.23)

git restore --source otherbranch path/to/myfile.txt


Dlaczego jest lepszy niż inne opcje?

git checkout otherbranch -- path/to/myfile.txt - kopiuje plik do katalogu roboczego, ale także do miejsca postojowego (podobny efekt, jak gdyby skopiować ten plik ręcznie i wykonać git add na nim). git restore nie dotyka miejsca postoju (chyba że polecił to przez opcję --staged).

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt używa standardowego przekierowania powłoki. Jeśli używasz Powershell to może być problem z kodowaniem tekstu lub może zostać uszkodzony plik, jeśli jest to binarny. Z git restore zmiana plików odbywa się za pomocą git wykonywalnego.

Kolejną zaletą jest to, że możesz przywrócić cały folder za pomocą:

git restore --source otherbranch path/to

Lub z git restore --overlay --source otherbranch path/to, jeśli chcesz uniknąć usuwania plików. Na przykład, jeśli w otherbranch jest mniej Plików niż w bieżącym katalogu roboczym (a te pliki są śledzone ) bez --overlay opcja git restore usunie je. Ale to jest dobre domyślne bahaviour, najprawdopodobniej chcesz stan katalog ma być "taki sam jak w otherbranch", a nie "taki sam jak w otherbranch, ale z dodatkowymi plikami z mojej bieżącej gałęzi"

 51
Author: Mariusz Pawelski,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2020-12-16 08:16:14

1) Upewnij się, że jesteś w gałęzi, w której potrzebujesz kopii pliku. dla NP: chcę plik SUB gałęzi w master więc trzeba checkout lub powinien być w master git checkout master

2) Teraz sprawdź tylko konkretny plik, który chcesz z pod-gałęzi do master,

git checkout sub_branch file_path/my_file.ext

Tutaj sub_branch oznacza miejsce, w którym znajduje się plik, po którym następuje nazwa pliku, którą należy skopiować.

 22
Author: Mohideen bin Mohammed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-29 08:47:44

Po odpowiedzi madlepa możesz również skopiować jeden katalog z innej gałęzi za pomocą Blob katalogu.

git checkout other-branch app/**

Co do pytania op jeśli zmieniłeś tam tylko jeden plik to będzie działać dobrze ^_^

 18
Author: 6ft Dan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-06-06 21:29:37

Proszę zauważyć, że w zaakceptowanej odpowiedzi, pierwsza opcja etapuje cały plik z drugiej gałęzi (tak jak git add ... została wykonana), a druga opcja po prostu powoduje skopiowanie pliku, ale nie powoduje zmian (tak jakbyś właśnie edytował plik ręcznie i miał zaległe różnice).

Git copy file from another branch without staging it

Zmiany (np. git add filename):

$ 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

Zmiany zaległe "nie": {]}

$ 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")
 4
Author: user151841,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2019-05-08 17:00:40