#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-rebase2.
-b
Ingit 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:
Создайте новую ветку из того места, где вы должны были быть, а затем перенесите изменения в неправильной ветке в новую ветку.
Затем вы можете удалить плохую ветку, предполагая, что вы не переносили ее в другое место и в нее были внесены другие изменения.