Вопрос: Git: нажмите на другую удаленную ветку


Проблема:

Необходимо переместить изменения из локальной ветки git в другую удаленную ветку репозитория git, и эти изменения, перенесенные в ветвь, будут сравниваться с мастером, существующим в удаленном URL-адресе, и изменения будут объединены.

меры

Я до сих пор создал локальный репозиторий git,

Инициализировал простой локальный репозиторий git, используя ниже, используя команды, как показано ниже,

 git init

Добавлены существующие файлы в репо и добавлены в промежуточную область с помощью следующей команды:

MacBook-Pro: $ git add *.h
MacBook-Pro: $ git add *.m

Проверьте состояние, используя команду ниже,

MacBook-Pro: $ git status

# On branch master
# Changes to be committed:
#   (use "git reset HEAD <file>..." to unstage)
#
#   new file:   test.h
#   new file:   test.m
#

Признал их,

git commit -m"Added test base files"

Теперь создан новый ветвь с именем issue_fix,

   MacBook-Pro:$ git branch issue_fix

Начал работу над веткой, проверив ветку.

MacBook-Pro: $ git checkout issue_fix

Сделал несколько коммитов в филиале. Все было в порядке.

Теперь я в ситуации, когда мне нужно внести изменения, внесенные в ветку «issue_fix», на удаленный URL-адрес репозитория, например

    https://github.com/myaccountname/project.git

Мои изменения будут перенаправлены на имя ветви, указанное мне, или если ветвь недоступна, мне нужно создать удаленную ветку и нажать мои изменения в локальной ветви на эту.

Самые важные сдвинутые изменения будут сравниваться с мастером в указанном URL-адресе репозитория, и если все будет хорошо, он будет слит с мастером. Поэтому я всегда буду перенаправлять свои изменения только из локальной в удаленную.

Проблема возникла из-за того, что URL-адрес Clone не был указан, когда я начал с этого, был предоставлен только источник, поэтому я создал локальный репозиторий git и начал работать над этим, теперь был указан URL-адрес репозитория и попросил нажать мои изменения на ветку.

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


7


источник


Ответы:


Чтобы устранить этот фиаско (у меня были эти проблемы и раньше, они мертвы раздражают), вы можете попробовать сделать следующее:

Ваша ситуация

Основной репозиторий

A-B-C-D-E-F-G-H

Ваш репозиторий

            A'-B'-C'-D'

Где код в G равен коду в локальном A', но они не имеют одинаковой истории

Клонировать хранилище, которое вы хотите

git clone https://....

Это предоставит вам рабочую копию кода и, что более важно, также с ее историей.

Клон основного хранилища

A-B-C-D-E-F-G-H

в другой папке, чем в вашем репо

            A'-B'-C'-D'

Извлеките свою ветку функций из своего испорченного репозитория.

git fetch ../messed-up-repo

где ../messed-up-repo это путь к вашему второму хранилищу.

Это приведет к потере всех изменений из другого репо без их слияния. Причина этого в том, что ваша ветка не найдет общего предка с главной ветвью, поэтому будет сложно или, возможно, даже невозможно объединить их.

Теперь основной репозиторий будет выглядеть следующим образом:

 A-B-C-D-E-F-G-H                       # master
/
\
 ------------A'-B'-C'-D'               # messy

Создать новую ветку

git branch new-featurebranch aabbccdd

где aabbccdd это идентификатор фиксации при загрузке репозитория. Это создаст новую ветку при фиксации, которую вы скачали тогда. Чем лучше вы можете догадаться об этом ценность, тем меньше конфликтов у вас будет позже.

                -                        # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'-B'-C'-D'                 # messy

Интерактивно переустановите свою ветку на нее

git checkout messy-featurebranch
git rebase -i new-featurebranch

Это покажет редактор со списком всех коммитов в вашем филиале. Первым, вероятно, будет «Я загрузил копию кода, но не клонировал его правильно». УДАЛИТЬ, ЧТО ЛИНИЯ , Затем все остальные коммиты должны применяться плавно.

               -B'-C'-D'                 # new branch
              /
 A-B-C-D-E-F-G-H                         # master
/
\
 ------------A'                          # messy

4



Git распространяется и работает локально для большей части своих операций; не имеет значения, существует ли удаленный доступ, когда вы делаете свои ветви или комментируете локально. Он просто должен существовать, когда вы делаете толчок.

Таким образом, вы можете добавить удаленный репозиторий, а затем нажать на него свою ветку. Филиал будет создан удаленно, если он не существует.

git remote add github-repo https://github.com/myaccountname/project.git
git push github-repo issue_fix

3



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

В противном случае нет «простого способа» сделать это, но, возможно, некоторые намеки:

  1. клонировать в новый каталог основное репо https://github.com/myaccountname/project.git
  2. добавьте свою старую рабочую копию в качестве пульта: git remote add old /path/to/old/repo/ 
  3. git fetch` импортирует все ваши изменения

Теперь есть несколько вариантов, в соответствии с тем, что лучше для вас: git cherry-pick <1st sha1 you want>..<last commit (probably old/issue_fix)> кажется, соответствует вашим потребностям, но если это не так, вы можете попробовать git rebase --interactive Нильс, но у вас может быть проблема, если первая сделанная вами фиксация не была пустой фиксацией.


0