Как скопировать содержимое ветки в новую локальную ветвь?

Я работал над локальной ветвью, а также удалял изменения на удаленный. Я хочу вернуть изменения в этой ветке и сделать что-то еще, но я не хочу полностью потерять работу. Я думал о чем-то вроде создания новой ветки локально и копирования старой ветки, тогда я могу отменить изменения и продолжить работу над старой ветвью. Может быть, лучший способ? Или как это сделать?

Ответ 1

git checkout old_branch
git branch new_branch

Это даст вам новую ветку "new_branch" с тем же состоянием, что и "old_branch".

Эта команда может быть объединена со следующим:

git checkout -b new_branch old_branch

Ответ 2

git branch copyOfMyBranch MyBranch

Это позволяет избежать потенциально трудоемкого и ненужного действия проверки ветки. Напомним, что проверка изменяет "рабочее дерево", что может занять много времени, если оно велико или содержит большие файлы (например, изображения или видео).

Ответ 3

С Git 2.15 (Q4 2017) "git branch" узнал "-c/-C", чтобы создать новую ветвь, скопировав существующий.

См. commit c8b2cec (18 июня 2017 г.) Ævar Arnfjörð Bjarmason (avar).
См. commit 52d59cc, совершить 5463caa (18 июня 2017 г.) ) Сахил Дуа (sahildua2305).
(слияние Junio ​​C Hamano - gitster - в commit 3b48045, 03 Oct 2017)

branch: добавьте параметр --copy (-c), чтобы перейти с --move (-m)

Добавьте возможность --copy ветки и ее reflog и конфигурацию, это использует тот же базовый механизм, что и опция --move (-m) за исключением того, что reflog и конфигурация копируются вместо перемещения.

Это полезно для, например, копирование ветки темы в новую версию, например work до work-2 после отправки темы work в список, в то время как сохраняя всю информацию отслеживания и другую конфигурацию, которая идет с веткой, и в отличие от --move сохранения другой уже представленной откройте для справки.

Примечание: при копировании ветки вы остаетесь в своей текущей ветке.
Как поясняет Юнио С Хамано:

При создании новой ветки B путем копирования ветки A, которая происходит с быть текущей ветвью, она также обновляет HEAD, чтобы указать на новую филиал.
Вероятно, это было сделано так, потому что "git branch -c A B" реализовала свою реализацию на "git branch -m A B",

Это не соответствует обычным ожиданиям.
Если бы я сидел на синем кресле, а кто-то приходил и перекрашивал его до красных, я бы согласился вступить, сидя на стуле, который теперь красный (я тоже в порядке вместо этого, вместо того, чтобы больше не было моего любимого синего кресла).

Но если кто-то создает новый красный стул, моделируя его после синего Я сижу на стуле, я не ожидаю, что вас уберут от синего стул и заканчивая сидящим на новом красном.