Мені потрібно застосувати зміни, введені в одній гілці, до іншої гілки. Я можу використовувати вишню для цього. Однак у моєму випадку я хочу застосувати зміни, які стосуються лише одного файлу, мені не потрібно вишукувати цілі коміри. Як це зробити?
Мені потрібно застосувати зміни, введені в одній гілці, до іншої гілки. Я можу використовувати вишню для цього. Однак у моєму випадку я хочу застосувати зміни, які стосуються лише одного файлу, мені не потрібно вишукувати цілі коміри. Як це зробити?
Відповіді:
У вас є різні варіанти залежно від того, чого ви хочете досягти:
Якщо ви хочете, щоб вміст файлу був таким самим, як на цільовій гілці, ви можете використовувати git checkout <branch> -- <filename>. Це, однак, не «вишневе» зміни, що відбулися в одному зафіксуванні, а просто прийме отриманий стан вказаного файлу. Отже, якщо ви додали рядок у коміті, але попередні комісії змінилися більше, і ви хочете лише додати цей рядок без інших змін, то замовлення - це не те, що ви хочете.
В іншому випадку, якщо ви хочете застосувати патч, введений у коміті, лише до одного файлу, у вас є кілька варіантів. Ви можете запустити git cherry-pick -n, тобто не вчиняючи цього, редагувати фіксацію (наприклад, скинути всі файли за допомогою git reset -- .та додати лише той файл, який ви фактично хочете змінити, використовуючи git add <filename>). Або ви можете створити diff для файлу і застосувати diff тоді:
git diff <branch>^..<branch> -- <filename> | git apply
Створіть patch fileі застосуйте його.
git diff branchname -- filename > patchfile
git apply patchfile
Редагувати:
Оскільки вам потрібно взяти зміни з комітки, створіть виправлення таким чином:
git show sha1 -- filename > patchfile
git diff sha1(або git diff branch- це те саме, якщо гілка вказує на один і той же хеш) буде створювати лише розріз поточного робочого каталогу стосовно цього хешу, але не те, що змінює комісію, введену самостійно.
git checkoutз назвою файлу - правильний молоток для цього цвяха. Обидва ці варіанти зайво складні.
checkoutвони не будуть працювати, оскільки це може включати інші небажані попередні зміни, а може не містити змін, внесених у поточній гілці.
Ще одна зручна річ - це отримати патч локально, а потім використовувати:
git checkout {<name_of_branch>, commit's SHA} <path to the file>
Це не збирання вишні, хоча.
У Git все готово :)
Просто використовуйте
git checkout <sha> <path-to-file>
git checkout the_branch_with_the_change the/path/to/the/file/you/want.extension
це працює, якщо ви хочете скопіювати один файл з іншої гілки в поточну робочу гілку
Це те, що ви шукаєте:
git checkout target-branch sha1 path/to/file
sha1 необов’язковий
Те, що я схильний робити, - це використовувати git ls-tree
просто роби:
git ls-tree -r <commit-id> |grep 'your filename'
# there will be output that shows a SHA1 of your file
git show ${SHA1 of your file} > 'your filename'
Це дозволить надрукувати всі назви файлів, які відповідають вашій грепі, та надасть SHA1 ключі файлів у коміті.
Git show також може використовуватися для файлів поза вашою філією. використання >з вашої оболонки для передачі виводу у файл дає результат, який ви шукаєте.