Git, Làm thế nào để thiết lập lại nguồn gốc / chủ thành một cam kết?


244

Tôi đặt lại chủ địa phương của mình thành một cam kết bằng lệnh này:

git reset --hard e3f1e37

Khi tôi nhập $ git statuslệnh, terminal nói:

# On branch master
# Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.

#   (use "git pull" to update your local branch)
#
nothing to commit, working directory clean

Vì tôi cũng muốn đặt lại nguồn gốc / tiêu đề, tôi kiểm tra nguồn gốc / chính:

$ git checkout origin/master
Note: checking out 'origin/master'.

You are in 'detached HEAD' state. You can look around, make experimental
changes and commit them, and you can discard any commits you make in this
state without impacting any branches by performing another checkout.

If you want to create a new branch to retain commits you create, 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 2aef1de... master problem fixed for master. its okay now.

và đặt lại tiêu đề bằng lệnh này:

$ git reset --hard e3f1e37
HEAD is now at e3f1e37 development version code incremented for new build.

Sau đó, tôi đã cố gắng thêm cam kết vào nguồn gốc / tiêu đề mà tôi không thành công.

$ git commit -m "Reverting to the state of the project at e3f1e37"
# HEAD detached from origin/master
nothing to commit, working directory clean

Cuối cùng, tôi kiểm tra với chủ địa phương của tôi.

$ git checkout master
Switched to branch 'master'
Your branch is behind 'origin/master' by 7 commits, and can be fast-forwarded.
  (use "git pull" to update your local branch)

Kể từ khi, tôi đặt lại phần đầu của nguồn gốc / bản gốc, tôi cho rằng bản địa và bản gốc sẽ cùng hướng nhưng như bạn thấy, git đang nói rằng bản địa / chủ của tôi đứng sau bản gốc / bản gốc bằng 7 lần xác nhận.

Làm thế nào tôi có thể khắc phục vấn đề này? Những thứ mà tôi đang tìm kiếm là Head of local / master và origin / master point to same commit. Hình ảnh sau đây cho thấy những gì tôi đã làm. Cảm ơn.

nhập mô tả hình ảnh ở đây


Trước hết, hãy chắc chắn rằng bạn được phép buộc mã đẩy đến một nhánh được bảo vệ trong dự án của bạn, nếu không bạn sẽ không thể ...
DarmVillegas 27/12/18

Câu trả lời:


562

origin/xxxcác nhánh luôn là con trỏ đến một điều khiển từ xa. Bạn không thể kiểm tra chúng vì chúng không phải là con trỏ đến kho lưu trữ cục bộ của bạn (bạn chỉ kiểm tra cam kết. Đó là lý do tại sao bạn sẽ không thấy tên được viết trong dấu nhánh nhánh giao diện dòng lệnh, chỉ là hàm băm xác nhận).

Những gì bạn cần làm để cập nhật điều khiển từ xa là buộc đẩy các thay đổi cục bộ của bạn thành chủ:

git checkout master
git reset --hard e3f1e37
git push --force origin master
# Then to prove it (it won't print any diff)
git diff master..origin/master

9
đó là thao tác được yêu cầu, nhưng hãy nhớ rằng nó sẽ làm cho những người đã rút các cam kết từ chủ nhân không hài lòng.
mnagel

Tôi làm theo các bước này và nó quay trở lại. Nhưng nguồn gốc / ĐẦU bây giờ đang trỏ đến một nhánh khác ngoài chủ. Tôi có thể làm gì để sữa nó?
Daniil Shevelev

1
Bạn không nên quan tâm đến nguồn gốc / ĐẦU, chỉ cần đẩy ref tốt về nguồn gốc / ref
Simon Boudrias

Đồng ý, đã phải làm điều này ngày hôm nay sau khi vô tình hợp nhất các nhánh sai với nhau sau đó đẩy về nguồn gốc. Nó hoạt động tốt, nhưng nó có thể rất phá vỡ nếu những người khác đã kiểm tra các nhánh bị ảnh hưởng từ nguồn gốc. Sử dụng cẩn thận.
Nick W.

1
Không hoạt động. remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

52

Giải pháp tìm thấy ở đây đã giúp chúng tôi cập nhật chủ thành một cam kết trước đó đã được đẩy:

