Створіть гілку Git із поточними змінами


848

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

Як я можу створити нову гілку і взяти всі ці зміни зі собою, не забруднивши майстра ?




4
Так, це повторювані питання, але формулювання настільки різне, що я думаю, що це корисно тримати. Зверніть увагу на ключові слова тут: branch current changesпроти existing uncommited branch. Кожен, хто говорить англійською, одразу побачить, що вони однакові, але пошукові системи, мабуть, не будуть. Тримайте це питання.
— Скотт Біггс

Відповіді:


690

Якщо ви ще не взяли на себе жодних зобов'язань, достатньо було б лише (1: відділення) та (3: замовлення).
Або в одній команді:git checkout -b newBranch

Як згадується на git resetсторінці чоловіка :

$ git branch topic/wip     # (1)
$ git reset --hard HEAD~3  # (2)  NOTE: use $git reset --soft HEAD~3 (explanation below)
$ git checkout topic/wip   # (3)
  1. Ви домовились про деякі зобов'язання, але розумієте, що вони передчасно перебувати у відділенні " master". Ви хочете продовжувати шліфування їх у темі, тому створіть topic/wipгілку " " від поточного HEAD.
  2. Перемотайте masterгілку, щоб позбутися цих трьох комітетів.
  3. Перейдіть на " topic/wip" відділення та продовжуйте працювати.

Примітка: через "руйнівний" ефект git reset --hardкоманди (він скидає індекс і робоче дерево. Будь-які зміни відслідковуваних файлів у робочому дереві, оскільки <commit>вони відкидаються), я б краще пішов з:

$ git reset --soft HEAD~3  # (2)

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


З Git 2.23+ , то нова командаgit switch створить філію в одному рядку (з тим же роду reset --hard, так що стережіться його дії):

git switch -f -c topic/wip HEAD~3

6
Напевно, також варто зауважити, що це не було б гарною ідеєю, якщо ви передали матеріал теми до свого головного відділення у сховищі, з якого виходять інші люди. Або принаймні, якщо вам потрібно зробити скидання, вам потрібно буде сказати людям, що це ви робите, щоб попередження від їх наступного потягу не викликали особливого шоку.
— Ендрю Уокер

39
Зауважте майбутнім читачам: читайте знизу вгору (або обов’язково прочитайте всю справу). git reset --hardзмінить ваші зміни, і якщо вони ще не здійснені, вони не підлягають відновленню! Можливо, вам просто знадобитьсяgit checkout -b …
— Конрад Мейєр

3
@ConradMeyer Добре. Я відредагував відповідь і поставив git checkout -bпершу.
— VonC

5
Чому тема / галузь ?? чому б не просто назва гілки, чи є особлива причина цього іменування? просто цікаво.
— Сем Столінга

1
@ Це лише умова іменування простору імен (спосіб легко класифікувати гілки, використовуючи ієрархічні імена гілок для визначення просторів імен): stackoverflow.com/a/2527436/6309 . Наприклад, для питань: randyfay.com/content/… . Не потрібно використовувати ієрархію, називаючи свої гілки. topic_wipпрацював би теж;)
— VonC

269

Як сказано в цьому запитанні: Git: Створення гілки з нетазованих / некомплектних змін у master : сховати не потрібно.

Просто використовуйте:

git checkout -b topic/newbranch

Будь-яка незапущена робота буде прийнята до нової філії.

Якщо ви спробуєте натиснути, ви отримаєте таке повідомлення

фатально: Поточна функція гілки / NEWBRANCH не має гілки вище за течією. Щоб натиснути поточну гілку та встановити пульт як верхній, використовуйте

git push --set-upstream origin feature/feature/NEWBRANCH

Просто виконайте так, як пропонується створити гілку віддалено:

git push --set-upstream origin feature/feature/NEWBRANCH


3
Ви отримаєте помилку "немає гілки вгору за течією", лише якщо натиснути нову гілку, а не коли ви виконаєте нову роботу.
— сам

2
@sam Я відповідним чином змінив відповідь
— Нік Кеннеді,

73

Виконайте такі дії:

  1. Створіть нову гілку:

    git branch newfeature
    
  2. Оформити нове відділення: (це не відновить роботу.)

    git checkout newfeature
    
  3. Тепер покладіть свою роботу на цю нову галузь:

    git commit -s
    

Виконуючи вищезазначені кроки, ви збережете чисту оригінальну гілку, і вам не доведеться робити жодного "git reset --hard".


3
Що роблять '-і' на кроці 3?
— Скотт Біггс

12
@ScottBiggs Це непотрібно, але така практика дотримується деяких людей. Це скорочення "--signoff" і додає ваше ім'я користувача до комісії для майбутніх людей, які дивляться на журнали, щоб знати, що ви погодилися з цим зобов'язанням.
— Френк Брайс

5
Приємна відповідь, але немає необхідності -sв кроці 3.
— Мохаммед Алі

Я дізнався щось нове з коментаря, спасибі @FrankBryce
— Kasparov92

30

Оскільки ви ще не зробили жодних зобов’язань, ви можете зберегти всі свої зміни в сховці, створити та переключитися на нову гілку, а потім повернути ці зміни назад у своє робоче дерево:

git stash  # save local modifications to new stash
git checkout -b topic/newbranch
git stash pop  # apply stash and remove it from the stash list

9
або як вказав VonC 'git checkout -b newbranch' і пропустити
— скриньку

@will: Я думав, що створення нової гілки замінить будь-які незмінені вами зміни, але якщо це не так, так, ви можете пропустити скриньку.
— Ефір

1
Я спробував це, і він спрацював чудово, git дуже продуманий і не
— зможе

2
Я припускаю, що це був помилковий помилок, але це просто голова, що git stash pushце не команда. Ви, ймовірно, хочете використовувати git stashабо git stash save. Якщо ви хочете включити непотрібні файли в копію, скористайтеся --include-untrackedопцією. Точно так само, якщо ви хочете включити як скрипт, так і проігноровані файли в копію, --addзамість цього скористайтеся опцією.
— Шість

якщо ви вже створили філію, це корисно.
— Безумовно,

13

Щоб додати нові зміни до нової гілки та натиснути на віддалене:

git branch branch/name
git checkout branch/name
git push origin branch/name

Часто я забуваю додавати початкову частину, щоб натиснути і заплутатися, чому я не бачу нову гілку / фіксацію в bitbucket

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