Git: как объединять только измененные файлы - PullRequest
2 голосов
/ 24 июня 2010

У меня следующая проблема: у нас есть большой продукт, который находится в основной ветке.Также у нас есть другие ветви, которые имеют только несколько файлов, файлы, которые относятся только к этой ветви.Каждая из этих веток представляет собой плагин для основного продукта.Так, например, когда вы получаете основной продукт, вы получаете много файлов, устанавливаете их и т. Д., А позже, когда вы решаете приобрести плагин, вы получаете пакет, содержащий только несколько файлов, и выгрузив эти файлы (и заменив исходные файлы).) вы установили плагин.

У меня есть файл payment.php в главной ветке (как и многие другие файлы).И у меня есть ветка PayPal, которая имеет только один файл, который является payment.php.Теперь я исправляю ошибку в мастере payment.php и хочу объединить это исправление в ветке paypal.Однако, когда я запускаю слияние, в эту ветку добавляются абсолютно все файлы.Таким образом, в конце ветка PayPal имеет все файлы из главной ветки.Вы случайно не знаете, как это можно исправить?Я хочу, чтобы GIT объединял файлы, которые существуют только в этой ветке, поэтому в приведенном выше примере ветка paypal должна иметь только один файл (payment.php) с исправленным исправлением ошибки.

Ответы [ 5 ]

4 голосов
/ 24 июня 2010

Вот почему важно хорошо управлять своими ветками, в частности использовать ветки тем и сливаться вверх.

Это исправление должно быть сделано в ветке тем, разветвленной от общего предка всех веток, которыепотребуется исправление, а затем объединить его как с master, так и с paypal:

x - x - x - x ------------- X (master)
|\                          |
| x - x - x ---- X (paypal) |
 \              /           /
  x (bugfix) ---------------

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

# If the bugfix commit is not at the tip of master, you can rebase to get it there:
git rebase -i <commit before the bugfix> master
# rearrange the list of commits to put the bugfix at the tip, save and quit

# Now either cherry-pick or rebase the commit to the right place
# (rebase is easier if the bugfix is actually several commits)

# Cherry-pick
# make a branch and cherry-pick
git checkout -b bugfix <SHA1 of merge base>
git cherry-pick <SHA1 of bugfix>
# remove the commit from master, assuming it's still on the tip
git checkout master
git reset --hard master^

# or rebase
# make the bugfix branch (assuming it's still on the tip)
git branch bugfix master
# and remove the commit from master (assuming it's still on the tip)
git checkout master
git reset --hard master^    # or if the bugfix is composed of n commits, master~n
# rebase the bugfix branch to the right place
git rebase --onto <SHA1 of merge base> master bugfix

Если история имеет , все, что вы можете сделать, - это cherry-выберите исправление в ветке PayPal и не забудьте исправить это в следующий раз:

git checkout paypal
git cherry-pick <SHA1 of bugfix>
1 голос
/ 24 июня 2010

Вы делаете это неправильно.Вы должны иметь все файлы в ветке.

Задача Git - отслеживать, какие файлы различаются между ветвями, а не вашими.Это своего рода один из пунктов использования VCS.

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

1 голос
/ 24 июня 2010

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

0 голосов
/ 01 октября 2012

Изоляция ваших плагинов в их собственном git-репо позволяет вам создавать их независимо от родительского проекта.

Однако, если вам нужно, чтобы они были непосредственно включены в ваш проект, последние выпуски Git (git1.7.11, июнь 2012 г.) включают в себя сценарий поддерева git (ранее , разработанный на GitHub apenwarr , теперь объединены в основной файл git)

Таким образом, вы можете объединить одно хранилище (и его историю) с другим, оставив возможность извлекать его историю позже (в отличие от слияния поддерева).
Это можно рассматривать как альтернативу подмодулям git.

Еще одна альтернатива - git slave , для обеспечения тесной синхронизации родительского репо и подмодулей.

0 голосов
/ 24 июня 2010

Вы можете сделать что-то похожее на это: http://nvie.com/git-model

(надеюсь, это сработает)

master будет оставаться вашей основной веткойВы создаете вторую ветку от мастера с именем bugfix.Вы создаете третью ветку с ошибкой под названием plugin-foo.

. В plugin-foo вы удаляете все ненужные файлы.Теперь, когда вы вносите изменения в файлы, которых нет в ветке плагина, вы делаете это в основной ветке.Все исправления попадают в ветку исправлений.Вы периодически сливаете ветку исправления ошибок как в основную ветку, так и в ветку плагина.Что приводит к исправлению ошибок в обеих ветвях.

...