Как переместить изменения из одной ветки в другую ветку git?

#git

#git

Вопрос:

Как я могу перенести свою работу и изменения из master ветки во вновь созданную ветку и оставить основную ветку нетронутой после перемещения?

Ответ №1:

Если изменения не зафиксированы.

вы можете сохранить изменения в главной ветке.

 git stash
  

затем извлеките ветку

 git checkout -b newbranchname
  

и разместите изменения здесь

 git stash pop
  

Если изменения зафиксированы :

затем создайте ветку :

 git checkout -b newbranch
  

оформить заказ обратно в главную ветку:

 git checkout master
  

возврат к предыдущему коммиту :

 git reset --hard head^1
  

Комментарии:

1. это должно быть принятым ответом, поскольку OP не указывает, что работа была выполнена

2. Это отлично работает, но я не уверен, что такое git stash и git stash pop и для чего они предназначены. Я немного озадачен.

3. @EdisonPebojot git stash предназначен для сохранения изменений, внесенных после последнего коммита, а git stash pop предназначен для возврата этих изменений в рабочую область.

4. У меня это сработало идеально, у меня не было коммитов. Ошибка, которую я чаще всего совершаю с git, заключается в том, что я забываю запустить новую ветку.

Ответ №2:

Вы можете создать новую ветку, указывающую на текущий коммит, используя git branch branchname (или git checkout -b branchname , если вы хотите проверить это напрямую). Это в основном дублирует вашу основную ветку, так что вы можете продолжить работу над ней.

Если вы успешно скопировали ветку, вы можете сбросить ее master в исходную точку, используя, git reset --hard commit где commit — хэш фиксации, которая должна быть последней на master.

Итак, например, у вас такая ситуация:

 ---- 1 ---- 2 ---- 3 ---- 4 ---- 5 ---- 6
                   ^                    ^
              original                master
            master commit
  

Итак, вы выполнили проверку master при фиксации 6 и хотите создать новую ветку, ticket указывающую на нее 6 , при сбросе master в 3 :

 git branch ticket
git reset --hard 3
git checkout ticket
  

И затем вы ticket указываете на commit 6 , в то время как master указывает на 3 .

Комментарии:

1. Это сработает, если ваша новая ветка должна выйти из master . Если вам это нужно для другой линии разработки, вам придется заглянуть в git-rebase

2. -b In git checkout сообщает Git создать ветку перед ее проверкой. По сути, это ярлык для git branch name и git checkout name ; вы обычно используете его, когда хотите начать работу над новой веткой для чего-то.

3. похоже, что создание новой ветки не привело к изменениям, которые я изначально внес в master. в моей ситуации это не имеет большого значения, но было бы полезно знать на будущее….

4. Что вы имеете в виду? Если вы создаете ветку, она должна указывать на HEAD (если вы не указали другой коммит). Итак, если вы находитесь на master (и все зафиксировано), то создание новой ветки должно привести вас к тому же коммиту.

5. Если вы еще ничего не фиксировали, вы можете использовать git stash , чтобы сохранить свою работу для другого места.

Ответ №3:

Если вы зафиксировали (скажем) 2 раза после того, как поняли, что должны были находиться в ветке, тогда просто сделайте

 git branch work_branch
git reset --hard HEAD~2
  

замените 2 на количество коммитов, которые вы хотите вернуть. На данный момент вы все еще будете на master, если вы хотите перейти в ветку, чтобы продолжить работу, просто git checkout work_branch

смотрите git rev-parse --help , если хотите понять синтаксис того, как выполнить резервное копирование вашего дерева фиксации со ссылками типа HEAD~2

Комментарии:

1. Привет @Mark Fisher, что ты подразумеваешь под «2 раза»?

2. @adrianmann — Я имею в виду, что если вы выполняете 2 отдельных этапа работы, добавляя изменения и фиксируя каждое из них, то ваша история выглядит как Пуск -> A -> B, где A и B — это 2 коммита.

Ответ №4:

Я решил эту проблему следующим подходом

Шаг 1: Создайте новую ветку из зараженной master ветки и назовите ее примерно так master_infected ;

Шаг 2: теперь hard reset зараженную master ветку для удаления загрязненной commits с помощью

  git reset --hard HEAD~2  
    
  

(возвращаясь к двум commits предыдущим HEAD событиям, потому что в моем случае у меня эти два загрязнены commits . так что в вашем случае это может быть по-другому)

Теперь моя master_infected ветка содержит код, который я хочу сохранить (как я уже сказал, мой загрязненный код), и master ветка теперь находится в режиме сохранения.

Ответ №5:

Создайте новую ветку из того места, где вы должны были быть, а затем перенесите изменения в неправильной ветке в новую ветку.

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