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?

michael
sumber
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.

Cascabel
sumber
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)

harshvchawla
sumber
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