git menarik dari master ke cabang pengembangan

496

Saya memiliki cabang bernama dmgr2 (pengembangan) dan saya ingin menarik dari cabang utama (situs langsung) dan memasukkan semua perubahan ke cabang pengembangan saya. apakah ada cara yang lebih baik untuk melakukan ini? inilah yang telah saya rencanakan untuk dilakukan, setelah melakukan perubahan:

git checkout dmgr2
git pull origin master

ini harus menarik perubahan langsung ke cabang pengembangan saya, atau apakah saya salah ini?

Matthew Colley
sumber
1
pertama komit semua perubahan Anda di cabang dmgr2. dan kemudian arahkan ke master 1.git checkout master dan kemudian dapatkan perubahan terbaru 2.git pull 3.git gabung dmgr2 4.git push -u master asal Dan kemudian kembali ke dmgr2 Anda 5.git checkout dmgr2
mat_vee
saya sudah melakukan semua perubahan pada cabang dmgr2, maaf lupa menambahkannya
Matthew Colley
1
jika saya melakukan langkah 4, tidak akan mendorong perubahan perkembangan saya menjadi master? Saya tidak ingin melakukan itu
Matius Colley
Jadi yang Anda katakan adalah Anda ingin membawa perubahan dari cabang master Anda, ke cabang dev Anda?
JcKelley
9
Beralih ke devcabang dengan a git checkout dev. Lalu git pull --rebase origin master. Jika Anda beruntung, tidak akan ada konflik dan dev akan memiliki perubahan terbaru dari master.
jww

Jawaban:

725

Langkah-langkah yang Anda daftarkan akan berhasil, tetapi ada cara yang lebih panjang yang memberi Anda lebih banyak opsi:

git checkout dmgr2      # gets you "on branch dmgr2"
git fetch origin        # gets you up to date with origin
git merge origin/master

The fetchperintah dapat dilakukan pada setiap titik sebelum merge, yaitu, Anda dapat menukar urutan pengambilan dan kasir, karenafetch hanya pergi ke bernama jarak jauh ( origin) dan mengatakan untuk itu: "beri aku segala sesuatu yang harus Anda bahwa saya tidak ", yaitu, semua komit di semua cabang. Mereka disalin ke repositori Anda, tetapi diberi nama origin/branchuntuk cabang apa pun yang bernama branchpada remote.

Pada titik ini Anda dapat menggunakan penampil apa pun (git log ,, gitkdll) untuk melihat "apa yang mereka miliki" yang tidak Anda miliki, dan sebaliknya. Kadang-kadang ini hanya berguna untuk Perasaan Fuzzy Hangat ("ah, ya, itulah sebenarnya yang saya inginkan") dan kadang-kadang berguna untuk mengubah strategi sepenuhnya ("whoa, saya belum menginginkan hal ITU").

Akhirnya, mergeperintah mengambil komit yang diberikan, yang dapat Anda sebutkan origin/master, dan melakukan apa pun untuk membawa komit dan leluhurnya, ke cabang apa pun yang Anda gunakan saat menjalankanmerge . Anda dapat menyisipkan --no-ffatau --ff-onlymencegah maju cepat, atau menggabungkan hanya jika hasilnya maju cepat, jika Anda mau.

Saat Anda menggunakan urutan:

git checkout dmgr2
git pull origin master

yang pullmenginstruksikan perintah git untuk menjalankan git fetch, dan kemudian setara moral git merge origin/master. Jadi ini hampir sama dengan melakukan dua langkah dengan tangan, tetapi ada beberapa perbedaan halus yang mungkin tidak terlalu mengkhawatirkan Anda. (Khususnya fetchlangkah yang dijalankan hanyapull membawa , dan itu tidak memperbarui referensi di repo Anda: 1 origin/master setiap komit baru angin disebut-hanya dengan khusus FETCH_HEAD. Referensi)

Jika Anda menggunakan yang lebih eksplisit git fetch origin(kemudian secara opsional melihat-lihat) dan kemudian git merge origin/masterberurutan, Anda juga dapat membuat lokal Anda tetap masterup-to-date dengan remote, dengan hanya satu fetchrun melintasi jaringan:

git fetch origin
git checkout master
git merge --ff-only origin/master
git checkout dmgr2
git merge --no-ff origin/master

contohnya.


