Я проделал немалую работу («Ваша ветвь впереди« origin / master »на 37 коммитов».), Которая действительно должна была пойти в свою собственную ветку, а не в master
. Эти коммиты существуют только на моей локальной машине и не были переданы origin
, но ситуация несколько усложняется тем, что другие разработчики настаивали на этом, origin/master
и я внес эти изменения.
Как я могу задним числом переместить мои 37 локальных коммитов в новую ветку? Судя по документам, кажется, что git rebase --onto my-new-branch master
или ...origin/master
должен сделать это, но оба дают мне ошибку «роковая: нужна одна ревизия». man git-rebase
ничего не говорит о предоставлении ревизии, rebase
и ее примеры не делают этого, поэтому я понятия не имею, как устранить эту ошибку.
(Обратите внимание , что это не является дубликат Move существующего, неподтвержденной работа нового филиала в Git или Как объединить мои местные неподтвержденные изменения в другую ветвь Git? Так как эти вопросы решать неподтвержденные изменения в локальном рабочем дереве, а не изменения , которые совершено на местном уровне.)
Ответы:
Это должно быть хорошо, поскольку вы еще нигде не выдвигали свои коммиты, и вы можете переписать историю своей ветки после
origin/master
. Сначала я запустил бы,git fetch origin
чтобы убедиться, чтоorigin/master
это актуально. Предполагая, что вы в данный моментmaster
, вы должны быть в состоянии сделать:... который будет воспроизведен все ваши коммиты, которые не
origin/master
наorigin/master
. Действие rebase по умолчанию - игнорировать коммиты слияния (например, те, которые вы,git pull
вероятно, представили), и он просто попытается применить патч, введенный каждым из ваших коммитовorigin/master
. (Возможно, вам придется разрешить некоторые конфликты по пути.) Затем вы можете создать новую ветку на основе результата:... а затем
master
вернитесь кorigin/master
:При выполнении такого рода манипулирование ветвей с
git branch
,git reset
и т.д. Я считаю , это полезно часто смотреть на коммит графgitk --all
или подобный инструмент, просто чтобы убедиться , что я понимаю , где все разные рефов указывают.В качестве альтернативы, вы могли бы просто создать ветку темы, основываясь на том, где находится ваш мастер (
git branch new-work-including-merges
), и затем сбросить,master
как указано выше. Однако, поскольку ваша ветка темы будет включать в себя слиянияorigin/master
и вы еще не выдвинули свои изменения, я бы предложил сделать ребаз, чтобы история была более аккуратной. (Кроме того, когда вы в конечном итоге объедините ветку своей темы с главной, изменения станут более очевидными.)источник
master
; rebase переписываетmaster
ветвь так, чтобы новые коммиты были линейно сверхуorigin/master
, затемgit branch new-work
создаетnew-work
ветвь, указывающую на вершинуmaster
(текущую ветвь), не переключая текущую ветвь вnew-work
. Так что теперьnew-work
содержит все новые коммиты. Затем сброс перемещает текущую ветвь (неподвижноmaster
) обратно вorigin/master
.git reset
различными способами. Этоgit branch new-work
просто говорит: «создайте ветку, указывающую на этот коммит, пока я остаюсь в моей текущей ветке (в данном случае это master)». Таким образом, нет необходимости иметь команду, которая перемещает коммиты от мастера к новой ветви - вы просто создаете новую ветку там, и когда вы сбрасываете мастер, новая ветвь остается там, где был мастерЕсли у вас низкое количество коммитов и вам все равно, если они объединены в один мегакмит, это работает хорошо и не так страшно, как при выполнении
git rebase
:разархивируйте файлы (замените 1 на число коммитов)
создать новую ветку
добавить изменения
сделать коммит
источник
git log --all --decorate --oneline --graph
.Я застрял с той же проблемой. Я нашел самое простое решение, которым я хотел бы поделиться.
1) Создать новую ветку с вашими изменениями.
2) (Необязательно). Нажмите новый код ветки на удаленном сервере.
3) Оформить заказ обратно в главную ветку.
4) Сброс кода главной ветки с удаленного сервера и удаление локальной фиксации.
источник
Еще один способ предположить, что branch1 - это ветка с зафиксированными изменениями branch2 - желательно ветка
выберите идентификаторы коммитов, которые вам нужно переместить
Теперь верните unpressed коммиты из начальной ветки
источник
В качестве альтернативы, сразу после фиксации в неправильной ветке, выполните следующие действия:
git log
git diff {previous to last commit} {latest commit} > your_changes.patch
git reset --hard origin/{your current branch}
git checkout -b {new branch}
git apply your_changes.patch
Я могу себе представить, что есть более простой подход к первым и вторым шагам.
источник
Что о:
git reset
вернуться к последнему коммиту до того, как вы начали вносить изменения.git pull
чтобы восстановить только удаленные изменения, которые вы выбросили при сбросе.Или это взорвется, когда вы попытаетесь объединить ветку?
источник
Вот гораздо более простой способ:
Создать новую ветку
В вашей новой ветке сделайте
git merge master
- это объединит ваши зафиксированные (не отправленные) изменения с вашей новой веткойУдалите свою локальную главную ветку
git branch -D master
Используйте-D
вместо того-d
, чтобы принудительно удалить ветку.Просто сделайте в
git fetch
своей основной ветке и сделайте этоgit pull
в своей основной ветке, чтобы убедиться, что у ваших команд последний код.источник
Более простой подход, который я использовал (предполагая, что вы хотите переместить 4 коммита):
(Посмотрите в каталоге, из которого вы выполнили последнюю команду для 4
.patch
файлов)Затем:
В любом порядке, который вы хотели.
источник
Оформить свежую копию ваших источников
git clone ........
Сделать ветку из желаемой позиции
git checkout {position}
git checkout -b {branch-name}
Добавить удаленный репозиторий
git remote add shared ../{original sources location}.git
Получить удаленные источники
git fetch shared
Оформить заказ нужной ветке
git checkout {branch-name}
Слияние источников
git merge shared/{original branch from shared repository}
источник
Для меня это был лучший способ:
git fetch
git branch my-changes
и нажмите на удаленныйgit master -u upstream-branch remotes/origin/my-changes
git branch master --set-upstream-to remotes/origin/master
источник