Как я могу двигаться комбиты из багажника в ветку в Git?
-
24-09-2019 - |
Вопрос
Я сделал кучу совершает мастера и понял после того, что они должны были быть в ветке.
Я посмотрел на разные вещи о переоборевении и слиянии и сбрасывании мастера. Но никаких попыток манипуляций не дали истории, которая выглядит как то, что я пытаюсь сделать.
Мои попытки привести меня к верить, что это требует некоторой комбинации rebase --onto
а также reset --hard
Чтобы переместить мастер назад во времени. Но мое понимание разветвления Git оставляет желать желать. Часть этого - это узнать, как я могу использовать его.
Следует отметить, что нет никаких изменений, которые я пытаюсь переехать, были выдвинуты.
Текущий
* remote/trunk
--o--a--b--c--d--e--f <- master
|
o <- remote branch foo
Желаемый результат
* remote/trunk
--o <- master
|
o--a--b--c--d--e--f <- remote branch foo
Решение
Я не уверен, что переименование ветвей - это правильное решение, поскольку оно вы получите:
* remote/trunk
--M--a--b--c--d--e--f <- master
|
F <- remote branch foo
к:
--F <- master
|
M--a--b--c--d--e--f <- remote branch foo
* remote/trunk
(При условии, что вы переименуете remote/foo
, который не рекомендуется: вы должны отслеживать его первым, а затем переименовать его, но, хотя и хотя конечный результат отличается от того, что вам нужно)
Что не является «желаемым результатом», которым вы хотите (FOO должен начать с f, а не M):
* remote/trunk
--M <- master
|
F--a--b--c--d--e--f <- remote branch foo
Вы можете добиться всего этого через rebase --onto
git checkout --track -b origin/foo # create a local branch named after the remote one
git branch tmp # mark current foo HEAD to 'F'
git branch -f foo master # put foo where it should b: at 'f'
git branch -f master tmp^ # reset master to M, parent of tmp
git checkout tmp # go to where we must replay the commits
git rebase --onto tmp master foo # replay a to f on top of tmp
git svn dcommit # push the local foo in order to update remote/foo
давая вам:
* remote/trunk
--M <- master
|
F--a'--b'--c'--d'--e'--f' <- local foo and remote branch foo
Другие советы
Вариант ответа Мартина, который не обязательно будет применим к вашей ситуации, но я все равно хочу опубликовать это :)
Предположим, вы забыли создать ветку в Commit o
, так что у тебя есть:
x--y--z--o--a--b--c--d--e--f master
|
+
[forgot to make a branch here]
И тогда вы поняли, что то, что вы действительно хотели, было:
x--y--z--o master
|
+--a--b--c--d--e--f topic
Что вы можете сделать в этом случае, это создать ветвь в o
Используя это хэш:
git branch topic # creates new branch 'topic' - will be at commit `f`
git checkout o -b newmaster # creates new branch called newmaster pointing on commit `o` (please replace `o` with the actual hash)
git branch -M newmaster master # force rename newmaster to master (means master points on hash `o`)
Вы будете в главной отрасли (совершать o
), так как последний шаг вы можете:
git checkout topic
Хэш конечно может быть только первыми 5 символами ..
РЕДАКТИРОВАТЬ
Это не должно иметь значения, что вы используете git-svn
, что на самом деле имеет значение, это то, что вы не опубликовали свою главную ветку в любой момент после o
Филиал в Git действительно не что иное, как указатель для совершения. Вот почему разветвление так дешево: вы просто создаете указатель, и у вас есть ветка.
Я не знаю о отслеживании удаленных ветвей, хотя вам может потребоваться установить это после переименования / перемещения ваших ветвей.
Почти правильно, что предлагает Hasen J, но мне пришлось сделать несколько небольших модификаций (и я использую GIT-SVN):
# create the branch with your commits
git branch performance
# fork the master to a new branch at the commit before your local, non pushed commits
git branch newmaster 2d0516dfe8252de87
# checkout your branch
git checkout performance
# rename the newmaster
git branch -M newmaster master
# now checkout the master
git checkout master
Вы не можете переименовать ветвь, на которой вы находитесь, поэтому я проверил филиал производительности, где я перевел свои коммиты.