Git pull sampai komit tertentu

97

Saya ingin melakukan git pulltetapi hanya sampai komit tertentu.

 A->B->C->D->E->F (Remote master HEAD)

jadi misalkan local masterHEAD saya menunjuk ke B, dan saya ingin menarik sampai E. Apa yang harus saya lakukan ?

Ini tidak menarik komit tertentu, ini menarik ke komit tertentu.

Ninja420
sumber
kemungkinan duplikat dari Tarik komit tertentu dari repositori git jarak jauh
Dan Getz
3
git fetchdan git merge E.
aduk
Saat ini saya di B misalnya, tetapi saya hanya ingin menarik C, E dan F. Saya ingin menghapus D. Terima kasih!
Frenkey
@Frenkey Anda dapat menggabungkan master kemudian menghapus tiga komit terakhir dan kemudian memilih dua yang terakhir. Anda juga dapat mencoba rebase -i untuk penggabungan git yang lebih terkontrol
Ninja420
bagaimana jika saya hanya ingin mengambil perubahan dari C, tidak menyertakan perubahan A dan B hanya C? Bagaimana saya bisa melakukan itu?
Vikas Chauhan

Jawaban:

114

git pulltidak lain adalah git fetchdiikuti oleh git merge. Jadi yang bisa Anda lakukan adalah

git fetch remote example_branch

git merge <commit_hash>

unrealsoul007
sumber
Apa yang dimaksud dengan "Lihat ini"?
developerbmw
@Brett Lupa memposting tautan .. menghapus seluruhnya
unrealsoul007
@ unrealsoul007 ini akan menggabungkan hanya satu komit tertentu kan? Jadi untuk menarik dari B ke E, perintahnya adalah git merge <commit_hash C> <commit_hash D> <commit_hash E> kan?
Wim Feijen
6
@WimFeijen git merge Eakan bergabung Edengan semua leluhurnya Cdan D(git tahu itu Adan Btidak perlu digabungkan karena mereka sudah ada di cabang Anda). Jika Anda HANYA menginginkan perubahan Emaka Anda harus melakukannya git cherry-pick E.
neXus
Terima kasih teman-teman atas jawabannya, saya sedang mencari masalah yang sama.
Akash Bisariya
22

Pertama, ambil komit terbaru dari repo jarak jauh. Ini tidak akan mempengaruhi cabang lokal Anda.

git fetch origin

Kemudian periksa cabang pelacakan jarak jauh dan lakukan git log untuk melihat komit

git checkout origin/master
git log

Ambil commit hash dari commit yang ingin Anda gabungkan (atau hanya ~ 5 karakter pertama) dan gabungkan commit itu ke master

git checkout master
git merge <commit hash>
developerbmw
sumber
1
Saya tidak memilih Anda karena ini tidak berfungsi seperti yang diiklankan. Pertama-tama, dengan metode Anda "git fetch origin", metode ini mengambil semua cabang jarak jauh (ini harus ditunjukkan secara eksplisit, terutama untuk orang yang bekerja dalam proyek dengan banyak cabang dan besar). Kedua, dengan metode ini "git merge <commit hash>" tidak menggabungkan histori lokal Anda hingga commit yang diinginkan, jika Anda kembali ke histori. Contoh: Anda secara lokal di commit 100, Anda ingin mendapatkan hingga 150, dengan mengambil semuanya (dengan HEAD jarak jauh berada di 100).
Placeholder
8
@Placeholder Anda harus membaca manual git fetchsebelum menulis omong kosong seperti itu. Selanjutnya, Anda harus membaca pertanyaan asli dan jawaban saya. Jika Anda mengikuti jawaban saya maka Anda tidak akan "kembali dalam sejarah" seperti yang saya perintahkan secara eksplisit kepada pengguna git checkout master. Secara keseluruhan, tolong jangan posting sesuatu jika Anda kurang jelas 50% tentang apa yang Anda lakukan.
developerbmw
1
Jika tidak jelas bagi orang lain, git fetch originambil asal secara eksplisit .
Daniel Farrell
2
Ini bekerja dengan sempurna dan lebih baik dijelaskan daripada jawaban yang diterima.
Walen
1
Jawaban terbaik, Bekerja dengan Sempurna
Asfandyar Khan
13

Anda juga dapat menarik komit terbaru dan membatalkan sampai komit yang Anda inginkan:

git pull origin master
git reset --hard HEAD~1

Ganti masterdengan cabang yang Anda inginkan.

Gunakan git log untuk melihat komit mana yang ingin Anda kembalikan:

git log

Secara pribadi, ini bekerja untuk saya lebih baik.

Pada dasarnya, yang dilakukannya adalah menarik komit terbaru, dan Anda secara manual mengembalikan komit satu per satu. Gunakan git log untuk melihat riwayat komit.

Poin bagus: Bekerja seperti yang diiklankan. Anda tidak harus menggunakan hash komit atau menarik cabang yang tidak dibutuhkan.

Poin buruk: Anda harus mengembalikan komitmen satu per satu.

PERINGATAN: Lakukan / simpan semua perubahan lokal Anda, karena dengan --hardAnda akan kehilangannya. Gunakan dengan resiko Anda sendiri!

Placeholder
sumber
3
Saya tidak tahu mengapa suara negatifnya, tampaknya ini cara terbersih, dan segera setelah Anda ingin mendapatkan informasi terbaru, tarikan sederhana akan dilakukan, tidak seperti beberapa jawaban lainnya
Mauricio Pasquier Juan
Jangan juga mengapa tidak lebih banyak suara positif, satu-satunya downside adalah Anda harus pergi ke HEADsebelum kembali - dan saya tidak tahu apa yang akan terjadi jika Anda harus menyelesaikan konflik. Tetapi solusi ini memungkinkan untuk git pull --rebase, dan bertentangan dengan apa yang dikatakan Anda dapat langsung mengatur ulang kembali ke Nkomit yang lalu dengan git reset --hard HEAD~N(yaitu untuk 3 komit, git reset --hard HEAD~3).
Stock Overflaw
2

