Apabila anda belajar membuat kod, cepat atau lambat anda juga akan belajar mengenai Sistem Kawalan Versi. Walaupun terdapat banyak alat bersaing di ruang ini, salah satunya adalah standard de facto yang digunakan oleh hampir semua orang di industri ini. Sangat popular sehingga ada syarikat yang menggunakan namanya dalam jenama mereka. Kita bercakap mengenai Git, tentu saja.
Walaupun Git adalah alat yang kuat, kekuatannya tersembunyi dengan baik. Terdapat beberapa konsep penting yang perlu anda fahami untuk benar-benar mahir dengan Git. Berita baiknya ialah apabila anda mempelajarinya, anda tidak akan menghadapi masalah yang tidak dapat anda lalui.
Aliran Kerja Khas
Dalam aliran kerja Git biasa, anda akan menggunakan repositori tempatan, repositori jauh, dan satu atau lebih cawangan. Repositori menyimpan semua maklumat mengenai projek tersebut, termasuk keseluruhan sejarahnya dan semua cawangannya. Cabang pada dasarnya adalah kumpulan perubahan yang membawa dari projek kosong ke keadaan semasa.
Setelah mengklon repositori, anda mengusahakan salinan tempatan anda dan memperkenalkan perubahan baru. Sehingga anda mendorong perubahan tempatan ke repositori jauh, semua kerja anda hanya tersedia di mesin anda.
Apabila anda menyelesaikan tugas, sudah tiba masanya untuk menyegerakkan dengan repositori jauh. Anda ingin melakukan perubahan jarak jauh untuk mengikuti perkembangan projek, dan anda ingin mendorong perubahan tempatan untuk berkongsi kerja anda dengan orang lain.
Perubahan Tempatan
Semua berjalan lancar apabila anda dan anggota pasukan anda mengusahakan fail yang terpisah sepenuhnya. Apa sahaja yang berlaku, anda tidak akan memijak kaki masing-masing.
Namun, ada kalanya anda dan rakan sepasukan secara serentak memperkenalkan perubahan di tempat yang sama. Dan di situlah masalah bermula.
Adakah anda pernah dilaksanakan git pull
hanya untuk melihat yang ditakuti error: Your local changes to the following files would be overwritten by merge:
? Cepat atau lambat, semua orang menghadapi masalah itu.
Apa yang lebih membingungkan di sini ialah anda tidak mahu menggabungkan apa-apa, hanya tarik, bukan? Sebenarnya, tarikan sedikit lebih rumit daripada yang anda sangka.
Bagaimana Tepat Git Pull Berfungsi?
Tarik bukan satu operasi. Ini terdiri daripada pengambilan data dari pelayan jauh dan kemudian menggabungkan perubahan dengan repositori tempatan. Kedua operasi ini boleh dilakukan secara manual jika anda mahu:
git fetch git merge origin/$CURRENT_BRANCH
Yang origin/$CURRENT_BRANCH
sebahagian cara bahawa:
- Git akan menggabungkan perubahan dari repositori jauh bernama
origin
(yang anda kloning dari) - yang telah ditambahkan ke
$CURRENT_BRANCH
- yang belum ada di cawangan check-out tempatan anda
Oleh kerana Git hanya melakukan penggabungan ketika tidak ada perubahan yang tidak disetujui, setiap kali anda menjalankan git pull
dengan perubahan yang tidak dapat dilakukan, Anda dapat menghadapi masalah. Nasib baik, ada cara untuk keluar dari masalah dalam satu bahagian!

