перемещение зафиксированных (но не выталкиваемых) изменений в новую ветку
Я сделал довольно много работы ("Ваша ветвь опережает" origin/master " на 37 коммитов.") который действительно должен был пойти в свою собственную ветвь, а не в master. Эти коммиты существуют только на моей локальной машине и не были нажаты на origin, но ситуация несколько осложняется тем, что другие разработчики подталкивают к origin/master и я вытащил эти изменения.
как мне ретроактивно переместить мои 37 локальных коммитов на новую ветку? Основываясь на документах, он появляется это git rebase --onto my-new-branch master или ...origin/master должен сделать это, но оба просто дают мне ошибку "fatal: нужна одна ревизия". man git-rebase ничего не говорит о предоставлении ревизии rebase и его примеры не делают так, поэтому я понятия не имею, как решить эту ошибку.
(обратите внимание, что это не дубликат перемещения существующей, незафиксированной работы в новую ветвь в Git или как объединить мои локальные незафиксированные изменения в другую ветвь Git? поскольку эти вопросы касаются незафиксированных изменений в локальное рабочее дерево, а не изменения, которые были зафиксированы локально.)
9 ответов:
это должно быть хорошо, так как вы еще не нажали свои коммиты в другом месте, и вы можете переписать историю своей ветви после
origin/master. Сначала я бы запустилgit fetch originчтобы убедиться в том, чтоorigin/master- до свидания. Предполагая, что вы в настоящее время наmaster, вы должны быть в состоянии сделать:git rebase origin/master... который будет воспроизводить все ваши коммиты, которые не находятся в
origin/masterнаorigin/master. Действие по умолчанию rebase-игнорировать коммиты слияния (например, те, которые вашgit pulls, вероятно, введен), и он просто попытается применить патч, введенный каждым из ваших коммитов наorigin/master. (Возможно, вам придется решить некоторые конфликты на этом пути.) Затем вы можете создать свою новую ветку на основе результата:git branch new-work... а затем сбросить ваш
masterнаorigin/master:# Use with care - make sure "git status" is clean and you're still on master: git reset --hard origin/masterпри выполнении такого рода манипулирования ветвями с
git branch,git resetи т. д. Я считаю полезным часто смотреть на график фиксации сgitk --allили a подобный инструмент, просто чтобы проверить, что я понимаю, куда указывают все разные ссылки.кроме того, вы могли бы просто создать ветку темы, основанную на том, где находится ваш мастер в первую очередь (
git branch new-work-including-merges) и затем сброситьmasterкак выше. Однако, поскольку ваша ветвь темы будет включать слияния изorigin/masterи вы еще не продвинули свои изменения, я бы предложил сделать ребаз, чтобы история была более аккуратной. (Кроме того, когда вы в конечном итоге объедините свою ветвь темы обратно в master, изменения будут более очевидными.)
если у вас низкое количество коммитов, и вам все равно, если они объединены в один мега-коммит, это хорошо работает и не так страшно, как делать
git rebase:unstage файлы (заменить 1 с # фиксаций)
git reset --soft HEAD~1создать новую ветку
git checkout -b NewBranchNameдобавить изменения
git add -Aсделать коммит
git commit -m "Whatever"
еще один способ предположить branch1-это ветвь с зафиксированными изменениями branch2-желательно ветка
git fetch && git checkout branch1 git logвыберите идентификаторы фиксации, которые необходимо переместить
git fetch && git checkout branch2 git cherry-pick commit_id_first..commit_id_last git pushтеперь верните незапущенные коммиты из начальной ветви
git fetch && git checkout branch1 git reset --soft HEAD~1
Я застрял с той же проблемой. Я нашел простое решение, которое я хотел бы поделиться.
1) создать новую ветку с вашими изменениями.
git checkout -b mybranch2) Нажмите новый код филиала на удаленном сервере.
git push origin mybranch3) выезд обратно в ветку master.
git checkout master4) сбросьте код главной ветви с удаленного сервера и удалите локальную фиксацию.
git reset --hard origin/master
о:
- ответвление от текущей головки.
- убедитесь, что вы находитесь на мастер, не Ваша новая ветка.
git resetвернуться к последней фиксации перед началом внесения изменений.git pullчтобы повторно вытащить только удаленные изменения, которые вы выбросили с помощью сброса.или это взорвется, когда вы попытаетесь повторно объединить ветку?
в качестве альтернативы, сразу после фиксации в неправильной ветви, выполните следующие действия:
git loggit diff {previous to last commit} {latest commit} > your_changes.patchgit reset --hard origin/{your current branch}git checkout -b {new branch}git apply your_changes.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
более простой подход, который я использую (предполагая, что вы хотите переместить 4 коммита):
git format-patch HEAD~4(посмотрите в каталоге, из которого вы выполнили последнюю команду для 4
.patchфайлы)git reset HEAD~4 --hard git checkout -b tmp/my-new-branchзатем:
git apply /path/to/patch.patchв любом порядке вы хотели.
Comments