1 Bagian kedua ini telah diubah — saya katakan "diperbaiki" —di git 1.8.4, yang sekarang memperbarui referensi "cabang jarak jauh" secara oportunis. (Itu, seperti catatan rilis mengatakan, keputusan desain yang disengaja untuk melewati pembaruan, tetapi ternyata lebih banyak orang lebih suka git memperbaruinya. Jika Anda ingin SHA-1 cabang jarak jauh yang lama, defaultnya adalah disimpan di , dan dengan demikian dapat dipulihkan dari reflog. Ini juga memungkinkan fitur git 1.9 / 2.0 baru untuk menemukan rebase hulu.)

torek
sumber
28
Saya hanya meminta teman, eh - bagaimana Anda akan membatalkan blok kode pertama yang Anda miliki di sini (checkout / fetch / merge)?
Rich Bradshaw
10
@RichBradshaw: git checkoutbiasanya non-destruktif dan biasanya tidak ada alasan untuk membatalkan git fetch, jadi sepertinya Anda menanyakan cara untuk mundur komit gabungan. Jawabannya sama dengan komit lainnya: baik git resetatau git revert. Untuk perubahan yang tidak dipublikasikangit reset biasanya merupakan metode terbaik; untuk perubahan yang sudah dilakukan orang lain, git revertmungkin lebih baik, tetapi lihat saran Linus Torvald tentang mengembalikan gabungan: kernel.org/pub/software/scm/git/docs/howto/…
torek
2
@ WeDoTDD: Saya tidak mengerti pertanyaannya. Ada sejumlah perintah untuk melihat grafik komit ( gitk, git log --graphdengan atau tanpa --oneline, dan seterusnya) dan Anda bisa git showatau git show -mgabungan komit, atau gunakan git diff. Dalam semua kasus ini, Anda menentukan program saat Anda memasukkan perintah pada baris perintah.
torek
1
@torek: mencoba cara Anda: cabang checkout git dan kemudian git pull master asal, tetapi menarik semua perubahan master sebagai satu perubahan yang harus dilakukan secara lokal lagi, alih-alih menariknya dengan riwayat dan pesan komit mereka, jadi setelah memperbarui lokal master dan beralih ke cabang, "master git rebase" melakukan pekerjaan dengan semua konflik untuk diselesaikan, dan kemudian saya menambahkan ke "git pull --rebase" dan menangani lagi semua konflik, dan kemudian git mendorong cabang asal untuk mendapatkan semua selaras. Saya kira harus ada cara yang lebih baik untuk itu - apakah saya benar?
user10556443
1
@torek: Saya setuju hasil yang saya dapatkan adalah proses yang melelahkan yang memaksa saya untuk menangani pengulangan rebase & penggabungan & ... setiap kali saya ingin mendapatkan pembaruan dari master ... Tapi, cara yang diusulkan, yang saya akui jauh lebih mudah, dapatkan semua perubahan di bawah satu perubahan yang tidak dikomit di cabang lokal tanpa menjaga perintah / riwayat master Saya akan senang mengetahui saran yang lebih baik bagaimana menggunakan "fetch" dan melacak master tanpa perlu menggunakan "pull" dll.
user10556443
14

Situasi : Bekerja di cabang lokal saya, tetapi saya suka terus mengikuti perkembangan di cabang pengembangan yang bernama dev.

Solusi : Biasanya, saya lebih suka melakukan:

git fetch
git rebase origin/dev
greenridinghood
sumber
15
Dengan penafian biasa bahwa rebase hanya boleh dilakukan jika cabang lokal hanya lokal, artinya, belum didorong ke mana pun karena menulis ulang sejarah.
Locus
8

Ini Berhasil untuk saya. Untuk mendapatkan kode terbaru dari master ke cabang saya

git rebase origin/master

Pratik Gaurav
sumber
Jangan lupa git fetch origindulu.
lenooh
3

Skenario :

Saya memiliki pembaruan master dan pembaruan cabang saya, saya ingin cabang saya melacak master dengan rebasing, untuk menjaga semua sejarah dilacak dengan benar, sebut saja cabang saya Mybranch

Solusi :

git checkout master    
git pull --rebase    
git checkout Mybranch    
git rebase master
git push -f origin Mybranch
  • perlu menyelesaikan semua konflik dengan git mergetool &, git rebase --continue, git rebase --skip, git add -u, sesuai dengan situasi dan petunjuk git, sampai semua terselesaikan

(koreksi ke tahap terakhir, milik Tzachi Cohen, menggunakan "-f" pasukan git untuk "memperbarui sejarah" di server)

sekarang branch harus disejajarkan dengan master dan rebased, juga dengan remote yang diperbarui, jadi pada git log tidak ada "di belakang" atau "depan", hanya perlu menghapus semua konflik lokal * .orig file untuk menjaga folder "bersih"

pengguna10556443
sumber