Kadang-kadang kita memiliki hulu yang rebased / rewound cabang tempat kita bergantung. Ini bisa menjadi masalah besar - menyebabkan konflik berantakan bagi kami jika kami hilir.
Keajaiban itu git pull --rebase
Tarikan git normal, secara longgar, adalah sesuatu seperti ini (kita akan menggunakan asal yang disebut remote dan cabang bernama foo dalam semua contoh ini):
# assume current checked out branch is "foo"
git fetch origin
git merge origin/foo
Pada pandangan pertama, Anda mungkin berpikir bahwa git pull --rebase melakukan ini:
git fetch origin
git rebase origin/foo
Tapi itu tidak akan membantu jika rebase hulu melibatkan "squashing" (artinya patch-id dari komit berubah, tidak hanya pesanan mereka).
Yang berarti git pull --rebase harus melakukan sedikit lebih dari itu. Inilah penjelasan tentang apa yang dilakukannya dan bagaimana caranya.
Katakanlah titik awal Anda adalah ini:
a---b---c---d---e (origin/foo) (also your local "foo")
Waktu berlalu, dan Anda telah membuat beberapa komitmen di atas "foo" Anda sendiri:
a---b---c---d---e---p---q---r (foo)
Sementara itu, dalam kemarahan anti-sosial, pengelola hulu tidak hanya mengubah "foo" -nya, ia bahkan menggunakan satu atau dua squash. Rantai komitnya sekarang terlihat seperti ini:
a---b+c---d+e---f (origin/foo)
Git pull pada titik ini akan menghasilkan kekacauan. Bahkan git mengambil; git rebase origin / foo tidak akan memotongnya, karena melakukan "b" dan "c" di satu sisi, dan melakukan "b + c" di sisi lain, akan konflik. (Dan juga dengan d, e, dan d + e).
Apa yang git pull --rebase
dilakukan, dalam hal ini, adalah:
git fetch origin
git rebase --onto origin/foo e foo
Ini memberi Anda: