Создать ветку в Git из другой ветки


991

У меня есть две ветви: master и dev

Я хочу создать «ветку функций» из ветки dev .

В данный момент на ветке dev делаю:

$ git checkout -b myfeature dev

... (некоторые работы)

$ git commit -am "blablabla"
$ git push origin myfeature

Но после визуализации моих веток я получил:

--**master**
------0-----0-----0-----0-----0
------------------------**dev**----**myfeature**

Я имею в виду, что ветка кажется слитой, и я не понимаю, почему ...

Что я делаю не так?

Не могли бы вы объяснить, пожалуйста, как вы переходите из другой ветви и возвращаетесь в удаленный репозиторий для ветви функций?

Все это в модели ветвления, как описано здесь .

Ответы:


1434

Если вам понравился метод в ссылке, которую вы опубликовали, взгляните на Git Flow .

Это набор сценариев, которые он создал для этого рабочего процесса.

Но чтобы ответить на ваш вопрос:

$ git checkout -b myFeature dev

Создает ветку MyFeature от dev. Делай свою работу, а затем

$ git commit -am "Your message"

Теперь объедините ваши изменения в dev без быстрой перемотки вперед

$ git checkout dev
$ git merge --no-ff myFeature

Теперь нажмите изменения на сервере

$ git push origin dev
$ git push origin myFeature

И ты увидишь, как ты этого хочешь.


32
Какова важность подталкивания myFeatureпосле того, как оно было объединено с остроумием dev?
Александр Сурафел

3
@spartacus Если myFeatureветвь была передана на сервер перед слиянием, то ничего. Но если myFeatureон еще не отправлен на сервер, и вы хотите, чтобы он появился на сервере, вы должны отправить его в апарт.
xOneca

15
так git checkout -b myFeature devже, как эти 3 команды:, git checkout devтогда git branch myFeature, а потом git checkout myFeature?
Кевин Мередит

3
Это или должно быть. Вы видите что-то другое?
Abizern

33
Чтобы уточнить для других новичков, это то, как --no-ffвыглядит слияние
A__

408

Если вы хотите создать новую ветку из любой из существующих веток в Git, просто следуйте инструкциям.

Сначала измените / извлеките ветку, из которой вы хотите создать новую ветку. Например, если у вас есть такие ветки, как:

  • мастер
  • DEV
  • branch1

Так что если вы хотите создать новую ветку под названием «subbranch_of_b1» под названием филиала «branch1» выполните следующие действия:

  1. Оформить заказ или перейти на "branch1"

    git checkout branch1
    
  2. Теперь создайте новую ветвь с именем «subbranch_of_b1» под «branch1», используя следующую команду.

    git checkout -b subbranch_of_b1 branch1
    

    Приведенное выше создаст новую ветвь с именем subbranch_of_b1 под ветвью branch1 (обратите внимание, что branch1в приведенной выше команде не обязательно, поскольку HEAD в данный момент указывает на нее, вы можете указать ее, если находитесь в другой ветке).

  3. Теперь после работы с subbranch_of_b1 вы можете фиксировать и перемещать его локально или удаленно.

Пример графической иллюстрации создания веток под другой веткой

переместить subbranch_of_b1 на удаленный

 git push origin subbranch_of_b1 

7
как подтолкнуть subbranch_of_b1 к удаленному ??
user269867

13
@ user269867: "git push origin subbranch_of_b1" сделает эту работу за вас.
Правин Джордж

4
Теперь, если я отправлю изменения в мастер, это произойдет автоматически в branch1?
Мастер Йода

2
обратите внимание, что branch1 в приведенной выше команде не является обязательным, поскольку HEAD в данный момент указывает на нее, вы можете уточнить это, если вы находитесь на другой ветке, хотя это то, что я искал
felipsmartins

10
Я пришел сюда, задаваясь вопросом, если git checkout -b some-branchэто сокращение для git checkout -b some-branch master. Оказывается, это git checkout -b some-branchсокращение дляgit checkout -b some-branch <current_active_branch>
Фрэнк Хенард

45

