Git: Hiện tại không có trên bất kỳ chi nhánh nào. Có một cách dễ dàng để lấy lại chi nhánh, trong khi vẫn giữ các thay đổi?


201

Vì vậy, tôi đã thực hiện một số công việc trong kho lưu trữ và khi tôi sắp cam kết tôi nhận ra rằng tôi hiện không ở bất kỳ chi nhánh nào.

Điều này xảy ra rất nhiều khi làm việc với các mô hình con và tôi có thể giải quyết nó, nhưng quá trình này rất tẻ nhạt và tôi đã nghĩ rằng phải có một cách dễ dàng hơn để làm điều này.

Có một cách dễ dàng để lấy lại chi nhánh, trong khi vẫn giữ các thay đổi?

Câu trả lời:


213

Nếu bạn chưa cam kết:

git stash
git checkout some-branch
git stash pop

Nếu bạn đã cam kết và không thay đổi bất cứ điều gì kể từ:

git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}

Nếu bạn đã cam kết và sau đó làm thêm:

git stash
git log --oneline -n1 # this will give you the SHA
git checkout some-branch
git merge ${commit-sha}
git stash pop

16
Điều này không giúp đỡ nếu bạn đã cam kết. Không có downvote mặc dù điều đó không được chỉ định trong câu hỏi.
Trưởng khoa

24
nếu bạn đã cam kết: lưu ý hàm băm của cam kết bạn đã thực hiện (sử dụng git showhoặc git rev-parse HEAD), chuyển sang chi nhánh và sau đó git cherry-picklà băm xác nhận.
araqnid

7
Nếu cam kết, nhận được băm của cam kết cuối cùng. Kiểm tra chi nhánh bạn muốn ở vàgit merge _hash_
Daniel

HÃY CẨN THẬN. NẾU BẠN ĐÃ CAM KẾT THAY ĐỔI và bạn làm theo các bước này ... Bạn sẽ thấy thông báo ... "Chi nhánh và nguồn gốc / chủ của bạn đã chuyển hướng".
thinkanotherone

1
@thinkanotherone Nếu bạn đã cam kết những thay đổi của mình thì sẽ không có gì để bỏ qua và kiểm tra một chi nhánh khác không phải là ngày tận thế. Cam kết bạn vừa thực hiện vẫn còn đó và bạn có thể hợp nhất nó với chi nhánh đó bằng cách sử dụng git merge <hash-of-the-commit-you-just-made>.
Erik B

160

điều này đã giúp tôi

git checkout -b newbranch
git checkout master
git merge newbranch
git branch -d newbranch

25
Nếu bạn đã thực hiện nhiều cam kết, đây là những gì bạn cần làm.
Benjamin Oakes

Không thử nó, nhưng có vẻ như nó sẽ hoạt động. Tuy nhiên tôi nghĩ đó là một kịch bản không thể xảy ra. Tôi tin rằng hầu hết mọi người sẽ nhận ra rằng họ không thuộc bất kỳ chi nhánh nào trước khi họ cam kết và sử dụng câu trả lời được chấp nhận để khắc phục điều đó.
Erik B

49
Bạn sẽ ngạc nhiên.
Eric

@ErikB Tôi thậm chí còn không biết có một thứ như là không ở trên một chi nhánh. Câu trả lời này rất hữu ích cho tôi.
Konstantin Schubert

2
Câu trả lời dễ thương, thực sự chỉ cần gõ nó vào và hoạt động, không giống như hầu hết mọi thứ khác gặp phải khi mới bắt đầu GIT - bạn có thể muốn chỉ ra rằng newbranch là một tên riêng và không có ý định thay thế bằng hàm băm cam kết
Toni Leigh

22
git checkout master

Đó là kết quả như thế này:

Warning: you are leaving 2 commits behind, not connected to
any of your branches:

1e7822f readme
0116b5b returned to clean django

If you want to keep them by creating a new branch, this may be a good time to do so with:
git branch new_branch_name 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Vì vậy, hãy làm điều đó:

git merge 1e7822f25e376d6a1182bb86a0adf3a774920e1e

Tôi đã không thử nó, nhưng có vẻ như nó sẽ hoạt động tốt. Tôi đoán rằng nếu bạn chạy git gcgiữa hai lệnh đó, bạn sẽ mất các cam kết đó, nhưng trừ khi bạn chạy git gctự động, đây sẽ là một cách tiếp cận khá rủi ro. Tôi vẫn sẽ đi với câu trả lời của babay, nhưng nếu bạn muốn tự cứu mình khỏi việc viết thêm hai lệnh, tôi đoán đây là cách để đi.
Erik B

Tôi đã rời khỏi nhánh chính vào một lúc nào đó, rằng tôi không hoàn toàn chắc chắn. Tôi đã cam kết những thay đổi của mình, không có thay đổi nào trên bản gốc. Các hướng dẫn này đã mang lại những thay đổi của tôi cho nhánh chính và mọi thứ đều tốt.
Matti Jokipii

+1 Tôi đã lo lắng về việc kiểm tra một chi nhánh khác trong khi để lại các cam kết phía sau, thấy thông báo này đã thêm tự tin để đi đến đó.
J-Dizzle

11

Rời khỏi đây

git branch newbranch
git checkout master 
git merge newbranch 

3
@ErikB Anh ấy có thể đã thực hiện nhiều cam kết. Trong trường hợp đó, xem câu trả lời của babay.
Benjamin Oakes

@BenjaminOakes Điều đó có thể là như vậy, nhưng các lệnh git này thậm chí không hợp lệ.
Erik B

