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