Создать филиал

  • Создать ветку, когда мастер ветка извлечена. Здесь коммиты в master будут синхронизироваться с веткой, которую вы создали.

    $ git branch branch1

  • Создать ветку, когда branch1 извлечен. Здесь коммиты в branch1 будут синхронизированы с branch2

    $ git branch branch2


Оформить заказ Филиал

команда git checkout переключает ветки или восстанавливает файлы рабочего дерева

  • $ git checkout branchname

Переименование филиала

  • $ git branch -m branch1 newbranchname

Удалить ветку

  • $ git branch -d branch-to-delete
  • $ git branch -D branch-to-delete ( принудительное удаление без проверки статуса объединения )

Создать и переключить ветку

  • $ git checkout -b branchname

Филиалы, которые полностью включены

  • $ git branch --merged


************************** Различия между ветками [git diff branch1..branch2] ************** **********

Многолинейная разница
  • $ git diff master..branch1
Единственная разница
  • $ git diff --color-words branch1..branch2

1
Также после переименования ветки используйте git push origin :old-name new-nameдля удаления ветки старого имени и нажмите локальную ветку с новым именем.
95faf8e76605e973

13

Делаем одновременную работу на devветке. Что происходит, так это то, что в вашем сценарии ветвь объектов движется вперед от вершины ветки dev, но ветка dev не изменяется. Проще нарисовать прямую линию, потому что это можно рассматривать как движение вперед. Вы сделали это, чтобы указать A на dev, и оттуда вы просто продолжили идти по параллельному пути. Две ветви на самом деле не разошлись.

Теперь, если вы сделаете коммит на dev, перед слиянием вы снова начнете с того же коммита, A, но теперь функции перейдут к C, а dev к B. Это покажет разделение, которое вы пытаетесь визуализировать, как ветви сейчас разошлись.

*-----*Dev-------*Feature

Против

       /----*DevB
*-----*DevA
       \----*FeatureC

9

Git 2.23 вводит git switchи git restoreразделяет обязанностиgit checkout

Создание новой ветви из существующей ветви с git 2.23:

git switch -c my-new-branch

Перешел на новую ветку "my-new-branch"

  • -c сокращение от --create и заменяет общеизвестный git checkout -b

Посмотрите на это сообщение в блоге Github, объясняющее изменения более подробно:

Git 2.23 приносит новую пару экспериментальных команд в набор существующих: git switch и git restore . Эти два предназначены для того, чтобы в конечном итоге предоставить лучший интерфейс для хорошо известного git checkout. Новые команды предназначены для того, чтобы у каждого было четкое разделение, аккуратно поделить, каковы многие обязанности git checkout


9

Чтобы создать ветку из другой ветки в вашем локальном каталоге, вы можете использовать следующую команду.

git checkout -b <sub-branch> branch

Например:

  • название новой создаваемой ветви 'XYZ'
  • название филиала ABC, под которым должен быть создан XYZ
git checkout -b XYZ ABC

3

Если вы хотите сделать ветку из какой-то другой ветки, выполните следующие шаги:

Предположения :

  1. Вы в настоящее время в мастер ветке.
  2. У вас нет изменений для фиксации. (Если у вас есть какие-либо изменения, сохраните их!).
  3. BranchExistingэто название ветки, из которой вам нужно сделать новую ветку с именем BranchMyNew.

Шаги :

  1. Принесите ветку на свой локальный компьютер.

    $ git fetch origin BranchExisting : BranchExisting
    

Эта команда создаст новую ветку в вашей локальной сети с таким же именем.

  1. Теперь от проверки мастер ветки до вновь извлеченной ветки

    $ git checkout BranchExisting
    
  2. Вы сейчас в BranchExisting. Теперь создайте новую ветку из этой существующей ветви.

    $ git checkout -b BranchMyNew
    

Ну вот!


1

Для создания ветки из другого можно также использовать этот синтаксис:

git push origin refs/heads/<sourceBranch>:refs/heads/<targetBranch>

Это немного короче, чем "git checkout -b" + "git push origin"

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.