Как перенести неопубликованные коммиты из одной ветки в другую? - PullRequest
0 голосов
/ 10 января 2020

Я зафиксировал свои изменения на локальном мастере и собирался создать новую ветвь функций для этих коммитов. Локальный мастер обновлен с мастером на моем пульте. Я забыл, что ветка уже существует как локально, так и на моем пульте, поэтому это произошло:

git checkout -b myFeatureBranch
fatal: A branch named 'myFeatureBranch' already exists.

Ветвь основана на старом мастере и включает пару коммитов.

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

Какой элегантный способ сделать это? Я думаю, что не очень элегантный способ будет:

  1. Извлечь старую ветвь функций
  2. Перебазировать ее на origin / master
  3. Заменить файлы, которые я редактировал самая последняя их версия (версия моего локального мастера)
  4. force pu sh (я единственный, работающий над этой веткой)
  5. мастер 'force pull', от которого избавляется мастер мои изменения, которые у меня теперь есть в ветви функций

Я нахожусь на git версии 2.18.1 (последний доступный выпуск на Centos 8) и предпочитаю использовать CLI.

Ответы [ 3 ]

1 голос
/ 10 января 2020

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

Я думаю, что первое, что нужно сделать, это прояснить ситуацию. Если вы удалили коммиты из функциональной ветки, то перебрасывать нечего. rebase это то, что вы делаете для совершения; это означает «сделать коммит (обычно с другим родителем, чем старый коммит), чей патч относительно его родителя такой же, как патч старого коммита относительно его родителя».

Когда люди говорят, что они перебазируют ветвь, они означают, что они перебазируют коммит (ы) с конца этой ветки, а затем перемещают ветку к новым копиям коммитов.

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

Но все же стоит разобраться в этих деталях, потому что если вы понимаете, что просто хотите переместить ветку без каких-либо коммитов, есть более простые способы сделать это. (Вам даже не нужно явно удалять старые коммиты; хорошо просто оставить их при перемещении ветви, если они на самом деле больше не нужны.)

Единственное предостережение в том, что если вы удалите ветку старые коммиты из ветви (будь то путем перебазирования - который заменяет эти коммиты новыми копиями - или просто перемещая ветку или любым другим способом), тогда все другие репо должны иметь дело с условием «восходящая перебазировка» (см. git перебазировать документы) и, если они сделают это неправильно, они могут отменить вашу работу.

При этом самое простое - заменить команду checkout -b на branch -f, то есть вместо создания ветвь, заставить его двигаться. С проверкой новой фиксации (как это было бы для checkout -b):

git branch -f myFeatureBranch
git push -f
# all other clones must now recover from upstream rebase
0 голосов
/ 10 января 2020

A. Если вам нужны ваши старые ветки коммитов, то вы можете просто создать другую ветку вместо myFeatureBranch:

git checkout -b myFeatureBranch2

И тогда вы можете сделать sh вашу новую ветку и делать то, что вы хотите с этой веткой ( например, дать мастеру запрос на извлечение).

B. Но если вам не нужны ваши старые ветки коммитов (ни локально, ни удаленно), вы можете удалить старую ветку и затем использовать это имя ветки:

git push -d origin myFeatureBranch
git branch -d myFeatureBranch
git checkout -b myFeatureBranch

C. Если у вас есть некоторые полезные коммиты на старом myFeatureBranch, и вы не хотите пропустить их, вы можете go перейти к этой старой ветке и перебазировать ее с помощью master (с новыми коммитами) и pu sh it:

git checkout myFeatureBranch
git rebase -i master
git push -f
git checkout master
git fetch origin
git reset --hard origin/master
0 голосов
/ 10 января 2020

Вы можете просто попытаться сбросить свою ветвь функций на master:

# from myFeatureBranch
git reset --hard master

После этого шага ваша ветвь функций будет начинаться в любой точке, в которой локальная ветвь master окажется .

Обратите внимание, что затем вам потребуется принудительно заставить pu sh ветвь сброса функции к удаленному через:

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