Как объединить подкаталог в git?
Можно ли объединить только изменения для подкаталога из локальной ветки git в удаленную ветвь git или это все или ничего?
Например, у меня есть:
branch-a
- content-1
- dir-1
- content-2
и
branch-b
- content-1
- dir-1
- `content-2
Я хочу только объединить содержимое ветки -dir-1 с содержимым ветки-b dir-1.
Ответы
Ответ 1
Как альтернатива SO-запросу "Как слить выборочные файлы с помощью git -merge?, я просто нашел этот поток GitHub, который может быть более приспособлен для слияния целого подкаталога на основе git чтения дерева
-
Мой репозиторий = > cookbooks
Мой целевой каталог репозитория = > cookbooks/cassandra
-
Удаленный репозиторий = > infochimps
Удаленный источник репозитория, который я хочу объединить в cookbooks/cassandra
= > infochimps/cookbooks/cassandra
Вот команды, которые я использовал для их объединения
- Добавить репозиторий и получить его
git remote add -f infochimps git://github.com/infochimps/cluster_chef.git
git merge -s ours --no-commit infochimps/master
- Объединить только
infochimps/cookbooks/cassandra
в cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
git commit -m 'merging in infochimps cassandra'
Добавление
Это странно, [edit me] но шаг read-tree
может завершиться следующим образом:
error: Entry 'infochimps/cookbooks/cassandra/README' overlaps with 'cookbooks/cassandra/README'. Cannot bind.
... даже если оба файла идентичны. Это может помочь:
git rm -r cassandra
git read-tree --prefix=cassandra/ -u infochimps/master:cookbooks/cassandra
Но не забудьте проверить вручную, что это делает то, что вы хотите.
Ответ 2
В моем примере предположим, что у вас есть ветвь "источник" и "конечный пункт" ветки, которые оба отражают собственные версии восходящего потока (или нет, если только локальные) и тянутся к последнему коду. Пусть говорят, что я хочу, чтобы подкаталог в репо назывался newFeature, который существует только в ветки "source".
git checkout destination
git checkout source newFeature/
git commit -am "Merged the new feature from source to destination branch."
git pull --rebase
git push
Значительно менее запутанный, чем все остальное, что я видел, и это отлично сработало для меня, найденный здесь.
Обратите внимание, что это не "реальное объединение", поэтому у вас не будет информации о фиксации newFeature в ветке назначения, а только изменения файлов в этом подкаталоге. Но так как вы, вероятно, собираетесь объединить всю ветку назад позже или отбросить ее, это может не быть проблемой.
Ответ 3
Я получил это из темы форума в Eclipse и работал как шарм:
git checkout source-branch
git checkout target-branch <directories-or-files-you-do-**NOT**-want>
git commit
git checkout target-branch
git merge source-branch
Ответ 4
create git repo содержит как ветку-a, так и ветку-b
git checkout branch-a
git diff branch-b dir-1 > a.diff
patch -R -p1 < a.diff