BIÊN TẬP:
Xem @Simba Trả lời cho giải pháp hợp lệ
submodule.<name>.update
là những gì bạn muốn thay đổi, hãy xem tài liệu - mặc địnhcheckout
submodule.<name>.branch
chỉ định nhánh từ xa sẽ được theo dõi - mặc địnhmaster
TRẢ LỜI:
Cá nhân tôi ghét câu trả lời ở đây liên kết trực tiếp với các liên kết bên ngoài có thể ngừng hoạt động theo thời gian và kiểm tra câu trả lời của tôi ở đây (Trừ khi câu hỏi bị trùng lặp) - chuyển đến câu hỏi bao gồm chủ đề giữa các dòng của chủ đề khác, nhưng tổng thể bằng: "Tôi không trả lời, đọc tài liệu. "
Vì vậy, trở lại câu hỏi: Tại sao nó xảy ra?
Tình huống bạn mô tả
Sau khi lấy các thay đổi từ máy chủ, nhiều lần đầu mô đun con của tôi bị tách ra khỏi nhánh chính.
Đây là một trường hợp phổ biến khi một người không sử dụng các mô hình con quá thường xuyên hoặc chỉ bắt đầu với các mô hình con . Tôi tin rằng tôi đã đúng khi tuyên bố rằng tất cả chúng ta đã ở đó tại một thời điểm mà phần đầu của mô hình con của chúng ta bị tách ra.
- Nguyên nhân: Mô hình con của bạn không theo dõi nhánh chính xác (chủ mặc định).
Giải pháp: Hãy chắc chắn rằng mô hình con của bạn đang theo dõi nhánh chính xác
$ 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>
- Nguyên nhân: Repo cha của bạn không được cấu hình để theo dõi nhánh con.
Giải pháp: Làm cho mô hình con của bạn theo dõi nhánh từ xa của nó bằng cách thêm các mô hình con mới với hai lệnh sau.
- Đầu tiên bạn nói với git để theo dõi từ xa của bạn
<branch>
.
- bạn bảo git thực hiện rebase hoặc hợp nhất thay vì thanh toán
- bạn nói với git để cập nhật mô hình con của bạn từ xa.
$ git submodule add -b <branch> <repository> [<submodule-path>]
$ git config -f .gitmodules submodule.<submodule-path>.update rebase
$ git submodule update --remote
- Nếu bạn chưa thêm mô hình con hiện tại của mình như thế này, bạn có thể dễ dàng khắc phục điều đó:
- Trước tiên, bạn muốn đảm bảo rằng mô hình con của bạn có nhánh được kiểm tra mà bạn muốn được theo dõi.
$ 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>
Trong các trường hợp phổ biến, hiện tại bạn đã sửa lỗi ĐẦU XÁC ĐỊNH của mình vì nó có liên quan đến một trong các vấn đề cấu hình ở trên.
sửa lỗi DETACHED Head khi .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.
Nhưng nếu bạn đã quản lý để thực hiện một số thay đổi cục bộ cho mô hình con và được cam kết, hãy đẩy chúng vào điều khiển từ xa sau đó khi bạn thực hiện 'kiểm tra git', Git thông báo cho bạn:
$ 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:
Tùy chọn được đề xuất để tạo một nhánh tạm thời có thể tốt, và sau đó bạn chỉ có thể hợp nhất các nhánh này, v.v. Tuy nhiên, cá nhân tôi sẽ chỉ sử dụng git cherry-pick <hash>
trong trường hợp này.
$ 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>
Mặc dù có một số trường hợp nữa bạn có thể đưa các mô hình con của mình vào trạng thái ĐẦU XÁC ĐỊNH, tôi hy vọng rằng bây giờ bạn hiểu thêm một chút về cách gỡ lỗi trường hợp cụ thể của bạn.