Учебники

Git — Управление ветвями

Работа филиала позволяет создать еще одну линию развития. Мы можем использовать эту операцию, чтобы расколоть процесс разработки в два разных направления. Например, мы выпустили продукт для версии 6.0 и, возможно, захотим создать ветку, чтобы разработка функций 7.0 могла быть отделена от исправлений ошибок 6.0.

Создать ветку

Том создает новую ветку с помощью команды git branch <имя_ветки>. Мы можем создать новую ветку из существующей. Мы можем использовать определенный коммит или тэг в качестве отправной точки. Если какой-либо конкретный идентификатор фиксации не предоставлен, то ветвь будет создана с HEAD в качестве отправной точки.

[jerry@CentOS src]$ git branch new_branch

[jerry@CentOS src]$ git branch
* master
new_branch

Новая ветка создана; Том использовал команду git branch для вывода списка доступных веток. Git показывает знак звездочки перед проверенной веткой.

Графическое представление операции создания ветви показано ниже —

Git TutorialGit Tutorial

Переключение между филиалами

Джерри использует команду git checkout для переключения между ветками.

[jerry@CentOS src]$ git checkout new_branch
Switched to branch 'new_branch'
[jerry@CentOS src]$ git branch
master
* new_branch

Ярлык для создания и переключения веток

В приведенном выше примере мы использовали две команды для создания и переключения ветвей соответственно. Git предоставляет опцию –b командой checkout; эта операция создает новую ветку и сразу переключается на новую ветку.

[jerry@CentOS src]$ git checkout -b test_branch
Switched to a new branch 'test_branch'

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

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

Ветвь может быть удалена путем предоставления опции -D командой git branch. Но перед удалением существующей ветви переключитесь на другую ветку.

Джерри в настоящее время находится на test_branch, и он хочет удалить эту ветку. Таким образом, он переключает ветку и удаляет ветку, как показано ниже.

[jerry@CentOS src]$ git branch
master
new_branch
* test_branch

[jerry@CentOS src]$ git checkout master
Switched to branch 'master'

[jerry@CentOS src]$ git branch -D test_branch
Deleted branch test_branch (was 5776472).

Теперь Git покажет только две ветви.

[jerry@CentOS src]$ git branch
* master
new_branch

Переименовать ветку

Джерри решает добавить поддержку широких символов в своем проекте строковых операций. Он уже создал новую ветку, но название ветви не подходит. Поэтому он меняет имя ветви, используя опцию -m, за которой следуют старое имя ветви и новое имя ветви .

[jerry@CentOS src]$ git branch
* master
new_branch

[jerry@CentOS src]$ git branch -m new_branch wchar_support

Теперь команда git branch покажет имя новой ветви.

[jerry@CentOS src]$ git branch
* master
wchar_support

Объединить две ветви

Джерри реализует функцию для возврата длины строки широких символов. Новый код будет выглядеть следующим образом —

[jerry@CentOS src]$ git branch
master
* wchar_support

[jerry@CentOS src]$ pwd
/home/jerry/jerry_repo/project/src

[jerry@CentOS src]$ git diff

Приведенная выше команда дает следующий результат —

t a/src/string_operations.c b/src/string_operations.c
index 8ab7f42..8fb4b00 100644
--- a/src/string_operations.c
+++ b/src/string_operations.c
@@ -1,4 +1,14 @@
#include <stdio.h>
+#include <wchar.h>
+
+size_t w_strlen(const wchar_t *s)
+
{
   +
   const wchar_t *p = s;
   +
   +
   while (*p)
   + ++p;
   + return (p - s);
   +
}

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

[jerry@CentOS src]$ git status -s
M string_operations.c
?? string_operations

[jerry@CentOS src]$ git add string_operations.c

[jerry@CentOS src]$ git commit -m 'Added w_strlen function to return string lenght of wchar_t
string'

[wchar_support 64192f9] Added w_strlen function to return string lenght of wchar_t string
1 files changed, 10 insertions(+), 0 deletions(-)

