Как скопировать версию одного файла из одной ветки git в другую?

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

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

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

Обратите внимание, что в принятом ответе первое решение вносит изменения, а второе - нет. stackoverflow.com/a/56045704/151841

user151841 08.05.2019 20:01
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1 054
1
360 929
7
Перейти к ответу Данный вопрос помечен как решенный

Ответы 7

Ответ принят как подходящий

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

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

Но не перезапишет ли это все ваши изменения в мастере?

Martin 02.02.2010 14:46

Да, было бы. Но это было целью вопроса.

Ikke 02.02.2010 14:54

Вероятно, очевидно, но вам нужно использовать полное имя файла ... Подстановочные знаки не работают!

Chris Hart 06.09.2011 02:03

Есть ли такой удобный способ «скопировать» файл из определенного коммита (не из ветки, как показано в этом ответе)?

milushov 17.02.2013 16:25

хотя .. это тоже хороший способ: git show commit_id: path / to / file> path / to / file

milushov 17.02.2013 16:29

@Chris Hart Подстановочные знаки не работают, но относительные пути работают. Полное имя файла не всегда необходимо :)

Triptych 01.08.2013 22:10

удаленный: git checkout origin / otherbranch myfile.txt

Roman Rhrn Nesterov 04.10.2013 15:25

@ user1448031 по запросу, я полагаю, вы имеете в виду, что файл существует в удаленной ветке? git checkout <remote_name>/<branch_name> <file> должен работать (git checkout upstream/foo myfile.txt должен «вытащить» myfile.txt из исходного репозитория разветвленного репо в ваш локальный в текущей ветке).

Jakob Jingleheimer 03.09.2014 02:54

Есть ли способ сказать git не обрабатывать файлы, показанные таким образом? Я просто хочу, чтобы он обновлял мою рабочую копию, а не индекс.

erikprice 10.11.2014 18:05

Для будущих недосыпающих людей не забудьте полный путь к файлу: git checkout otherbranch path/to/myfile.txt.

jefflab 06.02.2015 06:12

Это решение отлично подходит для зафиксированных файлов, но есть ли способ скопировать рабочий файл в новую ветку? Конечно, дилемма состоит в том, что вы вынуждены фиксировать или хранить файл, прежде чем сможете переключать ветки. Иногда я нахожусь в процессе написания кода и вижу выгоду от помещения текущей рабочей версии этого файла в другую ветку.

Mark Salvatore 24.06.2015 17:28

@jefflab, согласно быстрому тесту с v2.3.3, достаточно указать только относительный путь. Более того, предполагая, что каталог такой же, необходимо указать как минимум только имя файла.

Acumenus 09.07.2015 04:29

Должен ли я после выполнения проверки явно отключить HEAD, чтобы я мог повторно добавить и зафиксировать для включения в свое собственное сообщение фиксации?

Srini 05.04.2016 20:43

Использование подстановочных знаков действительно работает, вам просто нужно обернуть их '', чтобы они не интерпретировались оболочкой.

Wiktor Czajkowski 21.05.2018 18:06

Вы сэкономили день!

Herve Mutombo 13.07.2018 14:51

Это замечательно, но, похоже, не работает для удаленных файлов. Например, предположим, что у вас есть ветки a и b с идентичными папками foo/ (и идентичным содержимым папки): если вы удалите файл из папки foo/ в ветке a, а затем checkout a foo/ в ветке b (в которой есть тот же файл), никаких изменений не произойдет. применено: файл останется на месте в ветке b.

djvg 19.10.2018 10:25

Если между обеими ветвями есть промежутки, создаст ли это действие конфликты позже, если вы объединитесь?

Ben Carp 07.05.2019 15:28

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

  git diff --stat "$branch"
  git checkout --merge "$branch" "$file"
  git diff --stat "$branch"

примечание слияние (2-я команда) не может работать, если файл не существует в обеих ветвях

simpleuser 23.05.2014 22:18

Хм. У меня нет diffstat. Это конкретная версия инструмента сравнения, потому что я никогда о нем не слышал (и должен ли я переключиться на него?): D

