Dengan asumsi repositori submodule memang berisi komit yang ingin Anda gunakan (tidak seperti komit yang dirujuk dari keadaan super-proyek saat ini), ada dua cara untuk melakukannya.
Yang pertama mengharuskan Anda sudah tahu komit dari submodule yang ingin Anda gunakan. Ini bekerja dari "dalam, luar" dengan langsung menyesuaikan submodule kemudian memperbarui proyek-super. Yang kedua bekerja dari "luar, dalam" dengan menemukan komit proyek-super yang memodifikasi submodule dan kemudian mengatur ulang indeks proyek-super untuk merujuk ke komit submodul yang berbeda.
Luar dalam
Jika Anda sudah tahu komit mana yang Anda inginkan submodule untuk digunakan, cd
ke submodule, periksa komit yang Anda inginkan, lalu git add
dan komit git commit
itu kembali di super-proyek.
Contoh:
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Ups, seseorang membuat komit super proyek yang mengacu pada komit yang tidak dipublikasikan dalam submodule sub
. Entah bagaimana, kita sudah tahu bahwa kita ingin submodule untuk dikomit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
. Pergi ke sana dan periksa langsung.
Checkout di Submodule
$ cd sub
$ git checkout 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Note: moving to '5d5a3ee314476701a20f2c6ec4a53f88d651df6c' which isn't a local branch
If you want to create a new branch from this checkout, you may do so
(now or later) by using -b with the checkout command again. Example:
git checkout -b <new_branch_name>
HEAD is now at 5d5a3ee... quux
$ cd ..
Karena kami memeriksa komit, ini menghasilkan KEPALA terpisah dalam submodule. Jika Anda ingin memastikan bahwa submodule menggunakan cabang, maka gunakan git checkout -b newbranch <commit>
untuk membuat dan checkout cabang di komit atau checkout cabang yang Anda inginkan (mis. Satu dengan komit yang diinginkan di ujung).
Perbarui Super-proyek
Checkout dalam submodule tercermin dalam super-proyek sebagai perubahan pada pohon kerja. Jadi kita perlu melakukan tahapan dalam indeks proyek super dan memverifikasi hasilnya.
$ git add sub
Periksa hasilnya
$ git submodule update
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Pembaruan submodule diam karena submodule sudah di komit yang ditentukan. Perbedaan pertama menunjukkan bahwa indeks dan tabel kerja adalah sama. Perbedaan ketiga menunjukkan bahwa satu-satunya perubahan yang dipentaskan adalah memindahkan sub
submodule ke komit yang berbeda.
Melakukan
git commit
Ini melakukan entri submodul yang diperbaiki.
Di luar, Di
Jika Anda tidak yakin komit mana yang harus Anda gunakan dari submodule, Anda dapat melihat riwayat di proyek super untuk memandu Anda. Anda juga dapat mengatur reset secara langsung dari proyek-super.
$ git submodule update
fatal: reference is not a tree: e47c0a16d5909d8cb3db47c81896b8b885ae1556
Unable to checkout 'e47c0a16d5909d8cb3db47c81896b8b885ae1556' in submodule path 'sub'
Ini adalah situasi yang sama seperti di atas. Tapi kali ini kita akan fokus pada memperbaikinya dari super-proyek daripada masuk ke submodule.
Temukan Komitmen Pelanggaran proyek-Super
$ git log --oneline -p -- sub
ce5d37c local change in sub
diff --git a/sub b/sub
index 5d5a3ee..e47c0a1 160000
--- a/sub
+++ b/sub
@@ -1 +1 @@
-Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
+Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
bca4663 added sub
diff --git a/sub b/sub
new file mode 160000
index 0000000..5d5a3ee
--- /dev/null
+++ b/sub
@@ -0,0 +1 @@
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
OK, sepertinya sudah rusak ce5d37c
, jadi kami akan mengembalikan submodule dari induknya ( ce5d37c~
).
Atau, Anda dapat mengambil komit submodul dari teks tambalan ( 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
) dan menggunakan proses "dalam, luar" di atas.
Checkout di proyek-Super
$ git checkout ce5d37c~ -- sub
Ini mengatur ulang entri submodule untuk sub
melakukan apa yang dilakukan ce5d37c~
di super-proyek.
Perbarui Submodule
$ git submodule update
Submodule path 'sub': checked out '5d5a3ee314476701a20f2c6ec4a53f88d651df6c'
Pembaruan submodule berjalan OK (ini menunjukkan HEAD terlepas).
Periksa hasilnya
$ git diff ce5d37c~ -- sub
$ git diff
$ git diff --cached
diff --git c/sub i/sub
index e47c0a1..5d5a3ee 160000
--- c/sub
+++ i/sub
@@ -1 +1 @@
-Subproject commit e47c0a16d5909d8cb3db47c81896b8b885ae1556
+Subproject commit 5d5a3ee314476701a20f2c6ec4a53f88d651df6c
Perbedaan pertama menunjukkan bahwa sub
sekarang sama di ce5d37c~
. Perbedaan kedua menunjukkan bahwa indeks dan tabel kerja adalah sama. Dif ketiga menunjukkan satu-satunya perubahan bertahap adalah memindahkan sub
submodule ke komit yang berbeda.
Melakukan
git commit
Ini melakukan entri submodul yang diperbaiki.