Обратите внимание, что Джерри передает эти изменения в новую ветку, поэтому он использовал имя ветви wchar_support вместо главной ветви.

[jerry@CentOS src]$ git push origin wchar_support   <−−− Observer branch_name

Приведенная выше команда даст следующий результат.

Counting objects: 7, done.
Compressing objects: 100% (4/4), done.
Writing objects: 100% (4/4), 507 bytes, done.
Total 4 (delta 1), reused 0 (delta 0)
To [email protected]:project.git
* [new branch]
wchar_support -> wchar_support

После внесения изменений новая ветка будет выглядеть следующим образом —

Git Tutorial

Тому интересно, что делает Джерри в своей частной ветке, и он проверяет журнал в ветке wchar_support .

[tom@CentOS src]$ pwd
/home/tom/top_repo/project/src

[tom@CentOS src]$ git log origin/wchar_support -2

Приведенная выше команда даст следующий результат.

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse <[email protected]>
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string


commit 577647211ed44fe2ae479427a0668a4f12ed71a1
Author: Tom Cat <[email protected]>
Date: Wed Sep 11 10:21:20 2013 +0530

Removed executable binary

Просматривая сообщения коммита, Том понимает, что Джерри реализовал функцию strlen для широких символов, и ему нужны те же функции в основной ветке. Вместо повторной реализации он решает взять код Джерри, объединив свою ветку с главной веткой.

[tom@CentOS project]$ git branch
* master

[tom@CentOS project]$ pwd
/home/tom/top_repo/project

[tom@CentOS project]$ git merge origin/wchar_support
Updating 5776472..64192f9
Fast-forward
src/string_operations.c | 10 ++++++++++
1 files changed, 10 insertions(+), 0 deletions(-)

После операции слияния основная ветвь будет выглядеть следующим образом:

Git Tutorial

Теперь ветка wchar_support была объединена с главной веткой. Мы можем проверить это, просмотрев сообщение о коммите или просмотрев изменения, внесенные в файл string_operation.c.

[tom@CentOS project]$ cd src/

[tom@CentOS src]$ git log -1

commit 64192f91d7cc2bcdf3bf946dd33ece63b74184a3
Author: Jerry Mouse 
Date: Wed Sep 11 16:10:06 2013 +0530

Added w_strlen function to return string lenght of wchar_t string

[tom@CentOS src]$ head -12 string_operations.c

Приведенная выше команда даст следующий результат.

#include <stdio.h>
#include <wchar.h>
size_t w_strlen(const wchar_t *s)
{
   const wchar_t *p = s;

   while (*p)
      ++p;

   return (p - s);
}

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

[tom@CentOS src]$ git push origin master
Total 0 (delta 0), reused 0 (delta 0)
To gituser@git.server.com:project.git
5776472..64192f9 master −> master

Перебазировать филиалы

Команда Git rebase — это команда слияния веток, но разница в том, что она изменяет порядок коммитов.

Команда Git merge пытается поместить коммиты из других веток поверх HEAD текущей локальной ветки. Например, ваша локальная ветвь имеет коммиты A−> B−> C−> D, а ветвь слияния имеет коммиты A−> B−> X−> Y, тогда git merge преобразует текущую локальную ветвь во что-то вроде A−> B-> C-> D-> Х-> У

Команда Git rebase пытается выяснить общего предка между текущей локальной ветвью и ветвью слияния. Затем он передает коммиты в локальную ветвь, изменяя порядок коммитов в текущей локальной ветке. Например, если ваша локальная ветвь имеет коммиты A−> B−> C−> D, а ветвь слияния имеет коммиты A−> B−> X−> Y, то Git rebase преобразует текущую локальную ветвь во что-то вроде A− > B-> Х-> Y-> C-> D.

Когда в одном удаленном репозитории работают несколько разработчиков, вы не можете изменить порядок коммитов в удаленном репозитории. В этой ситуации вы можете использовать операцию rebase, чтобы поместить ваши локальные коммиты поверх коммитов удаленного репозитория, и вы можете отправить эти изменения.