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ć?
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
imydir
- 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
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
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"
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"
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ć.
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 ^_^
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")
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