git - gabungkan konflik ketika lokal dihapus tetapi file ada di jarak jauh

116

Saya sangat baru mengenal git dan bertanya-tanya bagaimana saya harus melakukan penggabungan di mana di repo lokal saya telah menghapus beberapa file di cabang master tetapi file ini ada di dalam cabang master jarak jauh.

Setelah melakukan git-merge terlihat konflik-konflik yang terjadi.

Menggunakan git gui ini menunjukkan bahwa file lokal dihapus, sedangkan file cabang jarak jauh memiliki konten.

Bagaimana Anda menghentikan file-file ini dari konflik? Apakah ada cara sederhana menggunakan git gui?

Terimakasih banyak

binarycreations
sumber
Di masa lalu, satu hal yang telah saya lakukan adalah membiarkan file "terhapus" dalam kontrol sumber, tetapi mengecualikannya dari proyek / makefile / apa saja. Ini solusi sementara yang oke untuk konflik penggabungan, setidaknya.
Mark Rushakoff
2
Anda memperbaikinya dengan cara yang sama Anda memperbaiki konflik gabungan: tambahkan versi yang diinginkan (baik file, atau kekurangan file) ke indeks, lalu lakukan. Yang mana yang kamu mau?
Cascabel
@MarkRushakoff Saya akan mengubah nasihat Anda menjadi "ketika saya mengalami situasi di mana saya perlu menyelesaikan konflik, saya tidak menyelesaikannya secara nyata, cukup tutupi saja sehingga mereka menggigit seseorang (mungkin bukan saya) di masa depan". Ini adalah nasihat yang sangat bagus untuk seseorang yang ingin membawa lebih banyak masalah ke dalam proyek.
Victor Yarema

Jawaban:

155

Anda harus menyelesaikan konflik sesuai keinginan Anda. Jika file benar-benar seharusnya dihapus, dan Anda akan menerbitkan perubahan itu ke asalnya, hapus lagi:

git rm path/to/file

Jika file masih harus dilacak, tambahkan (versi di pohon kerja akan menjadi versi dari asal):

git add path/to/file

Setelah melakukan salah satu cara untuk menyelesaikan konflik, lakukan penggabungan.

Bertingkat
sumber
Saya memiliki beberapa file, semuanya dalam direktori yang sama dan semua dengan sufiks yang sama. Apakah ada jalan pintas untuk menghapus semuanya sekaligus sambil mempertahankan sisa file di dir?
chiborg
@chiborg: Itu hanya pertanyaan shell. cdke direktori, dan git rm *.ext. Shell Anda (bukan Git) meluas *.extke semua nama file yang cocok.
Cascabel
Dan jika saya ingin menyimpan beberapa file? git rmtidak memiliki -ibendera.
chiborg
@chiborg: Anda mengatakan ingin menghapus semuanya dengan sufiks tertentu, dan membiarkan yang lainnya tetap utuh. Itulah tepatnya yang saya katakan kepada Anda bagaimana melakukannya. Atau maksud Anda git rm *-suffix.ext? Perbedaan yang sama. Jika Anda mengalami masalah dalam mencari cara menggunakan shell wildcard, tanyakan di unix.stackexchange.com. Jika Anda mengetahui fakta bahwa apa yang Anda inginkan tidak dapat dilakukan dengan globbing, gunakan rm -idan ikuti git add -uuntuk mengambil penghapusan.
Cascabel
2
@ Jefromi, jika saya menentukan -s recursive -X ours, mengapa masih perlu git rmdan git add?
Noel Yap
27

Sebagai tip tambahan selain jawaban yang diterima, dalam "dihapus oleh kami" , jika Anda ingin melihat perubahan yang dibuat pada file yang dihapus sehingga Anda dapat menerapkan perubahan tersebut di tempat lain yang dapat Anda gunakan:

git diff ...origin/master -- path/to/file

Jika ini adalah skenario "dihapus oleh mereka" , dan Anda ingin melihat perubahan sehingga Anda dapat menerapkannya di tempat lain, Anda dapat menggunakan:

git diff origin/master... -- path/to/file
Joseph Ravenwolfe
sumber
6
Iya! Ini sangat penting jika Anda tidak ingin mengabaikan perubahan yang Anda gabungkan, seperti ketika file baru saja diganti namanya atau isinya dipindahkan sebelum file dihapus.
Edward Anderson
8
Sebagai pengingat: Ini tidak berfungsi saat konflik terjadi selama rebasing . Perlu eksplisit sepertigit diff mybranch@{1}...origin/master -- path/to/file
nschum
@nschum Terima kasih! Inilah yang saya cari.
Chuim
2
Anda juga dapat menggunakan git diff --base(lihat jawaban saya yang lain).
Dorian Marchal
Hai Joseph, saya masih buntu meskipun jawaban ini terlihat menjanjikan. Jika Anda punya waktu, saya ingin Anda menjawabnya di sini: stackoverflow.com/q/63044843/470749 Terima kasih!
Ryan
9

Di Git GUI, Anda memilih file yang konflik dan kemudian klik kanan pada area teks utama tempat teks yang berkonflik ditampilkan.

Dalam menu konteks yang muncul, Anda dapat memilih untuk menggunakan "Remote" atau menggunakan "Lokal". Jadi jika file dihapus dari jarak jauh, Anda dapat memilih "Remote" untuk menyebarkan penghapusan secara lokal, dan sebaliknya.

Butuh waktu sebulan untuk mengetahuinya ... alangkah baiknya jika GUI GUI benar-benar memiliki dokumentasi ...

Joel Freeman
sumber
4

Jawaban dengan peringkat terbaik berfokus pada cara menyelesaikan konflik.

Sebelum itu, Anda mungkin ingin tahu apa yang diubah remote pada file yang dihapus secara lokal.

Untuk melakukan itu, Anda dapat melihat perubahannya dengan:

git diff --base

Dari https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

Bandingkan pohon kerja dengan versi "dasar" [...]. Indeks berisi tahapan ini hanya untuk entri yang tidak digabungkan, yaitu saat menyelesaikan konflik.

Dorian Marchal
sumber
Berikut adalah penjelasan yang bagus dari git diff --base stackoverflow.com/a/60484874/470749
Ryan
0

Di EGit saya juga menemukan masalah. Solusi saya adalah:

  • Menggunakan tampilan Git Staging.
  • Mengklik dua kali pada setiap file yang ditampilkan pada perubahan tidak bertahap untuk membuka pembanding
  • Klik pada ikon "Salin semua dari kiri ke kanan"
  • Simpan file (itu akan hilang dari daftar yang tidak dipentaskan)
borjab.dll
sumber
0

Seperti yang dinyatakan dalam jawaban yang berguna untuk pertanyaan terkait ini , Anda dapat menggunakan git mergetooluntuk memulai dialog di mana Anda dapat memilih apakah Anda ingin mengambil versi file yang dimodifikasi atau dihapus.

Amos Egel
sumber