Як можна скопіювати вміст гілки в нову локальну гілку?


270

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


10
Через 4 роки з Git 2.15 (Q4 2017) у вас буде git branch -c A B. Дивіться мою відповідь нижче
VonC

Відповіді:


445
git checkout old_branch
git branch new_branch

Це дасть вам нову гілку "new_branch" з тим самим станом, що і "old_branch".

Цю команду можна комбінувати з наступним:

git checkout -b new_branch old_branch

134
Або навіть коротше git checkout -b new_branch(коли ви вже ввімкнено old_branch).
Корактор

4
Це лише створення нової гілки, але не в змозі скопіювати вміст з однієї гілки в іншу. Коли я пробую ці команди, він просто показує "Гілка з іменем **** вже існує".
анооп

7
Я думаю, якщо створити нову гілку на зразок цієї, миттєво не має копії старої гілки, а просто новий вказівник на голову старої гілки. Але коли ви робите щось на кшталт перезавантаження нової гілки, ви повинні побачити, що стара гілка все ще знаходиться в початковому стані, а нова гілка модифікується. Тому я думаю, що це робить те, що хоче ОП.
uli_1973

1
git checkout old_branch і ніж git гілка new_branch .... Його краще використовувати вище команду на виробництві, так як нижче команда створить нову гілку і переведе вас до нової гілки (змінити гілку як нову гілку) .... git checkout -b new_branch old_branch
Кіран

Для перезапису гілки см stackoverflow.com/questions/26961371 / ...
MCCCS

55
git branch copyOfMyBranch MyBranch

Це дозволяє уникнути потенційно трудомісткого та непотрібного акта перевірки філії. Нагадаємо, що замовлення модифікує "робоче дерево", що може зайняти тривалий час, якщо воно велике або містить великі файли (наприклад, зображення чи відео).


1
Звичайно, якщо у вас є бінарні файли в git, особливо великі, то, ймовірно, варто проаналізувати свою стратегію щодо вказаних файлів. Звичайно, існуватимуть незвичні випадки, і наявність бінарних файлів у git було б цілком прийнятним.
преподобний

52

Завдяки Git 2.15 (Q4 2017) " git branch" навчився " -c/-C" створювати нову гілку, копіюючи існуючу.

Див. Комісію c8b2cec (18 червня 2017 р.) Від Ævar Arnfjörð Bjarmason ( avar) .
Див. Команду 52d59cc , вчинити 5463caa (18 червня 2017 р.) Від Sahil Dua ( sahildua2305) .
(Об'єднано Хуніо С Хамано - gitster- у комітці 3b48045 , 03 жовтня 2017 р.)

branch: додайте опцію --copy( -c), щоб перейти з --move( -m)

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

Це корисно, наприклад , для копіювання теми гілки на нову версію, наприклад , workщоб work-2після подачі workтеми в список, зберігаючи при цьому всіх даних відстеження та іншої конфігурацію , яка йде з гілкою, і в відміну від --moveпідтримки іншого вже представленого філії навколо довідник.

Примітка. Коли ви копіюєте гілку, ви залишаєтеся на поточній гілці.
Як пояснює Хуніо С Хамано:

Створюючи нову гілку B, копіюючи гілку, Aяка є поточною гілкою, вона також оновлюється, HEADщоб вказати на нову гілку.
Це, мабуть, було зроблено таким чином, тому що " git branch -c A B" копіюється його реалізація на " git branch -m A B",

Це не відповідає звичайному очікуванню.
Якби я сидів на синьому стільці, а хтось приходить і перефарбовує його в червоний колір, я б прийняв закінчення сидіти на стільці, яке зараз червоне (я також нормально стояти, натомість, оскільки там більше немає мого улюбленого синього крісла ).

Але якщо хтось створить новий червоний стілець, моделюючи його після синього стільця, на якому я сиджу, я не сподіваюся, що він звільниться з синього стільця і ​​закінчиться сидіти на новому червоному.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.