Dalam git bagaimana mengambil berbeda dari tarik dan bagaimana menggabungkan berbeda dari rebase?

160

Aku hanya tidak mengerti ini. Saya telah membaca banyak di web dan buku-buku dan ada sesuatu yang tidak ada di kepala saya. Dapatkah seseorang tolong beri saya versi boneka dari yang berikut:

  • git fetch vs pull
  • git merge vs rebase
techsjs2013
sumber
24
Saya bersimpati dengan si penanya. Dokumentasi dan sarannya begitu berat dan kemungkinan permutasi alur kerja begitu besar sehingga orang menjadi sangat bingung. Kepala seseorang meledak dan seseorang tidak tahu harus bertanya apa, itu tidak jelas.
Ed Randall
3
Mengapa tidak memilih jawaban pestrella yang diterima?
Arashsoft
@Arashsoft karena dia tidak terlihat sejak 2013
VdeX

Jawaban:

415

ambil vs tarik

fetch akan mengunduh perubahan apa pun dari cabang * remote, memperbarui data repositori Anda, tetapi membiarkan cabang * lokal Anda tidak berubah.

pullakan melakukan fetchdan tambahan mergeperubahan ke cabang lokal Anda.

Apa bedanya? pullmemperbarui cabang lokal Anda dengan perubahan dari cabang yang ditarik. A fetchtidak memajukan cabang lokal Anda.

gabungkan vs rebase

Diberikan sejarah berikut:

          C --- D --- E lokal
         /
    A --- B --- F --- G jarak jauh

mergebergabung dengan dua sejarah perkembangan bersama. Ini melakukan ini dengan memutar ulang perubahan yang terjadi di cabang lokal Anda setelah itu menyimpang di atas cabang jarak jauh, dan mencatat hasilnya dalam komit baru. Operasi ini mempertahankan leluhur dari setiap komit.

Efek dari mergeakan:

          C --- D --- E lokal
         / \
    A --- B --- F --- G --- H jarak jauh

rebaseakan mengambil komit yang ada di cabang lokal Anda dan menerapkannya di atas cabang jarak jauh. Operasi ini menulis ulang leluhur dari komitmen lokal Anda.

Efek dari rebaseakan:

                  C '- D' - E 'lokal
                 /
    A --- B --- F --- G jarak jauh

Apa bedanya? A mergetidak mengubah leluhur dari komitmen. A rebase menulis ulang nenek moyang dari komitmen lokal Anda.

*Penjelasan ini mengasumsikan bahwa cabang saat ini adalah cabang lokal, dan cabang yang ditentukan sebagai argumen untuk fetch, pull, merge, atau rebasemerupakan cabang terpencil. Ini adalah kasus yang biasa. pull, misalnya, akan mengunduh perubahan dari cabang yang ditentukan , memperbarui repositori Anda dan mergeperubahan ke cabang saat ini .

pestrella
sumber
31
Sejauh ini, ini adalah penjelasan paling sederhana dan terbaik tanpa masuk ke dalam perdebatan di balik setiap praktik. Terima kasih!
Jonathan S. Fisher
3
Jawaban yang benar-benar emas
ChaseMoskal
5
Seandainya aku bisa "favorit" jawaban ini. Mungkin saya hanya akan mencetaknya dan menempelkannya di dinding saya.
LarsH
2
Saya akan mengatakan yang terbaik dari jawaban terbaik yang saya dapatkan di stackoverflow, Terima kasih
Shahab J
1
Jika mengambil hanya mengunduh perubahan dari cabang jarak jauh dan memperbarui data repositori, tetapi membiarkan cabang lokal tidak berubah, lalu apa gunanya mengambil jika direktori kerja tidak menunjukkan / mencerminkan perubahan? Pertanyaan saya awalnya adalah bagaimana saya bisa melihat perubahan yang dilakukan orang lain dan kemudian memutuskan apakah saya ingin menggabungkannya ke direktori kerja saya (yaitu bereksperimen dengan perubahan orang lain untuk memastikan itu tidak merusak pekerjaan saya) tapi saya masih bingung bagaimana cara melakukannya? Haruskah saya pul dan percobaan / jelajahi, dan jika bermasalah, lakukan hard reset?
28

Ambil vs Tarik

Git fetch hanya memperbarui data repo Anda, tetapi tarikan git pada dasarnya akan melakukan pengambilan dan kemudian menggabungkan cabang yang ditarik

Apa perbedaan antara 'git pull' dan 'git fetch'?


Gabungkan vs Rebase

dari Atlassian SourceTree Blog, Merge or Rebase :

Penggabungan menyatukan dua garis pembangunan sekaligus menjaga leluhur dari masing-masing sejarah komit.

Sebaliknya, rebasing menyatukan garis-garis perkembangan dengan menulis ulang perubahan dari cabang sumber sehingga mereka muncul sebagai anak-anak dari cabang tujuan - secara efektif berpura-pura bahwa komit itu ditulis di atas cabang tujuan selama ini.

