2012-03-21 23 views
24

Tôi đã thực hiện một số tìm kiếm trực tuyến. Tôi biết rằng bạn có thể sử dụng định dạng vá sau khi cam kết, nhưng tình hình của tôi là một chút khác nhau.Cách tạo bản vá mà không cần cam kết trong Git

Tôi muốn tạo một bản vá, tương tự như "dpk" trong SVN, vì vậy tôi có thể gửi nó ra để xem xét mã, nhưng tôi chưa muốn cam kết.

Làm thế nào tôi có thể đạt được điều này với Git?

+5

Một điểm chính của một DVCS như git là không có lý do gì cả để tránh cam kết gì đó. –

+0

Không ai trả lời câu hỏi .. Anh ấy không hỏi bất cứ điều gì về cam kết .. hes hỏi làm thế nào để bạn tạo ra một bản vá có thể được phân phối cho người dùng khác. – Stephen

+0

Liên quan: [git format-patch without commiting] (http://stackoverflow.com/q/7837218/183120) – legends2k

Trả lời

7

Cam kết trong Git là một hoạt động rẻ và hoàn toàn cục bộ, vì vậy không có lý do gì để tránh cam kết miễn là bạn không đẩy nó ở bất kỳ đâu.

Chỉ cần tạo một chi nhánh địa phương mới và cam kết các thay đổi của bạn tại đó. Bạn luôn có thể xóa nhánh sau nếu bạn không muốn nó nữa, hoặc bạn có thể giữ nhánh và sử dụng nó để làm việc trên bất cứ thứ gì bạn đang làm, sau đó hợp nhất (hoặc rebase) nó vào nhánh master khi nó sẵn sàng. Đây là một quy trình làm việc tốt để sử dụng khi làm việc với Git.

$ git checkout -b feature-foo # create and switch to new branch feature-foo 
$ git commit 

# do whatever you need to do 

$ git checkout master   # switch back to the master branch 
$ git merge feature-foo  # merge your change into master (optional) 
$ git branch -d feature-foo # delete the branch 
+8

Không hữu ích. Đôi khi tôi muốn xem các thay đổi cục bộ trước khi cam kết để tôi có thể nắm bắt những thứ tôi không có ý định cam kết. – Stephen

+5

Bạn có thể làm một 'git diff' cho điều đó. – bfontaine

+3

@Stephen 'git add --patch' – sigod

1

Cam kết về repo cục bộ trong git không phải là "ràng buộc". Bạn có thể cam kết các thay đổi của bạn, tạo bản vá của bạn và sau đó làm một thiết lập lại mềm trên nhánh của bạn để cam kết trước đó và nó giống như cam kết của bạn không bao giờ xảy ra.

Điều đó đang được nói, thực sự không có lý do gì bạn phải đặt lại chi nhánh của mình sau khi tạo bản vá. Bạn có thể để lại các cam kết trong repo và chỉ cần tránh đẩy nó cho đến khi xem xét mã được thực hiện. Nếu bạn phải quay trở lại và thực hiện thay đổi đối với cam kết ban đầu, bạn có các tùy chọn tại thời điểm đó.

Và nếu bạn tạo một nhánh cho cam kết như hammar cho thấy nó dễ dàng hơn để quay trở lại và thực hiện thay đổi sau mà không phải thực hiện bất kỳ việc rebasing gây phiền nhiễu và như vậy trong nhánh chính trước khi đẩy.

6

Giống như @hammar nói, cam kết là giá rẻ và sau đó bạn có thể thổi đi những cam kết với git reset, vv

Bạn cũng có thể cất giấu và sau đó làm:

git stash show -p 
79

Khi chàng trai khác đã đưa ra một số câu trả lời tuân thủ quy ước git, câu hỏi của OP, "tạo bản vá không có cam kết", cũng có thể được giải quyết theo cách này:

git diff > my_patch.txt 

Sau đó, bạn có thể áp dụng p này atch, cũng không có một cam kết, bởi:

git apply my_patch.txt 

Nhưng nếu bạn chỉ làm việc tại địa phương, một git checkout another_branch -m là tốt, đủ để mang lại tất cả những thay đổi uncommit hiện tại của bạn để another_branch đó, thậm chí không cần vá và áp dụng.

+0

trong trường hợp bạn muốn xóa bản vá được áp dụng này: git áp dụng -R my_patch.txt – Sourabh

+2

Như thế này, chúng tôi không bao gồm các tệp mới/không bị hỏng! Nếu bạn cần bao gồm các tệp mới, bạn nên thêm tất cả các tệp vào chỉ mục (git add) và sau đó đến $ git diff --cached> my_patch.txt – dxvargas

+0

Điều này cũng không bao gồm các tệp được dàn dựng. Bạn sẽ cần chạy 'git diff --staged> my_patch.txt' để bao gồm chúng –

7

bước chung để tạo ra miếng vá mà không cần cam kết cuối cùng

  1. cam kết thay đổi địa phương của bạn sử dụng

    git commit -a -m "specific message" 
    

    Lưu ý: đừng đẩy cam kết này.

  2. tạo vá

    git format-patch -s -n -1 HEAD 
    

    nó sẽ tạo ra 0001-.vá

  3. quay trở lại địa phương cam kết

    git reset --soft HEAD~1 
    

    xóa cam kết nhưng giữ công việc của bạn

    git reset --hard HEAD~1 
    

    xóa cam kết với công việc của bạn

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