git checkout master
git reset --hard e3f1e37
git push --force origin e3f1e37:master

Sự khác biệt chính từ câu trả lời được chấp nhận là hàm băm cam kết "e3f1e37:" trước chủ trong lệnh đẩy.


1
Không hoạt động:remote: error: denying non-fast-forward refs/heads/master (you should pull first)
m0skit0

@ m0skit0 như tiếng nói thông điệp của you should pull first:)
intuitivepixel

Câu trả lời cho điều này là tại stackoverflow.com/a/10544328/1019307 - git config receive.denynonfastforwards falsenhưng thực sự tôi đã đặt nó thủ công trong kho git cục bộ của tôi, tôi có trong /opt/gitđó tôi đã tạo để chơi với các ý tưởng ở đây. Tôi không chắc chắn làm thế nào hoặc nếu có thể làm điều này cho bitbucket, github, v.v ... Và @intearningpixel là vô nghĩa khi nó đảo ngược những gì bạn đang cố gắng đạt được với thiết lập lại cứng.
HankCa

Xin chào @jkovacs, tôi không muốn những thay đổi mới trong bản gốc bị xóa. Tôi chỉ muốn đẩy hàm băm "e3f1e37" đó sang bản gốc. Có thể bằng cách bỏ qua lệnh git reset thứ 2 - cho "e3f1e37"?
KarenAnne

Xin chào @jkovacs, tôi chỉ xác nhận rằng tôi có thể bỏ qua bước thứ 2. :)
KarenAnne

2

Giả sử rằng chi nhánh của bạn được gọi mastercả ở đây và từ xa, và điều khiển từ xa của bạn được gọi là originbạn có thể làm:

git reset --hard <commit-hash>
git push -f origin master

Tuy nhiên, bạn nên tránh làm điều này nếu bất kỳ ai khác đang làm việc với kho lưu trữ từ xa của bạn và đã kéo các thay đổi của bạn. Trong trường hợp đó, sẽ tốt hơn là hoàn nguyên các cam kết mà bạn không muốn, sau đó đẩy như bình thường.


1

Vì tôi có một tình huống tương tự, tôi nghĩ tôi muốn chia sẻ tình huống của mình và những câu trả lời này đã giúp tôi như thế nào (cảm ơn mọi người).

Vì vậy, tôi quyết định làm việc tại địa phương bằng cách sửa đổi cam kết cuối cùng của mình mỗi lần tôi muốn lưu tiến bộ của mình trên nhánh chính (tôi biết, tôi nên phân nhánh, cam kết về điều đó, tiếp tục đẩy mạnh và sau đó hợp nhất trở lại thành chủ).

Một đêm khuya, trong nỗi sợ hãi hoang tưởng mất đi sự tiến bộ của tôi đối với sự cố phần cứng hoặc một cái gì đó ra khỏi ether, tôi quyết định đẩy chủ nhân về nguồn gốc. Sau đó tôi tiếp tục sửa đổi chi nhánh chính địa phương của mình và khi tôi quyết định đến lúc phải đẩy lại, tôi đã phải đối mặt với các chi nhánh chính khác và phát hiện ra tôi không thể sửa đổi nguồn gốc / thượng nguồn ( duh! ) Như tôi có thể phát triển các chi nhánh địa phương.

Vì vậy, tôi đã không kiểm tra chủ địa phương bởi vì tôi đã có sau một cam kết. Sư phụ không thay đổi. Tôi thậm chí không cần phải thiết lập lại - dù vậy, cam kết hiện tại của tôi vẫn ổn.

Tôi chỉ buộc phải đẩy về nguồn gốc, thậm chí không xác định rõ cam kết nào tôi muốn buộc chủ nhân vì trong trường hợp này, đó là bất cứ điều gì CHÍNH. Đã kiểm tra git diff master..origin/masterđể không có bất kỳ sự khác biệt và đó là nó. Tất cả đều cố định. Cảm ơn! (Tôi biết, tôi là một người mới chơi, xin hãy tha thứ!).

Vì vậy, nếu bạn đã ổn với chi nhánh chính của mình tại địa phương, chỉ cần:

git push --force origin master
git diff master..origin/master
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.