Saya punya beberapa file lokal, saya tarik dari cabang jauh dan ada konflik. Saya tahu bahwa saya ingin menyimpan perubahan lokal saya dan mengabaikan perubahan jarak jauh yang menyebabkan konflik. Apakah ada perintah yang bisa saya gunakan untuk mengatakan "tandai semua konflik telah diselesaikan, gunakan lokal"?
git
merge
conflict
git-merge-conflict
Tom DeMille
sumber
sumber
Jawaban:
git checkout
memiliki--ours
opsi untuk memeriksa versi file yang Anda miliki secara lokal (sebagai lawan dari--theirs
, yang merupakan versi yang Anda tarik). Anda dapat melewatinya.
untukgit checkout
mengatakannya untuk memeriksa semua yang ada di pohon. Maka Anda perlu menandai konflik sebagai terselesaikan, yang dapat Anda lakukan dengangit add
, dan melakukan pekerjaan Anda setelah selesai:Perhatikan
.
padagit checkout
perintah. Itu sangat penting, dan mudah untuk dilewatkan.git checkout
memiliki dua mode; satu di mana ia beralih cabang, dan satu di mana ia memeriksa file dari indeks ke dalam copy pekerjaan (kadang-kadang menarik mereka ke dalam indeks dari revisi lain terlebih dahulu). Cara membedakannya adalah dengan apakah Anda telah memasukkan nama file di; jika Anda belum memasukkan nama file, ia mencoba berpindah cabang (meskipun jika Anda tidak lulus cabang juga, itu hanya akan mencoba memeriksa cabang saat ini lagi), tetapi ia menolak untuk melakukannya jika ada file yang dimodifikasi bahwa itu akan berpengaruh. Jadi, jika Anda menginginkan perilaku yang akan menimpa file yang ada, Anda harus.
memasukkan atau nama file untuk mendapatkan perilaku keduagit checkout
.Ini juga merupakan kebiasaan yang baik untuk memiliki, ketika memasukkan nama file, untuk mengimbanginya
--
, sepertigit checkout --ours -- <filename>
. Jika Anda tidak melakukan ini, dan nama file kebetulan cocok dengan nama cabang atau tag, Git akan berpikir bahwa Anda ingin memeriksa revisi itu, alih-alih memeriksa nama file itu, dan karenanya gunakan bentuk pertama daricheckout
perintah .Saya akan memperluas sedikit tentang bagaimana konflik dan penggabungan bekerja di Git. Saat Anda menggabungkan kode orang lain (yang juga terjadi saat tarikan; tarikan pada dasarnya adalah pengambilan diikuti oleh gabungan), ada beberapa situasi yang mungkin.
Yang paling sederhana adalah Anda berada di revisi yang sama. Dalam hal ini, Anda "sudah terkini", dan tidak ada yang terjadi.
Kemungkinan lain adalah bahwa revisi mereka hanyalah turunan dari Anda, dalam hal ini Anda secara default akan memiliki "penggabungan cepat", di mana Anda
HEAD
baru saja diperbarui ke komit mereka, tanpa terjadi penggabungan (ini dapat dinonaktifkan jika Anda benar-benar ingin merekam gabungan, menggunakan--no-ff
).Kemudian Anda masuk ke situasi di mana Anda sebenarnya perlu menggabungkan dua revisi. Dalam hal ini, ada dua kemungkinan hasil. Pertama adalah bahwa penggabungan terjadi secara bersih; semua perubahan ada di file yang berbeda, atau berada di file yang sama tetapi terpisah cukup jauh sehingga kedua set perubahan dapat diterapkan tanpa masalah. Secara default, ketika gabungan bersih terjadi, maka secara otomatis berkomitmen, meskipun Anda dapat menonaktifkan ini dengan
--no-commit
jika Anda perlu untuk mengedit itu terlebih dahulu (misalnya, jika Anda mengubah nama fungsifoo
untukbar
, dan orang lain menambahkan kode baru bahwa panggilanfoo
, itu akan menggabungkan bersih , tetapi hasilkan pohon yang patah, jadi Anda mungkin ingin membersihkannya sebagai bagian dari gabungan komit untuk menghindari komit yang rusak).Kemungkinan terakhir adalah bahwa ada penggabungan nyata, dan ada konflik. Dalam hal ini, Git akan melakukan sebanyak penggabungan karena dapat, dan file hasil dengan spidol konflik (
<<<<<<<
,=======
, dan>>>>>>>
) di copy pekerjaan Anda. Dalam indeks (juga dikenal sebagai "area pementasan"; tempat penyimpanan filegit add
sebelum melakukannya), Anda akan memiliki 3 versi setiap file dengan konflik; ada versi asli file dari leluhur dari dua cabang yang AndaHEAD
gabungkan, versi dari (sisi penggabungan Anda), dan versi dari cabang jarak jauh.Untuk menyelesaikan konflik, Anda dapat mengedit file yang ada di copy pekerjaan Anda, menghapus penanda konflik dan memperbaiki kode sehingga berfungsi. Atau, Anda dapat memeriksa versi dari satu atau sisi lain dari penggabungan, menggunakan
git checkout --ours
ataugit checkout --theirs
. Setelah Anda memasukkan file ke dalam keadaan yang Anda inginkan, Anda mengindikasikan bahwa Anda telah selesai menggabungkan file dan siap untuk berkomitmen menggunakangit add
, dan kemudian Anda dapat melakukan penggabungan dengangit commit
.sumber
git add --all
menambahkan semua file ke repositori sehingga ini dapat menambahkan lebih banyak file daripada yang dimaksudkan kecuali.gitignore
pola Anda dalam keadaan sempurna.git add -u
mungkin lebih cocok untuk situasi ini, Anda cenderung tidak memiliki pengeditan untuk melacak file yang tidak ingin Anda tambahkan saat menyelesaikan penggabungan.git checkout --ours .
. Itu.
penting; lewat nama file (dalam hal ini, seluruh direktori) memilih antara dua mode operasi yang berbedacheckout
, yang beralih cabang dan yang memindahkan file dari indeks ke copy yang berfungsi. Saya setuju, ini sangat membingungkan. Anda juga dapat melakukangit checkout --ours -- <filename>
untuk memeriksa file individual pada suatu waktu.Pastikan asal konflik: jika itu adalah hasil dari
git merge
, lihat Brian Campbell 's jawaban .Tetapi jika ini adalah hasil dari
git rebase
, untuk membuang perubahan jarak jauh dan menggunakan perubahan lokal , Anda harus melakukan:Lihat " Mengapa arti"
ours
"dan"theirs
"terbalik" "untuk melihat bagaimanaours
dantheirs
ditukar selama rebase (karena cabang hulu dicentang).sumber