Как скопировать версию одного файла из одной ветки 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")