Как скопировать версию одного файла из одной ветки git в другую?
У меня есть две ветки, которые полностью объединены вместе.
Однако после завершения слияния я понимаю, что один файл был испорчен слиянием (кто-то сделал авто-формат, gah), и было бы проще перейти на новую версию в другой ветвь, а затем снова вставьте мое однострочное изменение после переноса его в мою ветку.
Итак, какой самый простой способ в git сделать это?
Ответы
Ответ 1
Запустите это из ветки, где вы хотите, чтобы файл в конечном итоге:
git checkout otherbranch myfile.txt
Общие формулы:
git checkout <commit_hash> <relative_path_to_file_or_dir>
git checkout <remote_name>/<branch_name> <file_or_dir>
Некоторые заметки (из комментариев):
- Используя хэш коммита, вы можете извлекать файлы из любого коммита
- Это работает для файлов и каталогов
- перезаписывает файл
myfile.txt
и mydir
- Подстановочные знаки не работают, но относительные пути работают
- Можно указать несколько путей
альтернатива:
git show commit_id:path/to/file > path/to/file
Ответ 2
В этом вопросе я столкнулся с подобным поиском. В моем случае я искал извлечение файла из другого ветки в текущий рабочий каталог, который отличался от исходного местоположения файла. Отвечать:
git show TREEISH:path/to/file >path/to/local/file
Ответ 3
Как насчет использования команды checkout:
git diff --stat "$branch"
git checkout --merge "$branch" "$file"
git diff --stat "$branch"
Ответ 4
1) Убедитесь, что вы находитесь в ветке, где вам нужна копия файла.
например: я хочу, чтобы файл дочерней ветки был мастером, поэтому вам нужно проверить или должно быть в master git checkout master
2) Теперь выберете конкретный файл только для того, что вы хотите от вспомогательной ветки до мастера,
git checkout sub_branch file_path/my_file.ext
здесь sub_branch
означает, что у вас есть этот файл, за которым следует имя файла, которое вам нужно скопировать.
Ответ 5
После ответа madlep вы также можете просто скопировать один каталог из другой ветки с помощью каталога blob.
git checkout other-branch app/**
Что касается вопроса op, если вы только изменили один файл там, это будет нормально работать ^ _ ^
Ответ 6
Обратите внимание, что в принятом ответе первая опция выводит весь файл из другой ветки (как git add...
был выполнен), и что вторая опция просто приводит к копированию файла, но не ставит изменения (как будто вы только что отредактировали файл вручную и имели выдающиеся различия).
Git скопировать файл из другой ветки, не ставя его
Постановочные изменения (например, 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
Выдающиеся изменения (не поставленные или не совершенные):
$ 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")