@ErikB Chắc chắn là đúng. :) Câu trả lời của babay là hình thức hợp lệ của những gì Alex dường như đã cố gắng thực hiện.
Benjamin Oakes

9

Ngoài ra, bạn có thể thiết lập các mô hình con của mình để thay vì ở trạng thái đầu tách rời mặc định của chúng, bạn hãy kiểm tra một nhánh.

Chỉnh sửa để thêm:

Một cách là kiểm tra một nhánh cụ thể của mô hình con khi bạn thêm nó với cờ -b:

git submodule add -b master <remote-repo> <path-to-add-it-to>

Một cách khác là chỉ cần đi vào thư mục mô hình con và chỉ cần kiểm tra nó

git checkout master

1
Bạn có thể cho tôi biết làm thế nào để làm điều đó?
Erik B

Có cách nào để cập nhật một mô hình con hiện có ở chế độ nhánh mặc định này không? gitmodulesCó lẽ cập nhật ?
Hertzel Guinness

@HertzelGuinness Không thực sự. Các mô hình con được kiểm tra tại một sha cam kết cụ thể. Một nhánh chỉ là một con trỏ tới sha và sha mà nó trỏ tới có thể thay đổi. Điều này không hữu ích vì nó không đóng băng trạng thái của mô hình con đã kiểm tra. Kiểm tra một chi nhánh chỉ là một thuận tiện nếu bạn đang thực hiện thay đổi cho mô hình con.
Abizern

5

Một cách để kết thúc trong tình huống này là sau khi thực hiện một cuộc nổi loạn từ một nhánh xa. Trong trường hợp này, các cam kết mới được trỏ đến HEADnhưng masterkhông trỏ đến chúng - nó chỉ vào bất cứ nơi nào trước khi bạn từ chối chi nhánh khác.

Bạn có thể thực hiện cam kết này mới masterbằng cách thực hiện:

git branch -f master HEAD
git checkout master

Điều này buộc phải cập nhật masterđể trỏ đến HEAD(mà không đưa bạn vào master) sau đó chuyển sang master.


Làm việc hoàn hảo theo yêu cầu. Tôi đã dàn dựng các tập tin và cam kết, nhưng không thể đẩy do lỗi trên. Trên hai dòng mã hoạt động hoàn toàn tốt và đẩy mã của tôi như mong đợi.
invinciblemuffi

4

Gần đây tôi gặp vấn đề này một lần nữa. Đã được một thời gian kể từ lần cuối tôi làm việc với các mô hình con và đã tìm hiểu thêm về git, tôi nhận ra rằng chỉ cần kiểm tra chi nhánh bạn muốn cam kết là đủ. Git sẽ giữ cây làm việc ngay cả khi bạn không cất nó.

git checkout existing_branch_name

Nếu bạn muốn làm việc trên một chi nhánh mới, điều này sẽ phù hợp với bạn:

git checkout -b new_branch_name

Việc thanh toán sẽ thất bại nếu bạn có xung đột trong cây làm việc, nhưng điều đó khá bất thường và nếu nó xảy ra, bạn có thể bỏ qua nó, bật nó và giải quyết xung đột.

So với câu trả lời được chấp nhận, câu trả lời này sẽ giúp bạn tiết kiệm được hai lệnh, điều đó thực sự không mất nhiều thời gian để thực hiện. Do đó, tôi sẽ không chấp nhận câu trả lời này, trừ khi nó kỳ diệu nhận được nhiều sự ủng hộ hơn (hoặc ít nhất là gần gũi) hơn câu trả lời hiện được chấp nhận.


2

Phương pháp sau có thể hoạt động:

git rebase HEAD master
git checkout master

Điều này sẽ khởi động lại các thay đổi CHÍNH hiện tại của bạn trên đầu trang chính. Sau đó, bạn có thể chuyển đổi chi nhánh.


Cách khác là kiểm tra chi nhánh trước:

git checkout master

Sau đó, Git sẽ hiển thị SHA1 của các cam kết tách rời của bạn, sau đó bạn có thể chọn cherry, ví dụ:

git cherry-pick YOURSHA1

Hoặc bạn cũng có thể hợp nhất cái mới nhất:

git merge YOURSHA1

Để xem tất cả các cam kết của bạn từ các chi nhánh khác nhau (để đảm bảo bạn có chúng), hãy chạy : git reflog.


0

Tôi biết tôi đã nói với babay vào năm 2012 rằng tôi nghĩ rằng không có khả năng ai đó sẽ không nhận ra rằng họ không ở trên một chi nhánh và cam kết. Điều này chỉ xảy ra với tôi, vì vậy tôi đoán rằng tôi phải thừa nhận rằng tôi đã sai, nhưng xem xét rằng phải mất đến năm 2016 để điều này xảy ra với tôi, bạn có thể lập luận rằng thực tế là không thể.

Dù sao, việc tạo ra một chi nhánh mới là quá mức cần thiết theo ý kiến ​​của tôi. Tât cả nhưng điêu bạn phải lam la:

git checkout some-branch
git merge commit-sha

Nếu bạn không sao chép cam kết trước khi kiểm tra chi nhánh khác, bạn có thể dễ dàng tìm thấy nó bằng cách chạy:

git reflog

đó là một vấn đề hiếm gặp (không thể xảy ra) đối với một người đàn ông. Điều đó đã không xảy ra với tôi kể từ năm 2012. Nhưng nếu bạn nhân cơ hội cho số lượng người dùng git ... Sẽ rất có thể. Nó có thể xảy ra mỗi ngày với một ai đó. :)
babay
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.