Создайте новую ветку и переместите коммиты после головы в новую ветку и синхронизируйте с GitHub - PullRequest
0 голосов
/ 02 октября 2018

Я не уверен, если я облажался или нет.У меня был локальный репозиторий, который выглядел так с отсоединенной головой:

enter image description here

Я пытаюсь отделить ветку devel от v0.03пометить и отделить ветку pscott-au от ветви devel.

Итак, я сделал:

git checkout master (moved head back to tip)
git branch devel
git reset --hard 0060 (this is where the HEAD was in the picture at v0.03)
git co devel
git co master

Итак, теперь у меня есть репо, похожее на это:

enter image description here

Я хочу переместить pscott-au, чтобы он разветвлялся от уровня.И тогда я хочу синхронизировать эти изменения с GitHub.Я немного растерялся относительно того, как действовать, потому что я не уверен, испортил ли я первую часть этого или нет.

Ответы [ 2 ]

0 голосов
/ 02 октября 2018

Вы выполнили полный сброс на master, чтобы переместить его назад раньше, чем origin/master (игнорируя >origin/master; я не знаю, что это такое, но это странно).

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

Чтобы ответить на ваш прямой вопрос:переместив два дополнительных коммита в ветке pscott-au в ветку devel, вы можете выполнить следующую последовательность:

git co pscott-au
git rebase devel

Этот также считается перезаписью истории, поэтому потребуетсябыть насильно подтолкнутым к GithubЕсли вы очень и очень уверены , что это то, что вы хотели, вы можете сделать это с помощью:

git push origin devel
git push -f origin master pscott-au
0 голосов
/ 02 октября 2018

Сколько бы это ни стоило, pscott-au уже ответвляется devel.Это также ветвится master.Ну, поскольку это ответвляется от всего, то есть совсем нет.: -)

Дело в том, что имена веток просто действуют как указатели на коммиты.Коммиты - это круглые круги на ваших диаграммах.

Коммиты никогда не меняются и не двигаются;их связи никогда не меняются и не двигаются.(Вы можете нарисовать их / перетащить их в разные места, но в этом случае их соединения будут перетаскиваться вместе с ними, поэтому даже если рисунок выглядит другим, он представляет один и тот же график.)

Ветвь names , с другой стороны, все время движется.Имя ветки просто запоминает один конкретный коммит , который Git называет наконечник ветки .Фиксация может быть кончиком ветви в один момент, затем где-то глубоко в ветви, или не содержаться в ветви вообще, в следующий момент.Вот что произошло, когда вы переместили имя master назад так, чтобы оно указывало на коммит, теперь тоже помеченный v0.03.

Что делает имя ветви быть именем ветви.... ну, на самом деле, это факт, что его внутреннее правописание refs/heads/<em>name</em>, но ключевой признак имени ветви состоит в том, что вы можете запустить git checkout <em>name</em>, а затем запустить различные вещи, заканчивающиеся на git commit.Команда commit делает new commit - новый раунд на графе - чье родительское соединение возвращается к коммиту, который вы извлекли ранее;и затем, в конце процесса git commit, Git настраивает имя так, чтобы оно указывало на новый коммит, который вы только что сделали!

Различные origin/* имена являются вашими локальнымиGit помнил, где имена веток в other Git-хранилище, хранящемся в GitHub, были последним, когда ваш локальный Git вызывал GitHub Git.Вы получаете их из другого Git, используя git fetch.Вы просите или говорите другому Git изменить их, используя git push, как в git push <em>flags</em> origin <em>name1 name2 ...</em>.Они выполнят запрос, если предлагаемое вами изменение - операция fast-forward .flags может включать --force, чтобы сделать его командой вместо вежливого запроса (хотя они все еще могут не подчиняться командам);это - или какой-то другой вариант, такой как --force-with-lease - требуется, если изменение, которое вы хотите сделать, является , а не ускоренной перемоткой вперед.

Изменение, которое вы хотите здесь, не являетсяперемотка вперед, поэтому вам нужно будет запустить git push --force origin devel master.Это отправит им любые новые коммиты, которые у вас есть, которых у них нет - чего нет, так что это действительно быстро - и затем прикажет им установить devel на один из этих коммитов (что они будут делать даже в качестве запроса) идайте им команду установить их master на другое (что они будут выполнять, если вы являетесь администратором этого хранилища или иным образом авторизованы согласно тем правилам, которые вы указали GitHub для обеспечения соблюдения).

Как только ваш Git знает, чтоих Git принял это новое-name-creation и master -name-change, ваш Git добавит origin/devel к вашим именам удаленного отслеживания и переместит ваш origin/master, чтобы запомнить коммит, который они согласились использовать для своихmaster.

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