2012-05-01 26 views
11

Có vẻ như khi sử dụng gerrit, theo mặc định, tất cả các thay đổi đều phụ thuộc vào trước đó. Tôi không chi nhánh cho những thay đổi mới, tôi chỉ đơn giản là làm việc ra khỏi nhánh chính và sau đó đẩy các thay đổi đã cam kết đến một nguồn gốc/chủ từ xa. Sự phụ thuộc được tạo ra mọi lúc ngay cả khi hai cam kết không liên quan gì đến nhau.Làm thế nào để loại bỏ các phụ thuộc sai trong gerrit

Tôi đã gặp phải một số vấn đề khiến tôi nghĩ rằng tôi không sử dụng git đúng cách kết hợp với gerrit.

Điều gì sẽ xảy ra khác nhau trong luồng công việc git/gerrit của tôi cho mỗi cam kết không phụ thuộc vào cam kết trước đó? Tôi cũng đã thử tạo chi nhánh mới cho thay đổi:

> git pull origin master 
> git checkout -b new_branch 
> #make a change 
> git add -A 
> git commit #with gerrit's commit hook in .git/hooks 
> git push origin <sha1>:refs/for/master 

Công trình này, nhưng gerrit vẫn báo cáo sự phụ thuộc vào mục cam kết trước đó.

+0

Tôi thậm chí không chắc chắn những gì bạn đang yêu cầu. Bạn có ý nghĩa gì bởi "sự phụ thuộc?" – ebneter

+0

Gerrit cho thấy những vấn đề phụ thuộc vào/phụ thuộc của. Ví dụ, tôi kiểm tra vấn đề # 1 để gerrit, và sau đó kiểm tra trong một hoàn toàn khác nhau # 2 mà thậm chí không chạm vào cùng một tập tin. Gerrit báo cáo rằng # 2 phụ thuộc vào # 1. Điều này có vẻ sai. – Shellum

+0

sử dụng git rebase -i và tự mình loại bỏ các phụ thuộc cũng có thể là cách để loại bỏ các phụ thuộc. – cafebabe1991

Trả lời

13

Đây là những gì Gerrit có nghĩa là phụ thuộc - Cam kết nằm trên đầu trang của một cam kết khác. Nếu cả hai đang được xem xét, cái mới hơn phụ thuộc vào cái cũ hơn.

Nếu bạn không muốn họ phụ thuộc vào nhau, đừng tạo các cam kết trên đầu trang của nhau. Tạo một cam kết, sau đó tạo chi nhánh mới dựa trên tổng thể cho lần commit tiếp theo của bạn

(git checkout origin/master -b NEW_BRANCH_NAME).

Khi bạn đẩy thứ hai cam kết để xem xét, đó là phụ huynh sẽ được xuất bản và nó sẽ không phụ thuộc vào bất cứ điều gì.

+0

Tôi đã thấy đề cập đến phân nhánh cho mỗi thay đổi mã ... nhưng như trong câu hỏi đã được chỉnh sửa của tôi, điều này dường như vẫn tạo ra kết quả tương tự. Còn ý tưởng nào nữa không? – Shellum

+7

Lệnh bạn đang sử dụng để tạo một nhánh (git checkout -b new_branch) làm cho nhánh mới ở trên cùng của cam kết hiện tại. Bạn muốn đặt lại về những gì máy chủ xem như cam kết hiện tại - vì vậy hãy chỉ rõ rằng trong lệnh checkout.git checkout * origin/master * -b new_branch. – Brad

+1

@Brad Nhận xét của bạn có ý nghĩa. Tôi chỉ muốn chỉ ra rằng tài liệu cho git-checkout có điểm bắt đầu là tham số cuối cùng: git checkout [-q] [-f] [-m] [[-b | -B | --orphan] ] [] Vì vậy, ví dụ bạn sẽ là: git checkout -b new_branch _origin/master_ – Plazgoth

0

Tôi đã được dạy để giải quyết vấn đề này bằng cách thực hiện git reset --hard HEAD~1 sau mỗi git push.

+3

Bạn có muốn bình luận về lý do tại sao bạn nghĩ rằng điều này là sai, có lẽ tránh việc duy trì thông tin sai lệch và thông báo tốt hơn cho tôi? – Mitch

+3

Vấn đề với cách tiếp cận này là bạn thoát khỏi cam kết hoàn toàn sau khi bạn đẩy. Giả sử bạn có các đánh giá lặp lại trên gerrit, bạn có thể muốn thay đổi cam kết trước đó dựa trên các nhận xét. Cách tiếp cận này sẽ yêu cầu bạn để anh đào chọn sự thay đổi một lần nữa từ gerrit để có thể làm việc trên nó. Tôi thấy điều này khó khăn trong trường hợp tôi phân nhánh để thực hiện sửa chữa lớn và thiết lập chạy trên mã đó. Nếu tôi muốn đẩy một bản sửa lỗi riêng lẻ nhỏ trên cùng một dòng mã, tôi không muốn mất cam kết chính đối với sửa chữa nhỏ này vì có thể thu hút nhiều thay đổi hơn dựa trên các đánh giá. –

+1

Không sao cả. Tất cả các cam kết đã được đẩy được lưu trữ trên máy chủ và cục bộ. Bạn làm việc trên một, đẩy nó, sau đó bạn làm việc trên khác. Khi bạn nhận được thông tin phản hồi trên một và muốn sửa đổi nó một lần nữa, bạn chỉ cần kiểm tra xem nó ra để làm việc trên nó. Đặt một tên chi nhánh vào nó là một sự tiện lợi, không có gì hơn. – clacke

0

Là một biến thể để git reset --hard HEAD~1 Tôi sử dụng này để thay thế:

git reset --hard origin/master 

Giả sử, tôi đang làm việc trong master cho một sự thay đổi nhanh chóng.

Nếu không, làm việc trong một nhánh chủ đề sẽ được ưu tiên hơn nhiều.

Có rất nhiều kịch bản Git để giúp quản lý các chi nhánh chủ đề:

Tôi chắc rằng có những người khác.

+0

Tôi nghĩ "git reset - hard origin/master" tốt hơn ... bởi vì lệnh trên đã gây ra lỗi và làm việc sau khi cho không gian trong - và khó –

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