2013-08-30 53 views
49

Cách phù hợp là gì?Khi nào tôi cần thực hiện "git pull", trước hoặc sau "git add, git commit"?

git add foo.js 
git commit foo.js -m "commit" 
git pull 
git push 

Hoặc

git pull 
git add foo.js 
git commit foo.js -m "commit" 
git push 

Hoặc

git add foo.js 
git pull 
git commit foo.js -m "commit" 
git push 

UPD:

tôi quên đề cập rằng trong trường hợp này tôi sử dụng git add đến giai đoạn một theo dõisửa đổi tệp. Không bao gồm một tệp hoàn toàn mới vào kho lưu trữ. Điều này có thay đổi thứ tự các lệnh không?

+0

Câu hỏi liên quan: http://stackoverflow.com/questions/813822/how-to-make-git-merge-handle-uncommitted-changes-to-my-working-tree – leo9r

Trả lời

49

pull = fetch + merge.

Bạn cần cam kết những gì bạn đã làm trước khi hợp nhất.

Vì vậy hãy kéo sau khi cam kết.

+4

Điều này có nghĩa là bạn sẽ kết thúc cam kết thêm cho mỗi cam kết bạn thực hiện và làm cho repo cẩu thả? Ngoài ra, thông báo cam kết ban đầu của bạn kết thúc bằng một nhận xét hợp nhất mỗi lần. Nếu vậy tôi muốn nghiêng về sử dụng phương pháp stash được đề cập dưới đây bởi @johnjo. –

+2

@DanielM Có, có thêm cam kết cho hợp nhất (với thông báo cam kết mặc định rõ ràng). Đây là một điều khá tốt mặc dù bởi vì nó cho phép bạn kiểm tra cam kết cuối cùng của bạn hoặc cam kết cuối cùng của đồng nghiệp của bạn hoặc cam kết hợp nhất. Nếu bạn muốn tránh nó và nếu bạn muốn đặt cam kết của bạn sau khi cam kết của đồng nghiệp, bạn có thể 'rebase' thay vì 'merge'. Bạn có thể làm điều đó với 'git commit && git rebase' hoặc' git pull --rebase'. –

+0

Cảm ơn mẹo, @Arnaud. Sau khi đọc nhiều câu hỏi SO khác nhau, nhận xét này đã làm cho nó. Tùy chọn ưa thích của tôi khi các đồng nghiệp đang làm việc trên các tệp khác nhau là 'git pull' sau khi dàn dựng các thay đổi của tôi, vì tôi thấy nó là tự nhiên nhất. Mặc dù tôi nhận ra nhiều quy trình công việc khác nhau (stash cũng tốt), vì vậy nó có thể là vấn đề về hương vị. – nephewtom

36

Tôi khuyên bạn nên kéo từ nhánh từ xa càng thường xuyên càng tốt để giảm thiểu sự hợp nhất lớn và xung đột có thể xảy ra.

Có nói rằng, tôi sẽ đi với các tùy chọn đầu tiên:

git add foo.js 
git commit foo.js -m "commit" 
git pull 
git push 

Cam kết thay đổi của bạn trước khi kéo để cam kết của bạn được sáp nhập với những thay đổi từ xa trong thời gian kéo. Điều này có thể dẫn đến xung đột mà bạn có thể bắt đầu đối phó với việc biết rằng mã của bạn đã được cam kết nên bất cứ điều gì đi sai và bạn phải hủy hợp nhất vì bất kỳ lý do gì.

Tôi chắc chắn rằng một người nào đó sẽ không đồng ý với tôi, tôi không nghĩ rằng có chính xác cách thực hiện quy trình hợp nhất này, chỉ những gì phù hợp nhất với mọi người.

+1

Bạn có thể vui lòng xem nội dung cập nhật của tôi cho câu hỏi không? Tôi quên để giải thích những gì cho 'git add' được sử dụng chính xác trong ví dụ của tôi. – Green

+0

Không nên tạo bất kỳ sự khác biệt nào cho dù đó là tệp mới hay tệp được theo dõi/sửa đổi. Vẫn cam kết và sau đó kéo. – Jasarien

3

Bạn muốn thay đổi của mình nằm trên trạng thái hiện tại của nhánh từ xa. Vì vậy, có lẽ bạn muốn kéo ngay trước khi bạn cam kết chính mình. Sau đó, đẩy các thay đổi của bạn một lần nữa.

Tệp "cục bộ" không phải là vấn đề miễn là không có bất kỳ xung đột nào với chi nhánh từ xa. Tuy nhiên, nếu có xung đột, hợp nhất sẽ không thành công, do đó không có rủi ro hoặc nguy hiểm khi kéo trước khi thực hiện các thay đổi cục bộ.

+1

Sẽ không hoạt động, như Arnaud đã đề cập, việc kéo yêu cầu bạn phải cam kết thay đổi trước tiên. – Jasarien

+0

Git của tôi dường như rất vui khi có nhiều thay đổi cục bộ. Tất nhiên, nếu các tập tin tương tự được thay đổi trên nhánh từ xa, phần hợp nhất của kéo không thành công. Để tạo ra một cuộc xung đột hợp nhất thích hợp, tôi phải cam kết trước tiên, chắc chắn. Vì vậy, nếu tập hợp các tệp được thay đổi cục bộ và từ xa bị phân tách, việc kéo và sau đó là cam kết. Nếu không, git sẽ không kéo. Không có thiệt hại được thực hiện bằng cách cố gắng. – AlexE

+0

Đây là lựa chọn ưa thích của tôi khi mọi người đang làm việc trên các tệp khác nhau và tôi thấy nó là tự nhiên nhất. – nephewtom

33

Tôi nghĩ rằng cách tốt nhất để làm điều này là:

Stash thay đổi địa phương của bạn:

git stash 

Cập nhật các chi nhánh để mã mới nhất

git pull 

Merge thay đổi địa phương của bạn vào mã mới nhất:

git stash apply 

Thêm, cam kết và đẩy những thay đổi của bạn

git add 
git commit 
git push 

Theo kinh nghiệm của tôi đây là đường dẫn đến ít nhất kháng với Git (trên dòng lệnh anyway).

1

Tôi nghĩ git pull --rebase là cách sạch nhất để đặt các cam kết gần đây cục bộ của bạn ở trên các cam kết từ xa mà bạn không có tại một thời điểm nhất định.

Vì vậy, theo cách này, bạn không phải kéo mỗi lần bạn muốn bắt đầu thực hiện thay đổi.