Как мне исправить мое локальное репо, чтобы я мог сохранить работу из коммитов, которые не были отправлены в главное git репо? - PullRequest
0 голосов
/ 21 июня 2020

Вероятно, я мог бы найти способ сделать следующее, но я бы предпочел сделать это «правильным» способом.

Вот результат ветки и статуса:

docker@noakland:~/stacks$ git branch
* master
docker@noakland:~/stacks$

docker@noakland:~/stacks$ git status
On branch master
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
  (use "git pull" to merge the remote branch into yours)

nothing to commit, working tree clean
docker@noakland:~/stacks$ 

git tree = git log --graph --decorate --pretty = format: '% C (полужирный желтый)% h% Cred% cr% C (полужирный синий) (% an) % C (полужирный голубой)% d% Creset% s '--abbrev-commit --all

git дерево дает:

* f3d7b51 65 minutes ago (Mike) (HEAD -> master) feeder
* 12778e1 79 minutes ago (Mike) feeder test
| * d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
|/  
* 7365aca 5 days ago (Mike) restore snapshot image

Коммиты 12778e1 и f3d7b51 были не помещены в центральное репо.

Я хочу обновить до d829803 и применить изменения в коммитах 12778e1 и f3d7b51 как новый фиксация появляется поверх d829803. Я хочу сохранить только 3 файла, поэтому я отменю / верну изменения в эти файлы из d829803.

Я думаю Я хочу, чтобы мое дерево выглядело примерно так это (хотя не уверен в именах веток)

 * abcdef9 10 seconds ago (Mike) (HEAD -> master) feeder
 * d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
 * 7365aca 5 days ago (Mike) restore snapshot image

Итак, как я могу обновить до d829803, выбрать изменения из не нажатых коммитов, вручную вернуть изменения в файл abc.txt @ d829803, а затем избавьтесь от 12778e1 и f3d7b51, чтобы они не попадали в главное репо и не существовали в локальном репо?

С hg это было бы просто:

hg update d829803
hg revert -r 12778e1 —-all
hg revert -r f3d7b51 —-all
hg revert -r d829803 abc.txt
hg commit -m “manually cherry picked”
hg strip 12778e1
hg strip f3d7b51
hg push

1 Ответ

0 голосов
/ 21 июня 2020

Итак, я расскажу вам, как я это сделаю. Операция, которую вы хотите выполнить, называется перебазированием, и она очень полезна в ситуациях, когда вам нужно переписать историю, особенно когда вы хотите, чтобы ветка изменила свое происхождение.

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

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

  1. Во-первых, понимание состояния. Ваше исходное состояние:
  • master указывает на f3d7b51
  • origin/master указывает на d829803
  • d829803 служит root, где оба разошлись. При перемещении веток туда и сюда важно знать новый root.

Вы должны sh, как я понял, объединить f3d7b51 и 12778e1, чтобы они отображались как одна фиксация. Эта операция внутри rebase называется squa sh. Мы расскажем об этом чуть позже.

Чтобы сделать перебаз, я рекомендую его интерактивную версию. В терминале выполните:

git checkout master
git rebase -i origin/master #this is commit d829803

Ваш терминал откроет текстовый редактор или спросит вас, какой из них вы хотите использовать. Это простое редактирование текста, которое мы будем выполнять, поэтому выберите то, что вам удобно.

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

Помните squa sh? Если мое предположение верно, вам нужно изменить «команду» рядом с фиксацией ha sh в этой операции редактирования, заменив «pick» на «squa sh». Это объединяет оба коммита, как если бы они были одним. Также соблюдается порядок изменений (если вы не перемещаете строки вверх и вниз).

Итак, ваша перебазировка должна изначально выглядеть так:

pick 12778e1  feeder test
pick f3d7b51  feeder

# operation  hash  commit message

Вы можете, затем объедините фиксирует и даже изменяет сообщение:

pick 12778e1  implement feeder
squash f3d7b51  feeder

Вот что произойдет, когда вы сохраните файл и выйдете из редактирования:

  • git перемотает и go в origin / master (aka d829803)
  • различие будет представлено в редакторе, чтобы вы могли редактировать последовательность, изменять сообщение, изменять sh или даже удалять коммиты из истории.
  • при сохранении и выходе git применит 12778e1, а затем f3d7b51, в этом порядке, создавая одну фиксацию с другим ha sh и сообщением implement feeder
  • Ваше дерево будет выглядит так:
* ab46d2a 65 minutes ago (Mike) (HEAD -> master) implement feeder
|
* d829803 3 days ago (Mike) (origin/master, origin/HEAD) tmp
|  
* 7365aca 5 days ago (Mike) restore snapshot image

Если вы wi sh удаляете 12778e1, просто удалите эту строку при редактировании.

Конфликты

Если вы есть конфликт, операции будут приостановлены, git предупредит вас о конфликтующих файлах.

В этом sc enario вы можете разрешить их или отменить. Для отмены просто используйте git rebase --abord.

Решение просто переходит к этим файлам, объединяя их, чтобы получить необходимые изменения из конфликтующих коммитов, выполняя git add и git commit. Чтобы продолжить перебазирование, используйте git rebase --continue

Ссылки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...