Bagaimana cara menjaga file lokal atau file jarak jauh selama penggabungan menggunakan Git dan baris perintah?

194

Saya tahu cara menggabungkan modifikasi menggunakan vimdiff, tetapi, dengan asumsi saya hanya tahu bahwa seluruh file baik untuk disimpan atau dibuang, bagaimana cara melakukannya?

Saya tidak ingin membuka vimdiff untuk masing-masing, saya ingin mengubah perintah yang mengatakan 'tetap lokal' atau 'tetap jauh'.

EG: Saya mendapat gabungan dengan file yang ditandai sebagai diubah karena seseorang membukanya di bawah jendela, mengubah EOL, dan kemudian melakukan. Saat penggabungan, saya ingin menyimpan versi saya sendiri dan membuangnya.

Saya juga tertarik pada hal yang sebaliknya: Saya mengacaukan banyak waktu dan ingin menerima file jarak jauh, membuang perubahan saya.

e-satis
sumber

Jawaban:

309

Anda juga bisa:

git checkout --theirs /path/to/file

untuk menyimpan file jarak jauh, dan:

git checkout --ours /path/to/file

untuk menyimpan file lokal.

Kemudian git addmereka dan semuanya dilakukan.

Edisi: Ingatlah bahwa ini untuk sebuah mergeskenario. Selama rebase --theirsmerujuk ke cabang tempat Anda bekerja.

Menunggu Dev ...
sumber
4
Saya melakukan ini .. tetapi tidak ada yang terjadi .. bagaimana saya tahu itu mengambil file yang benar? Saya menggunakan git version 1.8.4jika itu penting.
Rosdi Kasim
3
mengapa penggunaan kata terbalik? Saya berasumsi "mereka" akan menjadi file jarak jauh dan "milik kita" akan menjadi file saya
phuclv
1
Begitulah, @ LưuVĩnhPhúc
Menunggu Dev ...
7
tidak, maknanya terbalik stackoverflow.com/q/2959443/995714 stackoverflow.com/q/29324812/995714 milik mereka akan menjadi file saya dan milik kami adalah file di cabang jarak jauh
phuclv
6
"Mudah", ya. Intuitif? Tidak.
Wilbur Whateley
107

Pendekatan ini tampaknya lebih mudah, menghindari kebutuhan untuk memilih masing-masing file:

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

atau

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

Disalin langsung dari: Selesaikan Git menggabungkan konflik demi perubahan mereka selama penarikan

keflavich
sumber
3
Cinta yang ini. Khususnya jika ada lebih dari satu file.
Tek
Pertanyaannya adalah untuk dua perintah yang berbeda, tetapi tidak ada deskripsi mengenai apa yang dilakukan keduanya. Apa yang dilakukan setiap baris?
Alex
Saya telah melalui setidaknya lima jawaban stackoverflow sebelum menemukan ini, yang saya inginkan. Terima kasih.
Bolton Bailey
14

git checkout {branch-name} -- {file-name}

Ini akan menggunakan file dari cabang pilihan.

Saya suka ini karena posh-gitautocomplete bekerja sangat baik dengan ini. Ini juga menghilangkan ambiguitas cabang mana yang jauh dan mana yang lokal. Dan bagaimanapun --theirsjuga tidak berhasil untukku.

Ben Wilde
sumber
Tidak ada ambiguitas, berfungsi untuk {mine} dan {mereka}, mendukung penambahan seluruh direktori. Ini harus menjadi jawaban yang diterima.
dotancohen
9

Untuk thingie garis akhir, lihat man git-merge:

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Pastikan untuk menambahkan autocrlf = falsedan / atau safecrlf = falseke klon windows (.git / config)

Menggunakan git mergetool

Jika Anda mengkonfigurasi mergetool seperti ini:

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

Kemudian sederhana

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

Akan melakukan pekerjaan

Menggunakan perintah git sederhana

Dalam kasus lain, saya berasumsi

git checkout HEAD -- path/to/myfile.txt

harus melakukan trik

Edit untuk melakukan yang sebaliknya (karena Anda mengacaukan):

git checkout remote/branch_to_merge -- path/to/myfile.txt
lihat
sumber
Memberi +1 untuk kiat, tetapi tidak diterima tetapi karena bukan itu yang saya minta. Saya ingin sesuatu yang berfungsi dalam semua kasus, bukan hanya dalam contoh kasus. Ditambah "git checkout remote / branch_to_merge - path / to / myfile.txt" tidak akan berfungsi jika Anda sudah memulai penggabungan: ia akan mengatakan bahwa Anda berada di tengah penggabungan dan akan mencegah Anda dari melakukan hal itu.
e-satis
1
@ e-satis: itu mengejutkan. Saya akan menganggap itu bug, karena checkout dengan path bukan checkout biasa (dan itu tidak mempengaruhi KEPALA). Saya akan mencobanya sekarang karena saya tidak bisa percaya
sehe
1
@ e-satis: Soooo ... Saya benar; git checkout remote/branch_to_merge -- path/to/myfile.txtbekerja seperti pesona sambil menyelesaikan konflik gabungan. (git 1.7.1)
sehe
1
Menambahkan solusi berdasarkan git mergetool sekarang
sehe