Как мне скопировать версию одного файла из одной ветки git в другую? - PullRequest
821 голосов
/ 21 ноября 2008

У меня есть две ветви, которые полностью объединены.

Однако после слияния я понимаю, что один файл был испорчен слиянием (кто-то другой сделал автоформатирование, га), и было бы проще перейти на новую версию в другом ветвь, а затем снова вставьте мое однострочное изменение после переноса в мою ветвь.

Так какой же самый простой способ сделать это в git?

Ответы [ 6 ]

1483 голосов
/ 21 ноября 2008

Запустите это из ветки, в которой вы хотите получить файл:

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
75 голосов
/ 18 августа 2011

Я попал на этот вопрос в похожем поиске. В моем случае я искал, чтобы извлечь файл из другой ветви в текущий рабочий каталог, который отличался от исходного местоположения файла. Ответ

git show TREEISH:path/to/file >path/to/local/file
47 голосов
/ 06 марта 2010

Как насчет использования команды извлечения:

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"
13 голосов
/ 07 июня 2015

После ответа madlep вы также можете просто скопировать один каталог из другой ветки с помощью большого двоичного каталога.

git checkout other-branch app/**

Что касается вопроса опера, если вы изменили там только один файл, то это будет нормально ^ _ ^

10 голосов
/ 29 июня 2017

1) Убедитесь, что вы находитесь в филиале, где вам нужна копия файла. например: я хочу файл подветви в мастер, поэтому вам нужно оформить заказ или должен быть в мастер git checkout master

2) Теперь извлеките только один конкретный файл из дочерней ветви в master,

git checkout sub_branch file_path/my_file.ext

здесь sub_branch означает, где у вас есть этот файл, за которым следует имя файла, которое нужно скопировать.

0 голосов
/ 08 мая 2019

Обратите внимание, что в принятом ответе первый вариант ставит весь файл из другой ветви (как был выполнен 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")
...