DÜZENLE:
Bkz @Simba Cevap geçerli çözüm için
submodule.<name>.update
değiştirmek istediğiniz dokümanlardır - varsayılancheckout
submodule.<name>.branch
olarak izlenecek uzak dalı belirtin - varsayılanmaster
ESKİ CEVAP:
Şahsen burada, zaman içinde çalışmayı durdurabilecek ve cevabımı burada kontrol edebilecek dış bağlantılara yönlendiren cevaplardan nefret ediyorum (soru yinelenmediği sürece) - diğer konunun satırları arasındaki konuyu kapsayan, ancak genel olarak eşit olan soruya yönlendirme: "Ben yanıt vermiyorsa belgeleri okuyun. "
Soruya geri dönelim: Neden oluyor?
Tanımladığınız durum
Sunucudan değişiklikleri aldıktan sonra, çoğu zaman alt modül kafam ana daldan ayrılır.
Bu, alt modüllerin çok sık kullanılmadığı veya henüz alt modüller ile başladığı yaygın bir durumdur . İnanıyorum ki doğru söylüyorum, hepimiz alt modülümüzün KAFASININ ayrıldığı bir noktada bulunduk.
- Neden: Alt modülünüz doğru dalı izlemiyor (varsayılan ana).
Çözüm: Alt modülünüzün doğru dalı izlediğinden emin olun
$ cd <submodule-path>
# if the master branch already exists locally:
# (From git docs - branch)
# -u <upstream>
# --set-upstream-to=<upstream>
# Set up <branchname>'s tracking information so <upstream>
# is considered <branchname>'s upstream branch.
# If no <branchname> is specified, then it defaults to the current branch.
$ git branch -u <origin>/<branch> <branch>
# else:
$ git checkout -b <branch> --track <origin>/<branch>
- Neden: Ana deponuz alt modül dalını izlemek için yapılandırılmamış.
Çözüm: Aşağıdaki iki komutla yeni alt modüller ekleyerek alt modülün uzak dalını takip etmesini sağlayın.
- İlk önce git uzaktan kumandanızı takip etmesini söylersiniz
<branch>
.
- git'e ödeme yerine rebase veya birleştirme yapmasını söylersin
- git'e alt modülünüzü uzaktan güncellemesini söylersiniz.
$ git submodule add -b <branch> <repository> [<submodule-path>]
$ git config -f .gitmodules submodule.<submodule-path>.update rebase
$ git submodule update --remote
- Mevcut alt modülünüzü böyle eklemediyseniz, bunu kolayca düzeltebilirsiniz:
- İlk önce alt modülünüzün izlenmesini istediğiniz dalı teslim aldığından emin olmak istiyorsunuz.
$ cd <submodule-path>
$ git checkout <branch>
$ cd <parent-repo-path>
# <submodule-path> is here path releative to parent repo root
# without starting path separator
$ git config -f .gitmodules submodule.<submodule-path>.branch <branch>
$ git config -f .gitmodules submodule.<submodule-path>.update <rebase|merge>
Genel durumlarda, yukarıdaki yapılandırma sorunlarından biriyle ilişkili olduğu için ŞİMDİ AYRINTILI KAFANIZI düzelttiniz.
MÜSTAKİL KAFA sabitleme .update = checkout
$ cd <submodule-path> # and make modification to your submodule
$ git add .
$ git commit -m"Your modification" # Let's say you forgot to push it to remote.
$ cd <parent-repo-path>
$ git status # you will get
Your branch is up-to-date with '<origin>/<branch>'.
Changes not staged for commit:
modified: path/to/submodule (new commits)
# As normally you would commit new commit hash to your parent repo
$ git add -A
$ git commit -m"Updated submodule"
$ git push <origin> <branch>.
$ git status
Your branch is up-to-date with '<origin>/<branch>'.
nothing to commit, working directory clean
# If you now update your submodule
$ git submodule update --remote
Submodule path 'path/to/submodule': checked out 'commit-hash'
$ git status # will show again that (submodule has new commits)
$ cd <submodule-path>
$ git status
HEAD detached at <hash>
# as you see you are DETACHED and you are lucky if you found out now
# since at this point you just asked git to update your submodule
# from remote master which is 1 commit behind your local branch
# since you did not push you submodule chage commit to remote.
# Here you can fix it simply by. (in submodules path)
$ git checkout <branch>
$ git push <origin>/<branch>
# which will fix the states for both submodule and parent since
# you told already parent repo which is the submodules commit hash
# to track so you don't see it anymore as untracked.
Ancak, alt modül için zaten yerel olarak bazı değişiklikler yapmayı başardınız ve taahhütte bulunduysanız, bunları uzaktan kumandaya ittikten sonra 'git checkout' işlemini gerçekleştirdiğinizde Git size bildirir:
$ git checkout <branch>
Warning: you are leaving 1 commit behind, not connected to any of your branches:
If you want to keep it by creating a new branch, this may be a good time to do so with:
Geçici bir dal oluşturmak için önerilen seçenek iyi olabilir ve daha sonra bu dalları vb. Birleştirebilirsiniz. Ancak kişisel git cherry-pick <hash>
olarak bu durumda kullanırım.
$ git cherry-pick <hash> # hash which git showed you related to DETACHED HEAD
# if you get 'error: could not apply...' run mergetool and fix conflicts
$ git mergetool
$ git status # since your modifications are staged just remove untracked junk files
$ rm -rf <untracked junk file(s)>
$ git commit # without arguments
# which should open for you commit message from DETACHED HEAD
# just save it or modify the message.
$ git push <origin> <branch>
$ cd <parent-repo-path>
$ git add -A # or just the unstaged submodule
$ git commit -m"Updated <submodule>"
$ git push <origin> <branch>
Alt modüllerinizi DETACHED HEAD durumuna getirebileceğiniz başka durumlar olsa da, umarım şimdi özel durumunuzu nasıl ayıklayacağınızı biraz daha anlıyorsunuzdur.