2010-09-08 33 views
9

Có vẻ như đối với cả Mercurial hoặc Git, nếu tôi không cam kết trước, thì tôi không thể đẩy?Đẩy mà không có cam kết trong Mercurial hoặc Git

Vì vậy, nếu tôi không cam kết (khi chưa sẵn sàng), tôi không thể đẩy tới máy chủ từ xa để sao lưu mã của mình? Mã nằm trong một chiếc máy tính xách tay, được mang theo, có thể hơi yếu ớt đang được mang theo.

Trả lời

3

Đúng vậy. Mục đích của việc thúc đẩy là chia sẻ một hoặc nhiều cam kết với các bản repos khác. Không được dự định chủ yếu là bản sao lưu (mặc dù một số người sử dụng chúng cho điều đó).

Có rất nhiều công cụ sao lưu chuyên dụng và dịch vụ trực tuyến. Xem Online backup for personal use để biết danh sách.

+1

có một hệ thống sao lưu riêng biệt có thể có vẻ hơi rắc rối. Nếu chỉ Git hoặc Mercurial có thể cho phép mọi người thiết lập một repo cho push không cam kết. Một cái gì đó như 'git push --uncommitted ssh: // hơi/peter/tmp' –

+2

@Jian, một lần nữa, đây không phải là các chương trình sao lưu. Ý tưởng dự định là thực hiện một hoặc nhiều cam kết có ý nghĩa, sau đó bạn chia sẻ. Nó sẽ không có ý nghĩa nhiều để có một repo có chứa cả hai cam kết và các công trình trong tiến trình. –

+0

"Hệ thống sao lưu riêng biệt" cũng có thể là một kho lưu trữ. Đây là cách tôi làm việc: Tôi viết mã trong repo cá nhân của tôi (nơi tôi thường xuyên cam kết), và tôi có một repo trung tâm để chia sẻ công việc của mình với các đồng nghiệp của tôi (nơi tôi đẩy, nhưng ít thường xuyên hơn). Để sao lưu công việc tôi làm trong repo personnal của tôi, tôi có một repo thứ ba: một móc trong repo personnal của tôi thực hiện một đẩy vào repo sao lưu mỗi lần tôi cam kết. Bằng cách đó, hoạt động sao lưu hoàn toàn minh bạch (hình phạt thời gian là không đáng kể). – barjak

2

Chính xác; bạn không thể đẩy những thay đổi không được cam kết. Tuy nhiên, chỉ vì những thay đổi của bạn chưa sẵn sàng nhưng không có nghĩa là bạn không thể thực hiện chúng. Tôi không có kinh nghiệm với Mercurial, nhưng với Git, bạn có thể sửa đổi một cam kết (git commit --amend) để sửa đổi nó sau khi nó đã được cam kết. Bạn cũng có thể thực hiện một loạt các cam kết và sau đó thực hiện một lần rebase tương tác để kết hợp chúng thành một commit duy nhất. Hoặc bạn chỉ có thể thực hiện các cam kết khi cần thiết và không phải lo lắng về việc đảm bảo lịch sử của bạn hoàn toàn nguyên sơ.

+1

