Nó phụ thuộc vào những gì bạn muốn làm khi bạn thanh toán cam kết đó. Nếu tất cả những gì bạn đang làm là kiểm tra nó để bạn có thể xây dựng hoặc kiểm tra bản sửa đổi đó, thì không có gì sai khi làm việc với một đầu rời. Chỉ cần nhớ kiểm tra một chi nhánh thực tế trước khi bạn thực hiện bất kỳ cam kết nào (git checkout master
ví dụ:), để bạn không tạo các cam kết không được bao gồm trong bất kỳ nhánh nào.
Tuy nhiên, nếu bạn muốn thực hiện nhiều cam kết hơn bắt đầu từ thời điểm đó, bạn nên tạo một nhánh. Nếu bạn thực hiện các cam kết không được tham chiếu bởi một nhánh, chúng có thể dễ dàng bị mất và cuối cùng sẽ được dọn dẹp bởi bộ thu gom rác của git, vì không có gì đề cập đến chúng. Bạn có thể tạo một nhánh mới bằng cách chạy:
git checkout -b newbranch ea3d5ed
Để giúp hình dung, đây là một số sơ đồ minh họa cách làm việc trên một đầu tách rời khác với hoạt động trên một nhánh.
Hãy bắt đầu với 3 cam kết trên master
, A, B và C. master
là nhánh hiện tại, vì vậy hãy HEAD
chỉ đếnmaster
, điểm nào để cam kết C.
ABC
* - * - * <- master <- HEAD
Bây giờ nếu chúng ta cam kết, git sẽ tạo một cam kết có C là cha (vì đó là cam kết hiện tại, được trỏ đến từ HEAD
qua master
) và sẽ cập nhật master
để trỏ đến cam kết mới đó. Tất cả các cam kết của chúng tôi hiện đã được thực hiện master
và HEAD
hướng đến cam kết mới thông qua master
.
A B C D
* - * - * - * <- master <- HEAD
Bây giờ chúng ta hãy kiểm tra B, cho chúng ta một HEAD
.
A B C D
* - * - * - * <- chủ
^
\-- CÁI ĐẦU
Mọi thứ hoạt động tốt ở đây; chúng tôi có thể xem tất cả các tệp, xây dựng chương trình của mình, kiểm tra nó, v.v. Chúng tôi thậm chí có thể tạo các cam kết mới; nhưng nếu chúng tôi làm như vậy, không có nhánh nào mà chúng tôi đang ở, vì vậy chúng tôi không thể trỏ bất kỳ nhánh nào vào cam kết mới đó. Điều duy nhất chỉ vào nó là HEAD
:
A B C D
* - * - * - * <- chủ
\
* <- ĐẦU
E
Nếu sau đó chúng tôi quyết định kiểm tra master
lại, sẽ không có gì đề cập đến E.
A B C D
* - * - * - * <- master <- HEAD
\
*
E
Vì không có gì đề cập đến nó, nên có thể khó tìm và git coi các cam kết không có tham chiếu nào sẽ bị bỏ (chúng xảy ra khá phổ biến nếu bạn rebase hoặc cài đặt các bản vá lỗi hoặc thực hiện thao tác lịch sử thú vị khác; chúng thường đại diện cho các bản vá bị bỏ qua mà bạn không còn quan tâm). Sau một khoảng thời gian nhất định, git sẽ coi đó là rác, sẽ bị loại bỏ trong lần thu rác tiếp theo.
Vì vậy, thay vì kiểm tra một bản sửa đổi trần và nhận được một phần đầu tách rời, nếu bạn cảm thấy mình sẽ thực hiện nhiều cam kết hơn, bạn nên sử dụng git checkout -b branch B
để tạo một nhánh và kiểm tra nó. Giờ đây, các cam kết của bạn sẽ không bị mất, vì chúng sẽ được đưa vào một nhánh mà bạn có thể dễ dàng tham khảo và hợp nhất sau này.
A B C D
* - * - * - * <- chủ
^
\ - chi nhánh <- HEAD
Nếu bạn quên làm điều này và tạo cam kết ngoài một nhánh, không cần phải lo lắng. Bạn có thể tạo một nhánh tham chiếu đến bản sửa đổi head với git checkout -b branch
. Nếu bạn đã quay trở lại master
nhánh và nhận ra rằng bạn đã quên một cam kết bị lạc, bạn có thể tìm nó bằng cách sử dụng git reflog
, nó sẽ hiển thị cho bạn lịch sử về những gì cam kết HEAD
đã chỉ đến trong vài ngày qua. Bất kỳ thứ gì vẫn còn trong bản cập nhật sẽ không được thu thập rác và nói chung các tham chiếu sẽ được lưu trong bản ghi lại ít nhất 30 ngày.