Technologieaustausch

[Git-Studiennotizen] Kapitel 3 Verzweigung, Zusammenführung und Konfigurationselemente (Teil 1)

2024-07-12

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

Kapitel 3 Verzweigung, Zusammenführung und Konfigurationselemente

Verwandtes Thema:

  • Lokale Filialleitung
  • Remote-Zweig
  • Versionszusammenführung erzwingen
  • verwenden git reuse recorded resolution (rerere) In Konflikt stehende Git-Versionen zusammenführen
  • Berechnen Sie Unterschiede zwischen Zweigen
  • Waisenzweig (Orphan branches

3.1 Lokale Filialleitung

Wenn git Die Bibliothek ist lokal, und selbst wenn der Code nicht remote geteilt werden muss, kann der lokale Zweig wie ein Warehouse verwaltet werden, das remote geteilt werden muss. Wie in diesem Beispiel gezeigt, müssen Sie zunächst ein Lager in den lokalen Bereich kopieren, was bedeutet, dass eine Remote-Bibliothek vorhanden ist.

# 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

Es ist zu erkennen, dass die ID mit StromHEAD vonID konsistent.

Hinweis: Nachdem Sie einen neuen Zweig erstellt haben, müssen Sie zu diesem Zweig wechseln, um Folgendes zu verwenden:git checkout -b <newBranch>

Erweitern: Wenn Sie nicht folgen HEAD Erstellen Sie einen neuen Zweig, aber eine bestimmte Commit-ID (979e346), zu diesem Zeitpunkt kann der auf dieser Version basierende Beitrag geschrieben werden:

# 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

Filialinformationen anzeigen:

  1. git branch: Nur Filialname
  2. git branch -v: Kommentiert und vereinfacht basierend auf 1 SHA-1
  3. git branch -vv: Remote-Tracking-Zweignamen basierend auf 2 anzeigen
$ 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 Remote-Zweig

Manchmal kann nativer Code aus einem Klon der Codebasis einer anderen Person generiert werden.Zu diesem Zeitpunkt verfügt der lokale Code über ein Remote-Warehouse, das normalerweise aufgerufen wirdorigin Quelle.Um Git und seine Remote-Codebasis zu verstehen, können Sie mit beginnengit status Der Befehl startet:

$ 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

sichtbar,remoteBugFix Der Remote-Tracking-Zweig der Filiale istorigin/stable-3.2 .Zu diesem Zeitpunktgit status Die Ergebnisse zeigen das LokaleHEAD mit FernbedienungHEAD Ob die lokale Zweigstelle schnell an die Remote-Zweigstelle weitergeleitet werden kann. Beispiele sind wie folgt:

# 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

Beachten:

  1. Hier ist ein Konzept, das oft auftaucht:fast-forward, bedeutet, dass Git zusammengeführt werden kann HEAD Wechseln Sie zur neuesten Version.
  2. git pull Der Befehl ist eigentlich eine Kombination aus zwei Befehlen:
    1. git fetch
    2. git merge(Remote-Tracking-Zweig mit lokalem Zweig zusammenführen)

Führen Sie das obige aus git status Der Befehl wird verwendet, um die lokale Ausführung zu simulierengit fetch Danach wurde der neue Inhalt im Remote-Zweig in den lokalen Tracking-Zweig gezogenorigin/stable-3.2 Status. Wenn Sie die Zusammenführung fortsetzen, wird tatsächlich eine Synchronisierung mit dem lokalen Zweig durchgeführt:

$ 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

Den Ausführungsergebnissen zufolge kann dies als angesehen werden git status Wie in der Eingabeaufforderung angegeben, handelt es sich bei dieser Zusammenführung um eine Schnellvorlaufzusammenführung (fast-forward merge

Zusätzlich zur Verwendung beim Erstellen einer lokalen Verzweigung --track Geben Sie den Remote-Tracking-Zweig an.git Es gibt auch Unterstützung für die Angabe von Remote-Zweigen in vorhandenen Zweigen. Wenn Sie im Voraus einen lokalen Zweig erstellen und vergessen, den Remote-Zweig zuzuordnen,git Diese späte Bindungsfunktion ist praktisch:

# 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 Erzwingen Sie die Generierung von Merge-Commits

Bevor Sie dieses Buch gelesen haben, haben Sie möglicherweise viele Beispiele für Softwarebereitstellungsketten und Verzweigungsmodelle gesehen. Möglicherweise haben Sie auch verschiedene Strategien ausprobiert und festgestellt, dass es schwierig ist, einen bestimmten Workflow vollständig zu implementieren Anwendungsszenarien, die Sie wünschen. Und Git unterstützt nahezu alle Workflow-Szenarien. Eine häufige Anforderung besteht darin, beim Zusammenführen eines Features ein Merge-Commit generieren zu können (auch wenn neue Features im Fast-Forward-Modus eingebunden werden können). Eine solche Anforderung wird häufig verwendet, um anzugeben, dass ein bestimmtes Feature zusammengeführt wurde und Sie möchten, dass dieser Zusammenführungsvorgang explizit im Warehouse gespeichert wird.

Tipps

Wohingegen Git Bietet eine bequeme und schnelle Möglichkeit, auf alle Einreichungsinformationen zuzugreifen.Git Die Bibliothek sollte eigentlich als verwendet werdenProtokoll, nicht nur der Quellcode Sicherung

Das folgende Beispiel generiert einen erzwungenen Merge-Commit:

# 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

Hinweis, Verwendung --edit Nachdem Sie die Parameter festgelegt haben, können Sie die standardmäßigen Merge-Commit-Kommentarinformationen im sich öffnenden Editor ändern.im Beispiel--no-ff Zeigt die Deaktivierung des Schnellvorlaufmodus an;--quiet Wird verwendet, um den Inhalt der Bildschirmausgabe zu vereinfachen. Der endgültige Effekt ist in der Abbildung dargestellt:

Abbildung 3-1

Zum Vergleich mit der normalen Methode: Löschen Sie, wenn Sie eine Zusammenführung durchführen --no-ff Parameterelemente:

# 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

Der Effekt ist wie folgt:

Abbildung 3-2

Inhalte auf halbem Weg zusammenführen

Neben der Durchführung einer vollständigen Zusammenführung ermöglicht Git den Benutzern auch, in die zusammengeführten Inhalte einzugreifen und selbstständig zu entscheiden, welche Inhalte in die Zusammenführung einbezogen werden.verwenden--no-commit Parameter,git Unterbricht den Prozess vor dem Zusammenführungs-Commit, sodass der Benutzer vor dem endgültigen Commit Dateien ändern oder hinzufügen kann. Beispielsweise wird die Versionsnummer des Projekts im Feature-Zweig des Projekts geändert, der Hauptzweig jedoch nicht. Der standardmäßige Zusammenführungsvorgang aktualisiert die Versionsnummer auf die Versionsnummer im Feature-Zweig. Tatsächlich möchten Sie die Versionsnummer jedoch nicht ändern.Nutzen Sie diese Zeit--no-commit kann vermieden werden.

Das folgende Beispiel zeigt einen Zusammenführungsvorgang mit Benutzereingriff. Beim Zusammenführen möchten Sie den Commit, der die Lizenzdatei aktualisiert hat, manuell ausschließen:

# 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

In Anbetracht des Problems der Netzwerkgeschwindigkeit wurde das Beispiel-Repository verwendet Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Zu dieser Lernbibliothek hinzufügen (repos/ex3.3-no-commit-repo.rar