Jika Anda menggabungkan komit ke cabang Anda, Anda harus mendapatkan semua riwayat di antaranya.

Mengamati:

$ git init ./
Menginisialisasi repositori Git kosong di /Users/dfarrell/git/demo/.git/
$ echo 'a'> surat
$ git tambahkan huruf
$ git commit -m 'Surat Awal'
[master (root-commit) 6e59e76] Surat Awal
 1 file diubah, 1 penyisipan (+)
 buat mode 100644 huruf
$ echo 'b' >> surat
$ git tambahkan huruf && git commit -m 'Menambahkan huruf'
[master 7126e6d] Menambahkan surat
 1 file diubah, 1 penyisipan (+)
$ echo 'c' >> surat; git menambahkan huruf && git commit -m 'Menambahkan huruf'
[master f2458be] Menambahkan surat
 1 file diubah, 1 penyisipan (+)
$ echo 'd' >> surat; git menambahkan huruf && git commit -m 'Menambahkan huruf'
[master 7f77979] Menambahkan surat
 1 file diubah, 1 penyisipan (+)
$ echo 'e' >> surat; git menambahkan huruf && git commit -m 'Menambahkan huruf'
[master 790eade] Menambahkan surat
 1 file diubah, 1 penyisipan (+)
$ git log
commit 790eade367b0d8ab8146596cd717c25fd895302a
Penulis: Dan Farrell 
Tanggal: Kamis 16 Juli 14:21:26 2015 -0500

    Menambahkan surat

komit 7f77979efd17f277b4be695c559c1383d2fc2f27
Penulis: Dan Farrell 
Tanggal: Kamis 16 Juli 14:21:24 2015 -0500

    Menambahkan surat

melakukan f2458bea7780bf09fe643095dbae95cf97357ccc
Penulis: Dan Farrell 
Tanggal: Kamis 16 Juli 14:21:19 2015 -0500

    Menambahkan surat

komit 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Penulis: Dan Farrell 
Tanggal: Kamis 16 Juli 14:20:52 2015 -0500

    Menambahkan surat

commit 6e59e7650314112fb80097d7d3803c964b3656f0
Penulis: Dan Farrell 
Tanggal: Kamis 16 Juli 14:20:33 2015 -0500

    Surat Awal
$ git checkout 6e59e7650314112fb80097d7d3803c964b3656f
$ git checkout 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Catatan: memeriksa '7126e6dcb9c28ac60cb86ae40fb358350d0c5fad'.

Anda berada dalam status 'HEAD terlepas'. Anda bisa melihat-lihat, bereksperimen
mengubah dan melakukannya, dan Anda dapat membuang komitmen apa pun yang Anda buat dalam hal ini
status tanpa memengaruhi cabang apa pun dengan melakukan pembayaran lain.

Jika Anda ingin membuat cabang baru untuk mempertahankan komitmen yang Anda buat, Anda dapat melakukannya
melakukannya (sekarang atau nanti) dengan menggunakan -b dengan perintah checkout lagi. Contoh:

  git checkout -b new_branch_name

HEAD sekarang di 7126e6d ... Menambahkan surat
$ git checkout -b B 7126e6dcb9c28ac60cb86ae40fb358350d0c5fad
Beralih ke cabang baru 'B'
$ git pull 790eade367b0d8ab8146596cd717c25fd895302a
fatal: '790eade367b0d8ab8146596cd717c25fd895302a' tampaknya bukan repositori git
fatal: Tidak dapat membaca dari repositori jarak jauh.

Harap pastikan Anda memiliki hak akses yang benar
dan repositori ada.
$ git merge 7f77979efd17f277b4be695c559c1383d2fc2f27
Memperbarui 7126e6d..7f77979
Maju cepat
 surat | 2 ++
 1 file diubah, 2 sisipan (+)
$ surat kucing
Sebuah
b
c
d
Daniel Farrell
sumber
1

Ini bekerja untuk saya:

git pull origin <sha>

misalnya

[dbn src]$ git fetch
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 7 different commits each, respectively.
...
[dbn src]$ git log -3 --pretty=oneline origin/master
f4d10ad2a5eda447bea53fed0b421106dbecea66 CASE-ID1: some descriptive msg
28eb00a42e682e32bdc92e5753a4a9c315f62b42 CASE-ID2: I'm so good at writing commit titles
ff39e46b18a66b21bc1eed81a0974e5c7de6a3e5 CASE-ID2: woooooo
[dbn src]$ git pull origin 28eb00a42e682e32bdc92e5753a4a9c315f62b42
[dbn src]$ git status
On branch current_feature
Your branch and 'origin/master' have diverged,
and have 2 and 1 different commits each, respectively.
...

Ini menarik 28eb00, ff39e4, dan semua yang sebelumnya, tetapi tidak menarik f4d10ad. Ini memungkinkan penggunaan pull --rebase, dan pengaturan honoris pull di gitconfig Anda. Ini berfungsi karena pada dasarnya Anda memperlakukan 28eb00 sebagai cabang.

Untuk versi git yang saya gunakan, metode ini memerlukan hash komit penuh - tidak ada singkatan atau alias yang diizinkan. Anda bisa melakukan sesuatu seperti:

[dbn src]$ git pull origin `git rev-parse origin/master^`
dbn
sumber