Pendekatan yang berbeza
Apabila anda mempunyai perubahan tempatan yang tidak disetujui dan masih ingin menarik versi baru dari pelayan jauh, kes penggunaan anda biasanya tergolong dalam salah satu senario berikut. Sama ada:
- anda tidak peduli dengan perubahan tempatan dan mahu menimpanya,
- anda sangat mementingkan perubahan dan ingin menerapkannya setelah perubahan jarak jauh,
- anda mahu memuat turun pengubahsuaian jauh tetapi belum menggunakannya
Setiap pendekatan memerlukan penyelesaian yang berbeza.
Anda Tidak Peduli Mengenai Perubahan Tempatan
Dalam kes ini, anda hanya mahu membuang semua perubahan tempatan yang tidak disetujui. Mungkin anda mengubah suai fail untuk bereksperimen, tetapi anda tidak memerlukan pengubahsuaian lagi. Yang anda sayangi adalah terkini dengan hulu.
Ini bermaksud bahawa anda menambah satu langkah lagi antara mengambil perubahan jarak jauh dan menggabungkannya. Langkah ini akan menetapkan semula cawangan ke keadaannya yang tidak diubah suai, sehingga memungkinkan git merge
untuk berfungsi.
git fetch git reset --hard HEAD git merge origin/$CURRENT_BRANCH
Jika anda tidak mahu menaip nama cawangan setiap kali anda menjalankan perintah ini, Git mempunyai pintasan nice menunjuk ke cawangan hulu: @{u}
. Cabang hulu adalah cabang di repositori jauh yang anda tolak dan dapatkan.
Beginilah rupa perintah di atas dengan jalan pintas:
git fetch git reset --hard HEAD git merge '@{u}'
Kami memetik jalan pintas dalam contoh untuk mengelakkan shell tidak menafsirkannya.
Anda Sangat Mengetahui Perubahan Tempatan
Apabila perubahan yang tidak disetujui adalah penting bagi anda, terdapat dua pilihan. Anda boleh melakukannya dan kemudian melakukan git pull
, atau anda boleh menyimpannya.
Menyekat bermaksud meletakkan perubahan sebentar untuk mengembalikannya kemudian. Untuk lebih tepat, git stash
buat komit yang tidak dapat dilihat di cawangan anda sekarang, tetapi masih dapat diakses oleh Git.
Untuk mengembalikan perubahan yang disimpan dalam simpanan terakhir, anda menggunakan git stash pop
arahan. Setelah berjaya menerapkan perubahan tersembunyi, perintah ini juga akan menghapus stash commit kerana tidak diperlukan lagi.
Aliran kerja boleh kelihatan seperti ini:
git fetch git stash git merge '@{u}' git stash pop
By default, the changes from the stash will become staged. If you want to unstage them, use the command git restore --staged
(if using Git newer than 2.25.0).
You Just Want to Download the Remote Changes
The last scenario is a little different from the previous ones. Let's say that you are in the middle of a very messy refactoring. Neither losing the changes nor stashing them is an option. Yet, you still want to have the remote changes available to run git diff
against them.
As you have probably figured out, downloading the remote changes does not require git pull
at all! git fetch
is just enough.
One thing to note is that by default, git fetch
will only bring you changes from the current branch. To get all the changes from all the branches, use git fetch --all
. And if you'd like to clean up some of the branches that no longer exist in the remote repository, git fetch --all --prune
will do the cleaning up!

Some Automation
Have you heard of Git Config? It's a file where Git stores all of the user-configured settings. It resides in your home directory: either as ~/.gitconfig
or ~/.config/git/config
. You can edit it to add some custom aliases that will be understood as Git commands.
For example, to have a shortcut equivalent to git diff --cached
(that shows the difference between the current branch and the staged files), you'd add the following section:
[alias] dc = diff --cached
After that, you can run git dc
whenever you wish to review the changes. Going this way, we can set up a few aliases related to the previous use cases.
[alias] pull_force = !"git fetch --all; git reset --hard HEAD; git merge @{u}" pf = pull_force pull_stash = !"git fetch --all; git stash; git merge @{u}; git stash pop"
This way, running git pull_force
will overwrite the local changes, while git pull_stash
will preserve them.
The Other Git Pull Force
Curious minds may have already discovered that there is such a thing as git pull --force
. However, this is a very different beast to what's presented in this article.
It may sound like something that would help us overwrite local changes. Instead, it lets us fetch the changes from one remote branch to a different local branch. git pull --force
only modifies the behavior of the fetching part. It is therefore equivalent to git fetch --force
.
Like git push
, git fetch
allows us to specify which local and remote branch do we want to operate on. git fetch origin/feature-1:my-feature
will mean that the changes in the feature-1
branch from the remote repository will end up visible on the local branch my-feature
. When such an operation modifies the existing history, it is not permitted by Git without an explicit --force
parameter.
Just like git push --force
allows overwriting remote branches, git fetch --force
(or git pull --force
) allows overwriting local branches. It is always used with source and destination branches mentioned as parameters. An alternative approach to overwriting local changes using git --pull force
could be git pull --force "@{u}:HEAD"
.
Conclusion
Dunia Git sangat luas. Artikel ini merangkumi hanya satu aspek penyelenggaraan repositori: memasukkan perubahan jarak jauh ke dalam repositori tempatan. Walaupun senario sehari-hari ini memerlukan kita melihat lebih mendalam mengenai mekanisme dalaman alat kawalan versi ini.
Mempelajari kes penggunaan sebenar membantu anda memahami dengan lebih baik bagaimana Git berfungsi dengan baik. Ini seterusnya, akan membuat anda merasa diberdayakan setiap kali anda menghadapi masalah. Kita semua melakukannya dari semasa ke semasa.