2012-12-27 32 views
6

Đây là một ví dụ về cách git repo của tôi là ngay bây giờ:Set thạc sĩ ngành vào thẻ mới nhất

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
    |    | 
master   HEAD 

Tôi thường cam kết, thẻ và đẩy thẻ như thế này:

git commit -a -m "Commit msg" 
git tag -a v1.3 -m "Tag msg" 
git push --tags 

Vấn đề chính mà tôi có là nhánh chính không chuyển sang thẻ mới nhất, vì vậy tôi luôn ở trạng thái Detached HEAD. Có cách nào để sửa lỗi này để nhánh chính sẽ luôn trỏ đến thẻ được đẩy mới nhất không?

+2

Quy trình làm việc của bạn là gì? Tại sao bạn luôn ở trạng thái HEAD tách rời? Tại sao bạn không làm việc trên một chi nhánh? Tôi nghĩ rằng đây là một vấn đề với quy trình làm việc của bạn hơn bất kỳ thứ gì khác. – jszakmeister

+1

Nếu bạn không trực tiếp kiểm tra thẻ, điều này sẽ không xảy ra. Chỉ thực hiện các cam kết mới sau khi kiểm tra * chi nhánh *, không bao giờ * thẻ *. – cdhowie

+0

Để có thể tạo các tệp gói trong repo, tôi cần gắn thẻ chúng, nếu không chúng sẽ trở thành 'a3fsr2', đó là lý do tại sao tôi cần phải sử dụng thẻ. – Peter

Trả lời

7

Trong trường hợp đặc biệt này, tôi đã phải làm như sau:

1) Trước tiên thiết lập các chi nhánh tổng thể để trỏ đến thẻ mới nhất (nơi ĐẦU trỏ), vì là thẻ gần đây nhất. Để làm như vậy, tôi đã tạo ra một nhánh mới và kết hợp với nó.

git branch -b exp 
git merge -s ours master 
git checkout master 
git merge exp 

Bây giờ thầy cũng giống như thẻ mới nhất:

v1.0 v1.1 v1.2 
    |  |  | 
    a - b - c 
        | 
       HEAD 
        | 
       master 

2) Một khi chúng ta có thầy lại diễn ra, chúng ta cần phải đẩy cả thầy và các thẻ bất cứ khi nào chúng ta làm một mới cam kết:

git commit -a -m "Commit msg" 
git tag -a v1.4 -m "Tag msg" 
git push master --tags 

Bằng cách này, chúng tôi đang ở trong chế độ HEAD bị tách rời và nhánh chính được cập nhật.

+0

Phản hồi thú vị, đầy đủ hơn câu trả lời của tôi. +1 – VonC

+1

'git checkout -B HEAD chính' thực hiện bước 1 của bạn trực tiếp. – jthill

2

Chi nhánh không tham chiếu thẻ.
Thẻ tham chiếu một cam kết cố định.

Vì vậy, miễn là bạn git checkout master, bạn không ở trong số detached HEAD mode.
Sau đó, bạn có thể cam kết và gắn thẻ: thẻ sẽ được tạo trên LATEST của nhánh hiện tại.

Nếu bạn ở chế độ HEAD tách rời, hãy xem "Git: How can I reconcile detached HEAD with master/origin?" để biết cách khác nhau để điều chỉnh một cam kết tách rời với một chi nhánh.

+0

Chi nhánh chính hiện tại đã lỗi thời, vì vậy nếu tôi thanh toán cho nó, tôi sẽ mất các thay đổi được áp dụng trong v1.1 và v1.2. – Peter

3

câu trả lời khác nhau/ý kiến ​​đã được đưa ra về việc tại sao không làm việc theo cách này, nhưng dưới đây là cách bạn khắc phục tình huống đặc biệt này:

git checkout -b tmpbranch  # creates a branch called tmpbranch at HEAD 
git checkout master    # switch back to master branch 
git merge --ff-only tmpbranch # fast-forward merge master to tmpbranch, fail if not possible 
git branch -d tmpbranch   # delete tmpbranch, it's not needed anymore 

Sau đó, đi về phía trước, không kiểm tra thẻ, trừ theo cách này:

git checkout -b somebranch refs/tags/tagname # creates a new branch starting at tag 

Bằng cách đó, bạn sẽ không được ở trạng thái đẦU tách ra, và bất kỳ cam kết mới sẽ được bổ sung bắt đầu từ thẻ trong câu hỏi, đó có vẻ là những gì bạn muốn ... Sau khi thực hiện một cam kết bạn có thể git tag newtag để tạo thẻ bổ sung ở đúng điểm.

+0

Vấn đề với giải pháp này là tôi sẽ có một chi nhánh cho mỗi thẻ tôi có trong repo. – Peter

+0

@Peter Chỉ khi các thẻ của bạn nằm trên các dòng phát triển riêng biệt, mà nó không xuất hiện là trường hợp từ câu hỏi ban đầu của bạn. Bạn sẽ có một nhánh, giống như 'master', với thẻ' v2.0' trỏ đến một cam kết gần đây trên nhánh đó và các thẻ trước đó (ví dụ: 'v1.9',' v1.8' ....) trước đó cam kết trên cùng nhánh đó. Một chi nhánh được cho là trỏ đến "những gì sẽ là phụ huynh của cam kết tiếp theo tôi thực hiện". Lệnh 'checkout' ở trên là khi bạn cần kiểm tra một thẻ cũ (-er) để chuẩn bị sửa lỗi cho nó hay cái gì đó, không phải cho phát triển hiện tại ... – twalberg

Các vấn đề liên quan