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:
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 .
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
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.
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.
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 .
Jawaban:
ambil vs tarik
fetch
akan mengunduh perubahan apa pun dari cabang * remote, memperbarui data repositori Anda, tetapi membiarkan cabang * lokal Anda tidak berubah.pull
akan melakukanfetch
dan tambahanmerge
perubahan ke cabang lokal Anda.Apa bedanya?
pull
memperbarui cabang lokal Anda dengan perubahan dari cabang yang ditarik. Afetch
tidak memajukan cabang lokal Anda.gabungkan vs rebase
Diberikan sejarah berikut:
merge
bergabung 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
merge
akan:rebase
akan 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
rebase
akan:Apa bedanya? A
merge
tidak mengubah leluhur dari komitmen. Arebase
menulis ulang nenek moyang dari komitmen lokal Anda.*
Penjelasan ini mengasumsikan bahwa cabang saat ini adalah cabang lokal, dan cabang yang ditentukan sebagai argumen untukfetch
,pull
,merge
, ataurebase
merupakan cabang terpencil. Ini adalah kasus yang biasa.pull
, misalnya, akan mengunduh perubahan dari cabang yang ditentukan , memperbarui repositori Anda danmerge
perubahan ke cabang saat ini .sumber
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 :
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.
sumber
git merge <remote>/<branch>
. misalnya, jika Anda adalah cabang master dan remote Anda bernama asal, Anda dapat melakukannyagit merge origin/master
.pull vs fetch :
Cara saya memahami ini, adalah yang
git pull
hanyagit fetch
diikuti olehgit 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_branch
akan menggabungkananother_branch
ke 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 dananother_branch
. Yaitu titik sebelum cabang bercabang. Kemudian git akan memindahkan titik divergen ini ke kepalaanother_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:
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.
sumber
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 merge
ketika berhadapan dengan alur kerja berbasis fitur atau jika saya tidak terbiasa dengan rebase. Tetapi, jika saya ingin yang lebih bersih, sejarah linear makagit rebase
lebih tepat. Untuk detail lebih lanjut pastikan untuk memeriksa artikel gabungan ini atau rebase .sumber