Git: Как поменять местами две ветки как локальные, так и удаленные (Github)

Вопрос: Может ли кто-нибудь дать простой и простой способ поменять имена на 2 ветки с Git, а Github - на удаленный репозиторий? Здесь сценарий: Я создал Dev ветку от мастера. После 1 фиксации на dev я создал ветвь exp (эксперимент). Я снова проверил Dev и сделал еще 2 фиксации. Затем я понял, что действительно хотел,

Вопрос:

Может ли кто-нибудь дать простой и простой способ поменять имена на 2 ветки с Git, а Github – на удаленный репозиторий?

Здесь сценарий:

  1. Я создал Dev ветку от мастера.
  2. После 1 фиксации на dev я создал ветвь exp (эксперимент).
  3. Я снова проверил Dev и сделал еще 2 фиксации.
  4. Затем я понял, что действительно хотел, чтобы exp была веткой, которая сделала эти 2 коммита, поэтому я бы хотел обменять exp и dev

Я новичок в этом, и я просмотрел некоторые из обучающих руководств Git и искал этот сайт и Google, но мне все еще не ясно, какой лучший или намеченный способ исправить это в Git (и особенно – с Github дистанционное репо)

Мои неудачные попытки исправить это:

Я пробовал несколько вещей и делал беспорядок – переименование локальных веток с помощью Git Extensions, но не смог получить удаленное репо Github, чтобы отразить это изменение. Я пытался создавать новые ветки, но не всегда могу заставить их задуматься как на местном, так и на удаленном (независимо от того, где я их создаю).

Я, наконец, смог получить все, что мне нужно, с помощью функции основного вытаскивания Git Extensions с помощью “Удаленных ветвей”, которая, как представляется, использует выборку с –prune – это отраженные удаленные удаления обратно на локальные, а также функцию push с некоторой силой /delete включены.

Сначала я подумал, что могу просто сбросить/переместить обе ветки (т.е. Переместить exp до dev, а затем сбросить обратно обратно на фиксацию, на которой был установлен dev (2 назад), но при попытке сброса в Git Extensions он запрашивает мне выбрать мягкий, смешанный или жесткий сброс – это заставило меня остановиться и перейти на другой маршрут, чтобы переименовать/создать новые ветки и т.д. Возможно, это был правильный трек – если да, я должен был сделать мягкий или жесткий сброс – или это не имеет значения после каких-либо открытых изменений? Я много искал на этом и даже понимал рабочий каталог, индекс и ветвь, в моем случае все еще не было ясно.

Вопрос

Должны быть лучшие способы сделать это – как я могу легко поменять местами две ветки (или переименовать 2 ветки, чтобы они эффективно свопировали), таким образом, чтобы все изменения отражались как локально, так и удаленно (на Github)?

Я был бы признателен за понимание того, почему ваш метод является правильным или простым способом. Благодарю!

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

Лучший ответ:

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

Я думаю, что проще всего сделать это, чтобы переместить коммиты, а не пытаться переименовать ветки. Одним простым способом было бы сделать вишневое выделение двух коммитов из dev на exp, а затем для удаления двух коммитов из dev

git checkout exp git cherry-pick <SHA-1 of first dev commit> git cherry-pick <SHA-2 of first dev commit>

А затем удалите две коммиты из dev:

git checkout dev git reset —hard HEAD~2

Обратите внимание, что если вы уже нажали dev на GitHub, а кто-то еще мог вытащить ветку, вы должны вместо этого вернуть две коммиты:

git checkout dev git revert A^..B

Здесь A – первая фиксация, а B – вторая фиксация. Обратите внимание, что git revert добавляет новую фиксацию, которая в этом случае будет функционально отменять две коммиты на dev которые вы хотите удалить. Таким образом, dev закончил бы с тремя коммитами, но было бы так, как если бы оба коммиты теперь на exp никогда не делались на dev.

Ответ №1

Предположим, что история фиксации описана ниже:

A—B—… master C—D—E dev | exp

Вы можете использовать команды ниже:

git checkout exp git merge dev git push origin exp git checkout dev git reset —hard head~2 git push -f origin dev

Тогда история фиксации будет:

A—B—… master C dev D—E exp

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

Примечание. Если вы сотрудничаете с другими, и в ветки dev есть новые изменения, вы можете сделать резервную копию изменений в новой ветки, таких как temp помощью git pull origin dev и git checkout -b temp origin/dev вначале. После замены локального exp как dev, вы можете выбирать или объединять изменения другими разработчиками от temp до dev.

Ответ №2

Создайте две новые ветки exp2, dev2 из exp и dev соответственно.

$ git checkout exp $ git branch exp2 # create new branch ‘exp2’ from ‘exp’ $ git checkout dev $ git checkout -b dev2 # create and checkout to ‘dev2’ branch

Удалите локальные и удаленные ветки dev и exp.

$ git branch -D dev # delete local ‘dev’ branch $ git push origin :dev # delete remote ‘dev’ branch $ git branch -D exp # delete local ‘exp’ branch $ git push origin :exp # delete remote ‘exp’ branch

Создайте новую локальную ветвь exp из dev2 и нажмите на удаленный.

# make sure you are in ‘dev2’ branch $ git checkout -b exp $ git push origin exp

Создайте новый локальный ветвь dev из exp2 и нажмите на удаленный.

$ git checkout exp2 # checkout to ‘exp2’ so, current branch is ‘exp2’ $ git checkout -b dev # create new branch ‘dev’ $ git push origin dev # push ‘dev’ branch to remote

Теперь, если все в порядке, удалите локальную exp2 и dev2. (Необязательный)

$ git branch -D dev2 # delete local ‘dev2’ branch $ git branch -D exp2 # delete local ‘exp2’ branch

Оцените статью
Добавить комментарий