У меня есть две ветви, которые полностью объединены.
Однако после завершения слияния я понимаю, что один файл был испорчен слиянием (кто-то другой сделал автоформат, gah), и было бы проще перейти на новую версию в другой ветке, и затем снова вставьте мое однострочное изменение после переноса в мою ветку.
Так какой же самый простой способ сделать это в git?
Ответы:
Запустите это из ветки, где вы хотите, чтобы файл в конечном итоге:
Общие формулы:
Некоторые заметки (из комментариев):
myfile.txt
иmydir
альтернатива:
источник
''
чтобы они не интерпретировались оболочкой.Я попал на этот вопрос по аналогичному поиску. В моем случае я искал, чтобы извлечь файл из другой ветви в текущий рабочий каталог, который отличался от исходного местоположения файла. Ответ :
источник
git diff <other branch> <path to file>
работает хорошо.Как насчет использования команды checkout:
источник
git diff
поддерживает--stat
аргумент, который в основном делает то же самое, что и diffstat.1) Убедитесь, что вы находитесь в филиале, где вам нужна копия файла. Например: я хочу файл подветви в мастер, так что вы должны оформить заказ или должен быть в мастере
git checkout master
2) Теперь извлеките конкретный файл, который вы хотите из дочерней ветки в master,
Здесь
sub_branch
означает, где у вас есть этот файл, а затем имя файла, который нужно скопировать.источник
Следуя ответу madlep, вы также можете просто скопировать один каталог из другой ветви с помощью каталога blob.
Что касается вопроса ОП, если вы изменили там только один файл, это будет нормально работать ^ _ ^
источник
origin/other-branch
для ссылки на ветку репо. Основы, но укусил меня. (ответ отличный - редактирование не требуется)Я бы использовал
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
чем в текущем рабочем каталоге (и эти файлы отслеживаются ) без--overlay
опции, ониgit restore
будут удалены. Но это хорошее поведение по умолчанию, вы, скорее всего, хотите, чтобы состояние каталога было таким же, как вotherbranch
, а не "то же самое, но с дополнительными файлами в моей текущей ветке"источник
git restore
способ скопировать файл из исходной ветви в новый файл в целевой ветви? С помощью git show я могу сделать это с помощью redirection (git show otherbranch:path/to/file1.txt > path/to/file2.txt
), но я хочу избежать перенаправления оболочки по причинам, которые вы упомянули.git restore
(но кто знает;)). Эти проблемы с перенаправлением в основном являются проблемой Powershell, но не уверены, что есть какая-либо другая оболочка, которая имеет проблемы с ней. Я обычно возвращаюсь к «git bash» или даже к «cmd», где мне нужно использовать команды «git show
с перенаправлением». Или используйте графический интерфейс, например GitExtensions, где вы можете просмотреть дерево файлов коммитов и нажать «Сохранить как» для любого файла.Обратите внимание, что в принятом ответе первая опция выводит весь файл из другой ветки (как
git add ...
было выполнено), и что вторая опция просто приводит к копированию файла, но не ставит изменения (как если бы вы имели только что отредактировал файл вручную и имел выдающиеся отличия).Git скопировать файл из другой ветки, не ставя его
Постановочные изменения (например
git add filename)
:Выдающиеся изменения (не поставленные или не совершенные):
источник