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 .
untuk git checkout
mengatakannya untuk memeriksa semua yang ada di pohon. Maka Anda perlu menandai konflik sebagai terselesaikan, yang dapat Anda lakukan dengan git add
, dan melakukan pekerjaan Anda setelah selesai:
git checkout --ours . # checkout our local version of all files
git add -u # mark all conflicted files as merged
git commit # commit the merge
Perhatikan .
pada git 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 kedua git checkout
.
Ini juga merupakan kebiasaan yang baik untuk memiliki, ketika memasukkan nama file, untuk mengimbanginya --
, seperti git 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 dari checkout
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 fungsi foo
untuk bar
, dan orang lain menambahkan kode baru bahwa panggilan foo
, 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 file git add
sebelum melakukannya), Anda akan memiliki 3 versi setiap file dengan konflik; ada versi asli file dari leluhur dari dua cabang yang Anda HEAD
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
atau git checkout --theirs
. Setelah Anda memasukkan file ke dalam keadaan yang Anda inginkan, Anda mengindikasikan bahwa Anda telah selesai menggabungkan file dan siap untuk berkomitmen menggunakan git add
, dan kemudian Anda dapat melakukan penggabungan dengan git commit
.