Створіть гілку 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.