dudewad 19.06.2015 23:32
git diff поддерживает аргумент --stat, который в основном делает то же самое, что и diffstat.
hlovdal 01.07.2016 11:33

Мне пришлось проверить обе ветки локально, чтобы это работало.

UnitasBrooks 22.03.2017 02:10

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

git show TREEISH:path/to/file > path/to/local/file

Цель «git show» - выводить данные на терминал в удобочитаемом формате, который не гарантирует точное соответствие содержимому файла. Так же, как лучше скопировать текстовый документ целиком, а не пытаться скопировать и вставить его содержимое в другой документ.

Gonen 14.08.2014 11:46

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

isaaclw 14.10.2014 21:32

git diff <other branch> <path to file> подходит для сравнения содержимого перед оформлением заказа.

Randall 11.03.2016 23:10

@Gonen: Начиная с версии git 2.21.0, на странице руководства "git show" написано: "Для простых BLOB-объектов отображается простое содержимое". Я не уверен, означает ли это, что мы всегда в порядке Я немного опасаюсь получать изображение таким образом ...

hibbelig 22.04.2019 17:42

Следуя ответу madlep, вы также можете просто скопировать один каталог из другой ветки с каталогом blob.

git checkout other-branch app/**

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

Обратите внимание, что сначала необходимо правильно вытащить обе ветви или использовать origin/other-branch для ссылки на ветку репо. Основы, но укусил меня. (ответ отличный - редактирования не требуется)

akauppi 22.07.2015 10:35

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

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

git checkout sub_branch file_path/my_file.ext

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

Очень удобно и хорошо объяснено.

Abk 09.09.2019 14:45

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

Я получаю "feature-B не файл", имя ветки идет первым, об этом -> "> directory / somefile.php" может ли это изменить кодировку файла?

Tiago Oliveira de Freitas 29.01.2020 15:33

Я бы использовал git restore (доступно с git 2.23)

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


Почему лучше других вариантов?

git checkout otherbranch -- path/to/myfile.txt - копирует файл в рабочий каталог, а также в промежуточную область (эффект аналогичен тому, как если бы вы скопировали этот файл вручную и запустили на нем git add). git restore не касается промежуточной области (если это не указано в опции --staged).

git show otherbranch:path/to/myfile.txt > path/to/myfile.txt использует стандартное перенаправление оболочки. Если вы используете Powershell, может возникнуть проблема с включением текста или вы можете получить битый файл, если это двоичный. С git restore изменение файлов выполняется исполняемым файлом git.

Еще одним преимуществом является то, что вы можете восстановить всю папку с помощью:

git restore --source otherbranch path/to

или с git restore --overlay --source otherbranch path/to, если вы не хотите удалять файлы. Например, если на otherbranch меньше файлов, чем в текущем рабочем каталоге (и это файлы отслеживаются), без опции --overlaygit restore удалит их. Но это хороший стандарт по умолчанию, вы, скорее всего, хотите, чтобы состояние каталога было «таким же, как в otherbranch», а не «таким же, как в otherbranch, но с дополнительными файлами из моей текущей ветки»

Хороший ответ. Есть ли способ git restore скопировать файл из исходной ветки в файл новый в целевой ветке? С помощью git show я могу сделать это с помощью перенаправления оболочки (git show otherbranch:path/to/file1.txt > path/to/file2.txt), но я хочу избежать перенаправления оболочки по причинам, которые вы упомянули.

AdmiralAdama 18.05.2020 19:13

@AdmiralAdama не совсем. И думаю, что в git restore нет больших шансов получить его (но кто знает;)). Эти проблемы с перенаправлением в основном являются проблемой Powershell, не уверен, есть ли проблема с какой-либо другой оболочкой. Обычно я возвращаюсь к «git bash» или даже к «cmd», где мне нужно использовать команды «git show с перенаправлением». Или используйте графический интерфейс, например GitExtensions, где вы можете просмотреть дерево файлов фиксации и нажать «Сохранить как» для любого файла.

Mariusz Pawelski 18.05.2020 21:41

Ах я вижу. Я не использую Powershell, поэтому, возможно, перенаправление оболочки для меня np. Спасибо за информацию.

AdmiralAdama 19.05.2020 19:30

Другие вопросы по теме