Обмен технологиями

[Заметки по изучению Git] Глава 3. Ветвление, слияние и элементы конфигурации (Часть 1)

2024-07-12

한어Русский языкEnglishFrançaisIndonesianSanskrit日本語DeutschPortuguêsΕλληνικάespañolItalianoSuomalainenLatina

Глава 3. Ветвление, слияние и элементы конфигурации.

соответствующая тема:

  • Управление местным филиалом
  • удаленный филиал
  • Принудительное объединение версий
  • использовать git reuse recorded resolution (rerere) Объединить конфликтующие версии Git.
  • Рассчитать разницу между филиалами
  • Сиротская ветка (Orphan branches

3.1 Управление местным филиалом

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

# clone the jgit repository to match
$ git clone https://git.eclipse.org/r/jgit/jgit 
$ cd jgit 
# Whenever you start working on a bug fix or a new 
# feature in your project, you should create a branch
$ git branch newBugFix 
$ git branch 
* master 
 newBugFix
# The newBugFix branch points to the current HEAD
# to verify this:
$ git log -1 newBugFix --format=format:%H
25fe20b2dbb20cac8aa43c5ad64494ef8ea64ffc
# edit branch description
$ git branch --edit-description newBugFix
# Add description in a newly opened editor
Refactoring the Hydro controller 

The hydro controller code is currently horrible needs to be refactored.  
# Show the description
$ git config --get branch.newBugFix.description 
Refactoring the Hydro controller 

The hydro controller code is currently horrible and needs to be refactored.  
# Show the commit hash the new branch based on
$ cat .git/refs/heads/newBugFix 
25fe20b2dbb20cac8aa43c5ad64494ef8ea64ffc 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

Видно, что ID с текущимHEAD изID последовательный.

Примечание. После создания новой ветки необходимо переключиться на эту ветку, чтобы использовать:git checkout -b <newBranch>

Развернуть: Если вы не подписаны HEAD Создайте новую ветку, но с определенным идентификатором фиксации (979e346), на данный момент представление на основе этой версии можно записать:

# new branch from commit ID
$ git branch anotherBugFix 979e346 
$ git log -1 anotherBugFix --format=format:%h 
979e346 
$ git log -1 anotherBugFix --format=format:%H 
979e3467112618cc787e161097986212eaaa4533 
# checkout new branch
$ git checkout -b lastBugFix 979e346
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

Посмотреть информацию о филиале:

  1. git branch: только название ветки
  2. git branch -v: Аннотировано и упрощено на основе 1. SHA-1
  3. git branch -vv: отображать имена ветвей удаленного отслеживания на основе 2
$ git branch -v 

  anotherBugFix 979e346 Interactive Rebase: Do actions if  
* lastBugFix    979e346 Interactive Rebase: Do actions if  
  master        25fe20b Add missing package import for jg 
  newBugFix     25fe20b Add missing package import for jg
$ git branch -vv 

  anotherBugFix 979e346 Interactive Rebase: Do actions if e 
* lastBugFix    979e346 Interactive Rebase: Do actions if e 
  master        25fe20b [origin/master] Add missing package  
  newBugFix     25fe20b Add missing package import for g 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

3.2 Удаленный филиал

Иногда собственный код может быть создан из клона чужой кодовой базы.На этом этапе локальный код имеет удаленный склад, обычно называемыйorigin источник.Чтобы понять Git и его удаленную базу кода, вы можете начать сgit status Команда запускается:

$ git checkout -b remoteBugFix --track origin/stable-3.2
Switched to a new branch 'remoteBugFix'
Branch 'remoteBugFix' set up to track remote branch 'stable-3.2' from 'origin'.
  • 1
  • 2
  • 3

видимый,remoteBugFix Отделение удаленного отслеживания филиалаorigin/stable-3.2 .В это времяgit status Результаты показывают местноеHEAD с пультомHEAD Можно ли быстро перенаправить локальную ветку в удаленную ветку. Примеры следующие:

# Find a commit on remote branch
$ git log -10 origin/stable-3.2 --oneline
# Checkout specific SHA-1
$ git reset --hard 2e0d178
HEAD is now at 2e0d17885 Add recursive variant of Config.getNames() methods
# Use 'git status' to see the free benefit of Git
$ git status
On branch remoteBugFix
Your branch is behind 'origin/stable-3.2' by 9 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

nothing to commit, working tree clean
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

Уведомление:

  1. Вот концепция, которая часто встречается:fast-forward, означает, что Git может объединить HEAD Перейти на последнюю версию;
  2. git pull На самом деле команда представляет собой комбинацию двух команд:
    1. git fetch
    2. git merge(Объединить ветку удаленного отслеживания с локальной веткой)

Выполните вышеуказанное git status команда используется для имитации локального выполненияgit fetch После этого новый контент из удаленной ветки переносится в локальную ветку отслеживания.origin/stable-3.2 положение дел. Продолжение слияния фактически синхронизируется с локальной веткой:

$ git merge origin/stable-3.2
Updating 2e0d17885..f839d383e
Fast-forward
 .../org/eclipse/jgit/api/RebaseCommandTest.java    | 213 +++++++++++++++++----
 .../src/org/eclipse/jgit/api/RebaseCommand.java    |  31 +--
 .../jgit/errors/IllegalTodoFileModification.java   |  59 ++++++
 .../eclipse/jgit/lib/BaseRepositoryBuilder.java    |   2 +-
 .../src/org/eclipse/jgit/lib/Config.java           |   2 +
 .../src/org/eclipse/jgit/lib/RebaseTodoLine.java   |  16 +-
 6 files changed, 266 insertions(+), 57 deletions(-)
 create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

По результатам выполнения видно, что как git status Как указано в подсказке, это слияние представляет собой ускоренное слияние (fast-forward merge

Помимо использования при создании локальной ветки --track Укажите ветку удаленного отслеживания,git Также имеется поддержка указания удаленных ветвей в существующих ветках. Если вы заранее создадите локальную ветку и забудете связать удаленную ветку,git Эта функция позднего связывания может оказаться полезной:

# Checkout a new branch without relating to its remote tracking branch
$ git checkout -b remoteBugFix2 2e0d17 
Switched to a new branch 'remoteBugFix2' 
# Set the tracking branch manually by using -u or --set-upstream-to
$ git branch --set-upstream-to origin/stable-3.2 
Branch remoteBugFix2 set up to track remote branch stable-3.2 from origin. 
# Validate current status
$ git status 
On branch remoteBugFix2 
Your branch is behind 'origin/stable-3.2' by 9 commits, and can be fast-forwarded. 
  (use "git pull" to update your local branch) 
nothing to commit, working directory clean 
# Same as the previous demo as expected.
# Update the branch (also a fast-forward merge with origin/stable-3.2)
$ git pull 
Updating 2e0d17885..f839d383e
Fast-forward
 .../org/eclipse/jgit/api/RebaseCommandTest.java    | 213 +++++++++++++++++----
 .../src/org/eclipse/jgit/api/RebaseCommand.java    |  31 +--
 .../jgit/errors/IllegalTodoFileModification.java   |  59 ++++++
 .../eclipse/jgit/lib/BaseRepositoryBuilder.java    |   2 +-
 .../src/org/eclipse/jgit/lib/Config.java           |   2 +
 .../src/org/eclipse/jgit/lib/RebaseTodoLine.java   |  16 +-
 6 files changed, 266 insertions(+), 57 deletions(-)
 create mode 100644 org.eclipse.jgit/src/org/eclipse/jgit/errors/IllegalTodoFileModification.java
# The output is still the same as previous one as expected.
# Validate the current HEAD with origin/stable-3.2
$ git log -1 origin/stable-3.2  --format=format:%h
f839d383e
# Still the same.
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30

3.3 Принудительное создание коммитов слияния

До прочтения этой книги вы, возможно, видели множество примеров цепочек доставки программного обеспечения и моделей ветвления; возможно, вы также пробовали разные стратегии, но обнаружили, что, если инструмент поддерживает определенный рабочий процесс, его трудно полностью реализовать. сценарии применения, которые вы хотите. Git поддерживает практически все сценарии рабочих процессов. Общим требованием является возможность генерировать фиксацию слияния при объединении функции (даже если новые функции могут быть включены в режиме ускоренной перемотки вперед). Такое требование часто используется для обозначения того, что определенный объект был объединен, и вы хотите, чтобы эта операция слияния явно сохранялась в хранилище.

Советы

Тогда как Git Обеспечивает удобный и быстрый способ доступа ко всей информации о представленных материалах.Git На самом деле библиотеку следует использовать какбревно, а не только исходный код резервное копирование

Следующий пример создаст принудительную фиксацию слияния:

# Checkout branch stable-3.1 as remoteOldBugFix for use
$ git checkout -b remoteOldBugFix --track origin/stable-3.1
# force a merge commit
$ git merge origin/stable-3.2 --no-ff --edit --quiet
  • 1
  • 2
  • 3
  • 4

Обратите внимание, используйте --edit После установки параметров вы можете изменить информацию комментариев к фиксации слияния по умолчанию в открывшемся редакторе.в примере--no-ff Указывает на отключение режима быстрой перемотки вперед;--quiet Используется для упрощения содержимого вывода на экран. Конечный эффект показан на рисунке:

Рисунок 3-1

Для сравнения с обычным способом удалите при выполнении слияния --no-ff Элементы параметров:

# Reset to initial status
$ git reset --hard  remotes/origin/stable-3.1
# Merge with fast forward by default
$ git merge origin/stable-3.2 --quiet
  • 1
  • 2
  • 3
  • 4

Эффект следующий:

Рисунок 3-2

Объединить контент на полпути

Помимо выполнения полного слияния, Git также позволяет пользователям вмешиваться в объединенный контент и самостоятельно решать, какой контент включается в слияние.использовать--no-commit параметр,git Прервет процесс перед фиксацией слияния, позволяя пользователю изменять или добавлять файлы до окончательной фиксации. Например, номер версии проекта изменяется в функциональной ветке проекта, но основная ветка не изменяется. Операция слияния по умолчанию обновит номер версии до номера версии в ветви функции, но на самом деле вы не хотите менять номер версии.Используйте это время--no-commit можно избежать.

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

# Clone repo into demo
$ git clone https://github.com/PacktPublishing/Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git demo
$ cd demo
# Checkout remote branch
$ git checkout -b remotePartlyMerge --track origin/release/1.0
Branch remotePartlyMerge set up to track remote branch release/1.0 from origin. 
Switched to a new branch 'remotePartlyMerge'
# Force a merge commit with --no-commit flag
$ git merge origin/master  --no-ff --no-commit
Automatic merge went well; stopped before committing as requested
# Exclude LICENSE file
$ git reset LICENSE
# Resume merging
$ git commit -m "Merging without LICENSE"
[remotePartlyMerge 1202b0e] Merging without LICENSE
# Check status (only LICENSE file remain untracked)
$ git status
On branch remotePartlyMerge
Your branch is ahead of 'origin/release/1.0' by 6 commits.
  (use "git push" to publish your local commits)

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        LICENSE

nothing added to commit but untracked files present (use "git add" to track)
# check difference excluding LICENSE file (only on Linux)
$ git diff origin/master !(LICENSE)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28

Учитывая проблему скорости сети, образец репозитория был Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Добавить в эту библиотеку обучения (repos/ex3.3-no-commit-repo.rar