Перебазировать только одну папку - PullRequest
0 голосов
/ 15 марта 2019

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

Я пробовал с:

git checkout master -- <folder>

Но это переопределяет все файлы моей папки, я хотел бы иметь что-то вроде процесса ребазирования, но только с одной папкой.

Заранее спасибо

1 Ответ

2 голосов
/ 15 марта 2019

Если посмотреть только на вопрос, краткий ответ таков: не существует простого способа сделать это.Попытка перебазировать только изменения в одном каталоге работает против структуры того, как git хранит данные.

Глядя на обсуждение в комментариях, становится немного яснее, что вы пытаетесь достичь (я думаю), поэтому, возможно,мы можем собрать что-нибудь вместе.Но поймите, кажется, вы находитесь в таком положении, потому что вы и ваш коллега игнорируете функции git, которые бы этого не делали.Я имею в виду: почему вы оба работаете над одной и той же веткой, если хотите иметь возможность действовать независимо от ваших изменений?

Ну, в любом случае, у вас что-то происходит, как это

... x -- x -- x <--(master)
     \
      F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)

Я предполагаю, по крайней мере, что ваши изменения появляются в отдельных фиксациях от изменений вашего коллеги.Таким образом, F<n> представляет один из ваших коммитов, обновляя интерфейс, а B<n> представляет один из коммитов вашего коллеги, обновляя бэкэнд (сервер).

Если, по крайней мере, это так - и если ваш коммит не делаетне зависит от B коммитов и наоборот - тогда вы бы хотели конечное состояние, такое как

                F1' -- F2' -- F3' -- F4' <--(frontend)
               /
... x -- x -- x <--(master)
     \
      B1' -- B2' -- B3' <--(server)

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

Итак, на что вы надеетесь, это то, что F фиксирует измененияникогда не вступайте в конфликт с B изменениями коммитов - что, по вашему сценарию, по крайней мере правдоподобно.

Поэтому первое, что нужно сделать, - это получить список коммитов, которые необходимо перебазировать.Это можно сделать по имени автора, если вы действительно написали все коммиты F, а они написали все коммиты B.

git rev-list --author=your_name

Или это может быть сделано путем, если вы на 100% уверены, что ваши коммиты - и только ваши коммиты - затрагивают определенные пути.Таким образом, вы можете сказать

git rev-list -- path/to/frontend/code

Или вы можете вручную сканировать весь журнал (git log master..branch) и записывать коммиты, которые вы хотите.

Затем

git checkout branch
git checkout -b frontend
git rebase -i master

Это загрузит редактор с «списком задач», имеющим одну запись на коммит в branch.Удалите записи для B коммитов из списка, а затем сохраните и выйдите.Возможно, вам придется разрешить некоторые конфликты, но это должно быть сделано только для внесенных вами изменений.Тогда у вас будет

                F1' -- F2' -- F3' -- F4' <--(frontend)
               /
... x -- x -- x <--(master)
     \
      F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)

Тогда вам нужно создать ветку сервера.Вы хотите убедиться, что , а не , чтобы переместить его вперед к подсказке master, поэтому вы не можете просто перейти к master;но вы можете сделать это:

git checkout branch
git checkout -b server
git rebase -i $(git merge-base master HEAD)

На этот раз, когда появится список задач, вы удаляете коммиты F.Если есть какие-либо конфликты, это означает, что у вас и вашего коллеги действительно были совпадающие изменения, и вам придется их уладить;вы не увидите конфликтов между работой вашего коллеги и master, потому что его работа остается на месте до любых master изменений.

Тогда у вас будет

                F1' -- F2' -- F3' -- F4' <--(frontend)
               /
... x -- x -- x <--(master)
    | \
    |  B1' -- B2' -- B3' <--(server)
     \
      F1 -- B1 -- B2 -- F2 -- F3 -- F4 -- B3 <--(branch)

, и если вы захотитезатем вы можете отказаться от оригинала branch

git branch -D branch
...