git pull VS git fetch Vs git rebase


294

Pertanyaan lain mengatakan git pullseperti git fetch+ git merge.

Tapi apa perbedaan antara git pullVS git fetch+ git rebase?


2
seseorang harus membersihkan tautan ... dan saya kagum pada berapa banyak suara yang didapat pertanyaan lain.
— xenoterracide

13
@ xeno: Saya pikir ini hanya hitungan berapa banyak orang yang pergi "Saya punya pertanyaan ini juga"
— bobobobo

45
Suatu hari saya akan menemukan waktu untuk benar-benar membaca dokumentasi git, tetapi sampai saat itu, saya menambahkan suara saya untuk jenis pertanyaan ini
— Eran Medan

Jawaban:


336

Seharusnya cukup jelas dari pertanyaan Anda bahwa Anda sebenarnya hanya bertanya tentang perbedaan antara git mergedan git rebase.

Jadi anggaplah Anda berada dalam kasus umum - Anda telah melakukan beberapa pekerjaan pada cabang master Anda, dan Anda menarik dari asal, yang juga telah melakukan beberapa pekerjaan. Setelah pengambilan, semuanya terlihat seperti ini:

- o - o - o - H - A - B - C (master)
               \
                P - Q - R (origin/master)

Jika Anda bergabung pada titik ini (perilaku default git pull), dengan asumsi tidak ada konflik, Anda berakhir dengan ini:

- o - o - o - H - A - B - C - X (master)
               \             /
                P - Q - R --- (origin/master)

Jika di sisi lain Anda melakukan rebase yang sesuai, Anda akan berakhir dengan ini:

- o - o - o - H - P - Q - R - A' - B' - C' (master)
                          |
                          (origin/master)

Konten pohon kerja Anda harus berakhir sama dalam kedua kasus; Anda baru saja membuat riwayat berbeda sebelum itu . Rebase menulis ulang sejarah Anda, membuatnya seolah-olah Anda telah melakukan di atas cabang master baru asal ( R), alih-alih di tempat Anda awalnya berkomitmen ( H). Anda seharusnya tidak pernah menggunakan pendekatan rebase jika orang lain sudah menarik dari cabang master Anda.

Akhirnya, perhatikan bahwa Anda benar-benar dapat mengatur git pullcabang yang diberikan untuk menggunakan rebase alih-alih menggabungkan dengan mengatur parameter config branch.<name>.rebasemenjadi true. Anda juga dapat melakukan ini untuk satu tarikan menggunakan git pull --rebase.


39
Apa yang terjadi jika Anda rebase setelah seseorang telah menarik dari cabang utama Anda? Apakah itu melanggar repo?
— Didier A.

12
Bagaimana Anda tahu jika seseorang telah menarik dari cabang utama Anda?
— Frank

29
Jika Anda tidak tahu pasti bahwa seseorang belum , Anda harus berasumsi bahwa mereka memilikinya.
— Chris Down

4
Saya hanya berpikir bahwa kecuali Anda juga mendorong perubahan di tempat lain selain dari asal / master, saya tidak melihat pernah mengalami masalah dengan orang lain yang telah menarik perubahan tersebut, karena jika Anda sudah mendorong perubahan ini ke asal / Tuan, tidak akan ada yang bisa rebase di tempat pertama. Tampak bagi saya bahwa peringatan itu benar-benar hanya penting dalam kasus di mana Anda memiliki sesuatu yang lebih kompleks daripada X -> asal / X, tetapi saya bisa saja salah. Jika seseorang mengetahui skenario yang saya hadapi, silakan bagikan.
— neverfox

1
@SteveChambers Tidak, bukan itu hasilnya. Garis-garis hanya mewakili leluhur komit, yaitu A adalah induk dari B. Tidak ada implikasi tentang apakah Q atau B adalah yang pertama kali. Semua operasi ini didasarkan pada grafik komit, bukan waktu. Rebase mencangkokkan beberapa komitmen, dengan hasil seperti yang saya tunjukkan tidak peduli apa cap waktu komit.
— Cascabel

9

TLDR:

git pullseperti berlari git fetchlalu git merge
git pull --rebaseseperti git fetchsaat itugit rebase

Sebagai balasan untuk pernyataan pertama Anda,

git pullseperti git fetch+ git merge.

"Dalam mode standarnya, tarikan git adalah singkatan untuk git fetchdiikuti oleh git mergeFETCH_HEAD" Lebih tepatnya, git pullberjalan git fetchdengan parameter yang diberikan dan kemudian panggilan git mergeuntuk menggabungkan kepala cabang yang diambil ke cabang saat ini "

(Ref: https://git-scm.com/docs/git-pull )


Untuk pernyataan / pertanyaan kedua Anda:

'Tapi apa perbedaan antara git pullVS git fetch+ git rebase'

Sekali lagi, dari sumber yang sama:
git pull --rebase

"Dengan --rebase, ia menjalankan git rebase bukannya git merge."


Sekarang, jika Anda ingin bertanya

'perbedaan antara mergedan rebase'

yang dijawab di sini juga:
https://git-scm.com/book/en/v2/Git-Branching-Rebasing
(perbedaan antara mengubah cara riwayat versi dicatat)


2
Saya ingin menyebutkan bahwa "git pull --rebase" seperti "git fetch kemudian git rebase" sebagian besar waktu - tetapi tidak selalu. Dalam beberapa situasi, "git pull --rebase" melakukan sedikit lebih banyak. Lihat contoh yang sering direferensikan di sini: gitolite.com/git-pull--rebase
— Daniel K.

1
Terima kasih banyak atas jawaban Anda. Saya benar-benar mengerti cara git fetch + git rebasekerja perintah dari sekarang. Tidak ada lagi konflik di pohon git kami mulai sekarang :)
— Travis Le
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.