Như đã giải thích tại [RECOVERING FROM UPSTREAM REBASE] (http://www.kernel.org/pub/software/scm/git/docs/git-rebase.html#_recovering_from_upstream_rebase), '--amend' có thể trở thành một rắc rối lớn . Bất cứ ai kéo từ phiên bản sửa đổi trước phải sửa đổi lịch sử của họ sau khi họ nhận được phiên bản sửa đổi. –

+1

Điều đó chỉ có liên quan nếu kho lưu trữ mà anh ấy đang cố gắng chia sẻ. Nếu anh ta chỉ sử dụng nó cho mục đích sao lưu, nó không phải là một vấn đề. – mkarasek

+1

... và chi nhánh chính thức.Nếu bạn đẩy vào một nhánh gọi là 'my-wip' và ai đó nghĩ rằng họ nên xây dựng một sản phẩm xung quanh đó, thì họ xứng đáng bị nhầm lẫn. – Dustin

17

Bạn đang luôn là sẵn sàng cam kết.

Cam kết thường xuyên. Cam kết với một nhánh đang tiến hành và phân phối nó rộng rãi như bạn cảm thấy.

Khi bạn đến trạng thái mà hiện tại bạn đang đề cập đến là "sẵn sàng cam kết", hãy kiểm tra sự phân kỳ của chi nhánh của bạn từ thượng nguồn, thực hiện rebase -i để làm sạch nó và làm cho nó trông giống như bạn muốn.

Điều này sẽ dễ dàng hơn, an toàn hơn và thường chỉ cung cấp cho bạn kết quả tốt hơn so với cố gắng thực sự khó khăn để có được mọi thứ hoàn hảo trước khi cam kết. Hãy nhớ rằng: Cam kết không nhất thiết đại diện cho trạng thái vĩnh viễn mong muốn của vũ trụ. Nó chỉ là một nơi nào đó bạn đang có. Cách bạn xuất bản tùy thuộc vào bạn.

git làm cho nó rất dễ dàng xuất bản chi nhánh do-not-look-at-me cho công việc của bạn mà sau này bạn có thể chuyển sang mã số chính thức của bạn bất kỳ lúc nào và theo bất kỳ hình thức nào bạn cho là phù hợp nhất với bạn.

7

Chỉ cần tạo nhánh mới.

Cam kết thay đổi nửa nướng vào nhánh đó và đẩy chi nhánh đó.

Khi thay đổi của bạn đã sẵn sàng, hãy làm tròn các cam kết nửa nướng của bạn (sử dụng rebase) và hợp nhất kết quả vào số master và xóa chi nhánh ném đi. (Bạn có thể xóa chi nhánh khỏi kho lưu trữ từ xa bằng cách sử dụng git push origin :branch - lưu ý dấu hai chấm trước tên chi nhánh.)

Không bao giờ có lý do gì để không thực hiện thay đổi của bạn, mặc dù có thể có lý do không cam kết cho một chi nhánh cụ thể khi chúng chưa sẵn sàng.

2

Để xem liệu có đúng kịch bản hay không. Bạn có...

  1. một số chỉnh sửa không bị giam trong thư mục làm việc của bạn mà bạn không muốn cam kết nào,
  2. một số thay đổi unpushed trong kho địa phương của bạn,

... nhưng ông chủ khó chịu của bạn vòi bạn trên quay lại và nói, "Này! Khi nào thì bạn sẽ thúc đẩy sự thay đổi mà bạn đã đề cập trong cuộc họp nhân viên? Chúng tôi đang chờ đợi nó!" Anh ấy đang đứng đó chờ đợi bạn làm điều đó, vậy làm thế nào để bạn có được anh ta ra khỏi tóc của bạn một cách nhanh chóng và dễ dàng?

Điều này thật dễ dàng. Bạn muốn sử dụng MQ extension. Nó đi kèm với cài đặt Mercurial tiêu chuẩn.

Trước tiên hãy thêm nó vào tệp .hgrc của bạn.

[extensions] 
mq = 

Để giấu chỉnh sửa không bị giam trong một mục hàng đợi vá, làm điều này:

$ hg qnew stash 
$ hg qpop 

Bây giờ đẩy cam kết cũ của bạn, vì vậy ông chủ của bạn sẽ thoát khỏi lưng của bạn.

$ hg push 

Cuối cùng, khôi phục thư mục làm việc của bạn như vậy:

$ hg qpush 

Tại thời điểm này, bạn vẫn còn có các bản vá được ghi trong hàng đợi bản vá của bạn. Nó chỉ được đánh dấu là "áp dụng" bây giờ. Hoàn tất chỉnh sửa mã của bạn, sau đó làm điều này để cập nhật các bản vá với chỉnh sửa xong bạn và thông điệp log cam kết, sau đó hoàn thiện bản vá vào một changeset:

$ hg qrefresh -m"Commit message goes here." 
$ hg qfinish stash 

Đó là những điều cơ bản, nhưng có nhiều thứ khác bạn có thể làm nếu bạn muốn thực sự ưa thích. Phần mở rộng MQ giống như một thế giới hoàn toàn mới của kiểm soát sửa đổi ẩn bên dưới kho Mercurial. Nó giống như Stit của Git, nhưng linh hoạt hơn và ít gây nhầm lẫn hơn.

Tìm hiểu, thay đổi, phát triển!

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