Berbagi teknologi

[Catatan Studi Git] Bab 3 Item Percabangan, Penggabungan, dan Konfigurasi (Bagian 1)

2024-07-12

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

Bab 3 Percabangan, penggabungan dan konfigurasi item

topik terkait:

  • Manajemen cabang lokal
  • cabang terpencil
  • Paksa penggabungan versi
  • menggunakan git reuse recorded resolution (rerere) Gabungkan versi Git yang bertentangan
  • Hitung perbedaan antar cabang
  • Cabang yatim piatu (Orphan branches

3.1 Manajemen cabang lokal

jika git Perpustakaannya bersifat lokal, dan meskipun tidak perlu membagikan kode dari jarak jauh, cabang lokal dapat dikelola seperti gudang yang perlu dibagikan dari jarak jauh. Seperti yang ditunjukkan dalam contoh ini, Anda perlu menyalin gudang ke area lokal terlebih dahulu, yang berarti terdapat perpustakaan jarak jauh.

# 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

Dapat dilihat bahwa ID dengan arusHEAD dariID konsisten.

Catatan: Setelah membuat cabang baru, Anda harus beralih ke cabang ini untuk menggunakan:git checkout -b <newBranch>

Perluas: Jika Anda tidak mengikuti HEAD Buat cabang baru, tetapi ID komit tertentu (979e346), saat ini penyampaian berdasarkan versi ini dapat ditulis:

# 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

Lihat informasi cabang:

  1. git branch: nama cabang saja
  2. git branch -v: Diberi anotasi dan disederhanakan berdasarkan 1 SHA-1
  3. git branch -vv: Menampilkan nama cabang pelacakan jarak jauh berdasarkan 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 Cabang jarak jauh

Terkadang, kode asli dapat dihasilkan dari tiruan basis kode orang lain.Pada titik ini, kode lokal memiliki gudang terpencil, biasanya disebutorigin sumber.Untuk memahami Git dan basis kode jarak jauhnya, Anda bisa memulainyagit status Perintah dimulai:

$ 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

bisa dilihat,remoteBugFix Cabang pelacakan jarak jauh dari cabang tersebut adalahorigin/stable-3.2 .Pada saat inigit status Hasilnya menunjukkan lokalHEAD dengan jarak jauhHEAD Apakah cabang lokal dapat diteruskan dengan cepat ke cabang jarak jauh. Contohnya adalah sebagai berikut:

# 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

Melihat:

  1. Berikut adalah konsep yang sering muncul:fast-forward, artinya Git bisa bergabung HEAD Pindah ke versi terbaru;
  2. git pull Perintah tersebut sebenarnya merupakan kombinasi dari dua perintah:
    1. git fetch
    2. git merge(Gabungkan cabang pelacakan jarak jauh ke cabang lokal)

Jalankan hal di atas git status perintah digunakan untuk mensimulasikan eksekusi lokalgit fetch Setelah itu, konten baru di cabang jarak jauh ditarik ke cabang pelacakan lokalorigin/stable-3.2 status. Melanjutkan penggabungan sebenarnya akan melakukan sinkronisasi ke cabang lokal:

$ 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

Berdasarkan hasil pelaksanaannya terlihat sebagai git status Seperti yang dinyatakan dalam prompt, penggabungan ini adalah penggabungan maju cepat (fast-forward merge

Selain digunakan saat membuat cabang lokal --track Tentukan cabang pelacakan jarak jauh,git Ada juga dukungan untuk menentukan cabang jarak jauh di cabang yang ada. Jika Anda membuat cabang lokal terlebih dahulu dan lupa mengaitkan cabang jarak jauh,git Fitur pengikatan yang terlambat ini berguna:

# 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 Memaksa pembuatan komitmen gabungan

Sebelum membaca buku ini, Anda mungkin telah melihat banyak contoh rantai pengiriman perangkat lunak dan model percabangan; Anda mungkin juga telah mencoba berbagai strategi, hanya untuk menemukan bahwa ketika suatu alat mendukung alur kerja tertentu, sulit untuk menerapkannya sepenuhnya skenario aplikasi yang Anda inginkan. Dan Git mendukung hampir semua skenario alur kerja. Persyaratan umum adalah untuk dapat menghasilkan komit penggabungan saat menggabungkan fitur (bahkan jika fitur baru dapat digabungkan dalam mode fast-forward). Persyaratan seperti ini sering digunakan untuk menunjukkan bahwa fitur tertentu telah digabungkan, dan Anda ingin operasi penggabungan ini disimpan secara eksplisit di gudang.

Kiat

Sedangkan Git Menyediakan cara yang nyaman dan cepat untuk mengakses semua informasi pengiriman,Git Perpustakaan sebenarnya harus digunakan sebagaicatatan, bukan hanya kode sumbernya cadangan

Contoh berikut akan menghasilkan komit penggabungan paksa:

# 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

Catatan, gunakan --edit Setelah mengatur parameter, Anda dapat mengubah informasi komentar komit gabungan default di editor yang terbuka.dalam contoh--no-ff Menunjukkan penonaktifan mode maju cepat;--quiet Digunakan untuk menyederhanakan konten keluaran layar. Efek akhirnya ditunjukkan pada gambar:

Gambar 3-1

Sebagai perbandingan dengan cara biasa, hapus saat melakukan penggabungan --no-ff Item parameter:

# 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

Efeknya adalah sebagai berikut:

Gambar 3-2

Gabungkan konten di tengah jalan

Selain melakukan penggabungan lengkap, Git juga memungkinkan pengguna untuk melakukan intervensi dalam konten yang digabungkan dan memutuskan secara mandiri konten apa yang disertakan dalam penggabungan.menggunakan--no-commit parameter,git Akan mengganggu proses sebelum komit penggabungan, memungkinkan pengguna untuk mengubah atau menambahkan file sebelum komit terakhir. Misalnya, nomor versi proyek diubah di cabang fitur proyek, tetapi cabang utama tidak diubah. Operasi penggabungan default akan memperbarui nomor versi ke nomor versi pada cabang fitur, namun Anda sebenarnya tidak ingin mengubah nomor versi.Gunakan kali ini--no-commit dapat dihindari.

Contoh berikut menunjukkan operasi penggabungan dengan intervensi pengguna. Saat menggabungkan, Anda ingin mengecualikan komit yang memperbarui file lisensi secara manual:

# 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

Mengingat masalah kecepatan jaringan, repositori sampel telah dibuat Git-Version-Control-Cookbook-Second-Edition_hello_world_flow_model.git Tambahkan ke perpustakaan pembelajaran ini (repos/ex3.3-no-commit-repo.rar