Compartilhamento de tecnologia

[Notas de estudo do Git] Capítulo 3 Ramificação, fusão e itens de configuração (Parte 1)

2024-07-12

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

Capítulo 3 Itens de ramificação, fusão e configuração

tópico relacionado:

  • Gerenciamento de filial local
  • filial remota
  • Forçar mesclagem de versões
  • usar git reuse recorded resolution (rerere) Mesclar versões conflitantes do Git
  • Calcular diferenças entre filiais
  • Ramo órfão (Orphan branches

3.1 Gestão de filial local

se git A biblioteca é local e mesmo que não haja necessidade de compartilhar o código remotamente, a filial local pode ser gerenciada como um armazém que precisa ser compartilhado remotamente. Conforme mostrado neste exemplo, você precisa primeiro copiar um armazém para a área local, o que significa que há uma biblioteca remota.

# 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

Pode-se ver que o ID com correnteHEAD deID consistente.

Nota: Depois de criar um novo branch, você deve mudar para este branch para usar:git checkout -b <newBranch>

Expandir: se você não seguir HEAD Crie uma nova ramificação, mas um determinado ID de commit (979e346), neste momento a submissão baseada nesta versão pode ser escrita:

# 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

Veja informações da filial:

  1. git branch: apenas nome da filial
  2. git branch -v: Anotado e simplificado com base em 1 SHA-1
  3. git branch -vv: exibe nomes de filiais de rastreamento remoto com base em 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 Filial remota

Às vezes, o código nativo pode ser gerado a partir de um clone da base de código de outra pessoa.Neste ponto, o código local possui um armazém remoto, geralmente chamadoorigin fonte.Para entender o Git e sua base de código remota, você pode começar comgit status O comando começa:

$ 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

visível,remoteBugFix A filial de rastreamento remoto da filial éorigin/stable-3.2 .Neste momentogit status Os resultados mostram o localHEAD com controle remotoHEAD Se a filial local pode ser encaminhada rapidamente para a filial remota. Os exemplos são os seguintes:

# 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

Perceber:

  1. Aqui está um conceito que surge com frequência:fast-forward, significa que o Git pode mesclar HEAD Mude para a versão mais recente;
  2. git pull O comando é na verdade uma combinação de dois comandos:
    1. git fetch
    2. git merge(Mesclar filial de rastreamento remoto com filial local)

Execute o acima git status comando é usado para simular a execução localgit fetch Depois disso, o novo conteúdo da filial remota foi transferido para a filial de rastreamento localorigin/stable-3.2 status. Continuar a mesclagem irá, na verdade, sincronizar com a filial local:

$ 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

De acordo com os resultados da execução, pode-se perceber que como git status Conforme indicado no prompt, esta mesclagem é uma mesclagem de avanço rápido (fast-forward merge

Além de usar ao criar uma filial local --track Especifique o ramo de rastreamento remoto,git Também há suporte para especificar filiais remotas em filiais existentes. Se você criar uma filial local antecipadamente e esquecer de associar a filial remota,git Este recurso de vinculação tardia é útil:

# 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 Forçar a geração de commits de mesclagem

Antes de ler este livro, você pode ter visto muitos exemplos de cadeias de entrega de software e modelos de ramificação. Você também pode ter tentado estratégias diferentes, apenas para descobrir que, uma vez que uma ferramenta oferece suporte a um fluxo de trabalho específico, é difícil implementá-la totalmente. cenários de aplicação que você deseja. E o Git oferece suporte a quase todos os cenários de fluxo de trabalho. Um requisito comum é ser capaz de gerar um commit de mesclagem ao mesclar um recurso (mesmo que novos recursos possam ser incorporados no modo de avanço rápido). Esse requisito é frequentemente usado para indicar que um determinado recurso foi mesclado e você deseja que essa operação de mesclagem seja explicitamente armazenada no warehouse.

Pontas

Enquanto Git Fornece uma maneira conveniente e rápida de acessar todas as informações de envio,Git A biblioteca deveria realmente ser usada comoregistro, não apenas o código-fonte cópia de segurança

O exemplo a seguir irá gerar um commit de mesclagem forçado:

# 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

Observe, use --edit Depois de definir os parâmetros, você pode modificar as informações padrão do comentário de confirmação de mesclagem no editor que é aberto.no exemplo--no-ff Indica a desativação do modo de avanço rápido;--quiet Usado para simplificar o conteúdo da saída da tela. O efeito final é mostrado na figura:

Figura 3-1

Para comparação com a forma normal, exclua ao realizar uma mesclagem --no-ff Itens de parâmetro:

# 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

O efeito é o seguinte:

Figura 3-2

Mesclar conteúdo no meio do caminho

Além de realizar uma mesclagem completa, o Git também permite que os usuários intervenham no conteúdo mesclado e decidam de forma independente qual conteúdo será incluído na mesclagem.usar--no-commit parâmetro,git Interromperá o processo antes do commit de mesclagem, permitindo ao usuário modificar ou adicionar arquivos antes do commit final. Por exemplo, o número da versão do projeto é modificado na ramificação de recurso do projeto, mas a ramificação principal não é modificada. A operação de mesclagem padrão atualizará o número da versão para o número da versão na ramificação do recurso, mas na verdade você não deseja alterar o número da versão.Aproveite esse tempo--no-commit pode ser evitado.

O exemplo a seguir demonstra uma operação de mesclagem com intervenção do usuário. Ao mesclar, você deseja excluir manualmente o commit que atualizou o arquivo de licença:

# 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

Considerando o problema da velocidade da rede, o repositório de amostra foi Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Adicione a esta biblioteca de aprendizagem (repos/ex3.3-no-commit-repo.rar