перемещение зафиксированных (но не выталкиваемых) изменений в новую ветку



Я сделал довольно много работы ("Ваша ветвь опережает" origin/master " на 37 коммитов.") который действительно должен был пойти в свою собственную ветвь, а не в master. Эти коммиты существуют только на моей локальной машине и не были нажаты на origin, но ситуация несколько осложняется тем, что другие разработчики подталкивают к origin/master и я вытащил эти изменения.



как мне ретроактивно переместить мои 37 локальных коммитов на новую ветку? Основываясь на документах, он появляется это git rebase --onto my-new-branch master или ...origin/master должен сделать это, но оба просто дают мне ошибку "fatal: нужна одна ревизия". man git-rebase ничего не говорит о предоставлении ревизии rebase и его примеры не делают так, поэтому я понятия не имею, как решить эту ошибку.



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

452   9  
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 mybranch

2) Нажмите новый код филиала на удаленном сервере.

git push origin mybranch

3) выезд обратно в ветку master.

git checkout master

4) сбросьте код главной ветви с удаленного сервера и удалите локальную фиксацию.

git reset --hard origin/master

о:

  1. ответвление от текущей головки.
  2. убедитесь, что вы находитесь на мастер, не Ваша новая ветка.
  3. git reset вернуться к последней фиксации перед началом внесения изменений.
  4. git pull чтобы повторно вытащить только удаленные изменения, которые вы выбросили с помощью сброса.

или это взорвется, когда вы попытаетесь повторно объединить ветку?

в качестве альтернативы, сразу после фиксации в неправильной ветви, выполните следующие действия:

  1. git log
  2. git diff {previous to last commit} {latest commit} > your_changes.patch
  3. git reset --hard origin/{your current branch}
  4. git checkout -b {new branch}
  5. git apply your_changes.patch

Я могу себе представить, что есть более простой подход для шаги один и два.

  1. проверка свежей копии ваших источников

    git clone ........

  2. сделать ветку из нужного положения

    git checkout {position} git checkout -b {branch-name}

  3. добавить удаленный репозиторий

    git remote add shared ../{original sources location}.git

  4. получить удаленный источник

    git fetch shared

  5. оформить заказ нужной ветки

    git checkout {branch-name}

  6. слияние источники

    git merge shared/{original branch from shared repository}

для меня это был лучший способ:

  1. проверять наличие изменений и конфликтов слияния git fetch
  2. создать новую ветку git branch my-changes и нажмите на пульт
  3. изменить вверх по течению до новой созданной ветви git master -u upstream-branch remotes/origin/my-changes
  4. нажмите ваши коммиты на новую ветку вверх по течению.
  5. вернуться к предыдущему вышерасположенной 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

    Ничего не найдено.