2013-02-27 29 views
7

Tôi chỉ muốn làm rõ cách cam kết trên các nhánh cụ thể hoạt động.Cách cam kết và đẩy các thay đổi bằng cách sử dụng Git

Giả sử tôi đang làm việc trên một chi nhánh có tên "Metro". Tôi thực hiện một số thay đổi cho một vài tệp, nhưng tôi chưa sẵn sàng để đẩy chúng lên kho lưu trữ từ xa.

Một hotfix đến mà tôi cần phải sửa chữa càng sớm càng tốt. Tôi cần phải chuyển sang một nhánh sạch gọi là "Master", nhưng tôi không thể vì tôi sẽ ghi đè lên các tập tin mà tôi đã thay đổi. Tôi cần phải cam kết những điều này trước khi tôi có thể chuyển đổi.

Câu hỏi của tôi là, nếu tôi cam kết những thay đổi này trên nhánh "Metro", sau đó chuyển sang nhánh "Master" sạch sẽ, các thay đổi được thực hiện trong "Metro" được đẩy tới repo "Master" từ xa vì tôi có cam kết với họ, mặc dù tôi đang đẩy đến một chi nhánh khác?

Để làm cho nó gọn gàng, các cam kết được tách biệt với các chi nhánh hoặc thực hiện tất cả các cam kết khi thêm vào repo từ xa?

Trả lời

3

Trước khi bạn chuyển chi nhánh thành thạo qua git checkout master, trước tiên bạn phải git commit -m 'some message', nếu không, git sẽ cố gắng thực hiện các thay đổi của chi nhánh hiện tại cùng với bạn đến nhánh chính.

sẽ thay đổi được thực hiện trong "Metro" được đẩy lên "Master" từ xa repo vì tôi đã cam kết họ, mặc dù tôi đang đẩy để chi nhánh khác?

Tuyệt đối không. git sẽ chỉ hợp nhất các thay đổi đã cam kết từ Metro để làm chủ nếu bạn yêu cầu thay đổi. Đó là do thiết kế (Lưu ý: hãy đọc về điều khiển từ xa git, bởi vì sử dụng điều khiển từ xa, bạn thực sự có thể thiết lập push của bạn để làm điều đó bằng "mặc định", đây sẽ là trường hợp bạn cần cẩn thận.).

1

Để hiểu các nhánh hoạt động như thế nào trong Git, tôi nghĩ điều quan trọng là phải thay đổi suy nghĩ để luôn luôn có cây cam kết. Bạn có một cây cam kết theo chu kỳ trong đó mỗi lần commit có một số commit cha và không có gì khác. Các nhánh bây giờ chỉ là các con trỏ đơn giản cho các cam kết cụ thể bên trong cây đó. Nếu bạn tạo một commit mới cho một nhánh, tất cả những gì thực sự xảy ra là bạn tạo một đối tượng commit mới với các thay đổi có phiên bản trước đó là parent và nhánh nhánh của bạn di chuyển đến commit mới được thêm vào toàn bộ cây .

Vì vậy, các nhánh hoàn toàn độc lập với nhau và theo cùng một cách, chúng không thực sự có ý nghĩa nhiều. Chúng chỉ là con trỏ.

Trong trường hợp của bạn, khi bạn chuyển từ metro thành master, bạn (có thể) đang hoạt động ở một phía khác của cây. Tất cả các cam kết bạn tạo bây giờ sẽ chỉ di chuyển con trỏ nhánh hiện tại — chính — nhưng sẽ không ảnh hưởng đến bất kỳ nhánh nào khác.

Và nếu bạn đẩy nhánh, tất cả những gì xảy ra là bạn cho điều khiển từ xa cam kết điểm nhánh tại, và sau đó bạn cung cấp cho tất cả các đối tượng từ xa cần hoàn thành cây.

2

Để làm cho nó gọn gàng, là cam kết tách biệt với chi nhánh hoặc thực hiện tất cả các cam kết khi thêm vào repo từ xa?

Để làm cho nó gọn gàng: có cho phần đầu tiên :-).

Về mặt kỹ thuật, một nhánh trong git là một chuỗi các cam kết, cùng với tên. Nếu bạn đẩy một nhánh, bạn sẽ đẩy tất cả các cam kết thuộc về nó (trừ khi repo từ xa đã có chúng), nhưng không có gì khác. Vì vậy, không, git sẽ không bằng cách nào đó đẩy tất cả các cam kết.

Tuy nhiên, lưu ý rằng bạn phải cẩn trọng để đẩy nhánh bạn muốn đẩy - git push có thể được định cấu hình để đẩy tất cả các nhánh của bạn. Để tránh điều này, thiết lập cấu hình var push.default:

git config push.default current 

Điều này đảm bảo rằng git push sẽ chỉ đẩy chi nhánh hiện tại (và không phải tất cả các chi nhánh, trong đó từng là mặc định).