Juga, periksa Learn Git Branching , yang merupakan permainan bagus yang baru saja diposkan ke HackerNews ( tautan ke pos ) dan ajarkan banyak trik bercabang dan menggabungkan. Saya percaya ini akan sangat membantu dalam hal ini.

Felipe Sabino
sumber
terima kasih Felips .. jadi jika saya mengambil dari jarak jauh cabang master saya tidak akan memiliki pembaruan? juga sepertinya saya harus melakukan rebase lebih dari merga
techsjs2013
rebase vs merge tergantung pada apa niat Anda, mengingat bahwa rebase menulis ulang semua sejarah yang dilakukan. Dan ya, jika Anda hanya mengambil, cabang utama tidak akan berubah, Anda harus menggabungkan (atau menarik) agar menerapkan perubahan jarak jauh
Felipe Sabino
git merge <remote>/<branch>. misalnya, jika Anda adalah cabang master dan remote Anda bernama asal, Anda dapat melakukannya git merge origin/master.
Felipe Sabino
jadi sepertinya saya harus selalu melakukan master checkout git git mengambil git diff asal / master git rebase master asal
techsjs2013
8

pull vs fetch :

Cara saya memahami ini, adalah yang git pullhanya git fetchdiikuti oleh git merge. Yaitu Anda mengambil perubahan dari cabang jauh dan kemudian menggabungkannya ke cabang saat ini.


menggabungkan vs rebase :

Gabungan akan melakukan seperti yang dikatakan perintah; menggabungkan perbedaan antara cabang saat ini dan cabang yang ditentukan (ke dalam cabang saat ini). Yaitu perintah git merge another_branchakan menggabungkan another_branchke cabang saat ini.

Rebase bekerja sedikit berbeda dan agak keren. Katakanlah Anda melakukan perintah git rebase another_branch. Git pertama akan menemukan versi umum terbaru antara cabang saat ini dan another_branch. Yaitu titik sebelum cabang bercabang. Kemudian git akan memindahkan titik divergen ini ke kepala another_branch. Akhirnya, semua komit di cabang saat ini karena titik divergen asli diputar ulang dari titik divergen baru. Ini menciptakan sejarah yang sangat bersih, dengan lebih sedikit cabang dan gabungan.

Namun, ini bukan tanpa jebakan! Karena riwayat versi "ditulis ulang", Anda hanya boleh melakukan ini jika komit hanya ada di repo git lokal Anda. Yaitu: Jangan pernah melakukan ini jika Anda telah mendorong komit ke repo jarak jauh.

Penjelasan tentang rebasing diberikan dalam ini buku online adalah cukup baik, dengan mudah memahami ilustrasi.


tarik dengan rebasing alih-alih bergabung

Saya sebenarnya menggunakan rebase cukup banyak, tetapi biasanya dikombinasikan dengan tarikan:

git pull --rebase

akan mengambil perubahan jarak jauh dan kemudian rebase alih-alih bergabung. Yaitu itu akan mengulang semua komit lokal Anda dari terakhir kali Anda melakukan tarikan. Saya menemukan ini jauh lebih bersih daripada melakukan tarikan normal dengan penggabungan, yang akan membuat komit tambahan dengan penggabungan.

Steinar
sumber
jadi jika saya bekerja di dan cabang dan saya ingin menggabungkannya kembali ke master sebelum saya melakukan push. Saya harus checkout master, lalu lakukan perbaikan rebase?
techsjs2013
Saya masih tidak berdiri di bawah penggabungan vs rebase
techsjs2013
Saya pikir ilustrasi yang diberikan oleh jawaban dari pestrella menunjukkan perbedaan yang cukup jelas. Juga, periksa: git-scm.com/book/en/Git-Branching-Rebasing - yang bisa menjelaskannya dengan baik (tautan yang sama dengan yang ada di jawaban, tetapi diberikan lagi untuk yang malas).
Steinar
0

Penggabungan - KEPALA cabang akan menghasilkan komit baru, melestarikan nenek moyang dari setiap sejarah komit. Sejarah dapat tercemar jika komit gabungan dibuat oleh banyak orang yang bekerja pada cabang yang sama secara paralel.

Rebase - Menulis ulang perubahan dari satu cabang ke cabang lain tanpa membuat komit baru. Riwayat kode disederhanakan, linier dan dapat dibaca tetapi tidak berfungsi dengan permintaan tarik, karena Anda tidak dapat melihat perubahan kecil apa yang dilakukan seseorang.

Saya akan gunakan git mergeketika berhadapan dengan alur kerja berbasis fitur atau jika saya tidak terbiasa dengan rebase. Tetapi, jika saya ingin yang lebih bersih, sejarah linear maka git rebaselebih tepat. Untuk detail lebih lanjut pastikan untuk memeriksa artikel gabungan ini atau rebase .

Nesha Zoric
sumber