Push фиксирует в другую ветку


385

Можно ли зафиксировать и перенести изменения из одной ветви в другую.

Предположим, я зафиксировал изменения в BRANCH1 и хочу перенести их в BRANCH2 .

С BRANCH1 , действительно ли это сделать:

git push origin **BRANCH2**

А потом сбросить BRANCH1?

Ответы:


712

Это почти сработает.

При переходе на ветку не по умолчанию, вам нужно указать исходную ссылку и целевую ссылку:

git push origin branch1:branch2

Или

git push <remote> <branch with new changes>:<branch you are pushing to> 

26
Есть ли и то branch1и другое branch2на пульте? Что если вы хотите перейти с локального branch1на удаленный origin branch2?
Orad

11
@orad: Нет. Первая часть на самом деле просто идентификатор для локальной фиксации; это даже не должно быть ветвью.
SLaks

6
@abhisekp: Используйте тот же синтаксис. Для ссылки на ветку исходного кода используйте<remote>/<branch>
SLaks

4
@abhisekp: Делай именно то, что я только что сказал. Текущая ветка совершенно неактуальна.
SLaks

21
Имейте в git push origin :branch2виду, что любой соблазн (как и я) запускается, думая, что он просто подтолкнет текущую локальную ветвь к удаленному branch2, а вместо этого удалит удаленный branch2! Правильный путь есть git push origin HEAD:branch2.
Хелдер Перейра

72

Конечно, хотя это будет работать только в том случае, если это быстрый переход BRANCH2 или если вы форсируете его. Правильный синтаксис для такой вещи

git push <remote> <source branch>:<dest branch> 

Смотрите описание "refspec" на странице руководства git push для более подробной информации о том, как это работает. Также обратите внимание, что принудительное нажатие и сброс являются операциями, которые «переписывают историю», и их не следует делать слабым сердцем, если вы не абсолютно уверены, что знаете, что делаете в отношении любых удаленных репозиториев и других люди, у которых есть вилки / клоны одного и того же проекта.


6
Спасибо! Я просто добавлю, что вы можете заставить с git push --force remote local-branch:remote-branch.
Ферран Майлинч

16

Это очень просто Предположим, что вы внесли изменения в свой филиал A, который находится как в локальном, так и в удаленном месте, но вы хотите перенести эти изменения в филиал B, который нигде не существует.

Шаг-01: создать и переключиться на новую ветку B

git checkout -b B

Шаг 02: добавьте изменения в новую локальную ветку

мерзавец добавить. // или определенный файл (ы)

Шаг 03: зафиксируйте изменения

git commit -m "commit_message"

Шаг 04: Нажмите изменения в новой ветви B . Приведенная ниже команда создаст новую ветку B, а также удаленно

git push origin B

Теперь вы можете проверить из BitBucket , что ветвь B будет иметь один более чем совершать ветви А . И когда вы извлекаете филиальную А эти изменения не будут там , как они были вытеснены в ветви B .

Примечание. Если вы зафиксировали свои изменения в ветви A и после этого хотите перенести эти изменения в новую ветку B, вам придется сначала сбросить эти изменения. #HappyLearning


2

В моем случае у меня был один локальный коммит, который не был передан origin\master, но передан в мой локальный masterфилиал. Этот локальный коммит теперь должен быть перенесен в другую ветку.

С Git Extensions вы можете сделать что-то вроде этого:

  • (Создайте, если не существует и) извлеките новую ветку, в которую вы хотите отправить свой коммит.
  • Выберите коммит из истории, который должен быть зафиксирован и перенесен в эту ветку.
  • Щелкните правой кнопкой мыши и выберите Cherry pick commit .
  • Нажмите Вишневый выбрать кнопку после этого.
  • Выбранный коммит get применяется к вашей проверенной ветке. Теперь совершите и нажмите его.
  • Проверьте свою старую ветку с ошибочным коммитом.
  • Сделайте полный сброс этой ветки до второго последнего коммита, где все было в порядке (знайте, что вы здесь делаете!). Вы можете сделать это, щелкнув правой кнопкой мыши на втором последнем коммите и выбрав « Сбросить текущую ветку» . Подтвердите операцию, если знаете, что делаете.

Вы также можете сделать это в командной строке GIT . Пример скопирован с Дэвида Кристенсена :

Я думаю, что вы найдете git cherry-pick+ git resetболее быстрый рабочий процесс:

Используя тот же сценарий, когда ветвь «feature» представляет собой ветвь с неправильным верхним коммитом, сделать это будет намного проще:

git checkout master
git cherry-pick feature
git checkout feature
git reset --hard HEAD^

Экономит немало работы, и это сценарий, который git cherry-pick был разработан для обработки.

Я также отмечу, что это будет работать, если это не самый верхний коммит; вам просто нужен коммит для аргумента cherry-pick через:

git checkout master
git cherry-pick $sha1
git checkout feature
git rebase -i ... # whack the specific commit from the history


2

Я получил плохой результат с git push origin branch1:branch2командой:

В моем случае branch2удаляется и branch1был обновлен с некоторыми новыми изменениями.

Следовательно, если вы хотите, чтобы изменения были только branch2от branch1, попробуйте следующие процедуры:

  • На branch1:git add .
  • На branch1:git commit -m 'comments'
  • На branch1:git push origin branch1

  • На branch2:git pull origin branch1

  • On branch1: вернуться к предыдущему коммиту.


0

ты можешь сделать это легко

git status
git add .
git commit -m "any commit"
git pull origin (branch name, master in my case)
git push origin current branch(master):branch 2(development)(in which you want to push changes)

-1

git init 
#git remote remove origin
git remote add origin  <http://...git>
echo "This is for demo" >> README.md 
git add README.md
git commit -m "Initail Commit" 
git checkout -b branch1 
git branch --list
****add files***
git add -A
git status
git commit -m "Initial - branch1"
git push --set-upstream origin branch1
#git push origin --delete  branch1
#git branch --unset-upstream  


1
Пожалуйста, добавьте некоторые пояснения к коду.
Nakx

-4

Вы взяли на себя обязательство BRANCH1 и хотите избавиться от этого коммита, не теряя изменений? Git Reset - это то, что вам нужно. Делать:

git branch BRANCH2

если вы хотите, чтобы BRANCH2 была новой веткой. Вы также можете объединить это в конце с другой веткой, если хотите. Если BRANCH2 уже существует, оставьте этот шаг.

Затем сделайте:

git reset --hard HEAD~3

если вы хотите сбросить коммит на ветке, которую вы зафиксировали. Это принимает изменения последних трех коммитов.

Затем выполните следующие действия, чтобы перенести сброшенные коммиты в BRANCH2.

git checkout BRANCH2

Этот источник был полезен: https://git-scm.com/docs/git-reset#git-reset-Undoacommitmakingitatopicbranch

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.