Làm thế nào để xử lý nó khi một cam kết đang diễn ra đột nhiên xuất hiện phụ thuộc vào một cam kết khác chưa có?


13

Tôi chưa có kinh nghiệm với Git nhưng tôi cố gắng hết sức để làm quen với nó và cho đến nay tôi chỉ sử dụng nó cho các dự án tôi làm một mình.

Khi tôi viết mã có một số cách tiếp cận từ trên xuống một cách tự nhiên (vì tôi không thể biết tương lai) và có một chủ đề được nhắc lại:

Tôi làm một số công việc.
Tôi phát hiện ra rằng để đưa công việc của mình vào một thứ gì đó "có thể cam kết" tôi cần phải làm việc khác.
Các công việc khác xứng đáng cam kết của riêng mình.

Theo một cái gì đó có thể cam kết, tôi có nghĩa là một cái gì đó biên dịch hoặc một cái gì đó không phải là một mớ hỗn độn.
Và bởi một cái gì đó xứng đáng với cam kết của riêng tôi, tôi đã đề cập đến việc tôi đã học được rằng các cam kết chỉ nên làm một điều.

Cách tôi giải quyết nó là cồng kềnh. Nếu công việc khác nằm trong một tệp khác, tôi tạo một nhánh mới, cam kết ở đó và hợp nhất. Nếu tác phẩm nằm trong cùng một tệp .. ugh .. Tôi tạo một bản sao cục bộ và đặt lại tệp về trạng thái trong CHÍNH, thực hiện cam kết cần thiết và sau đó bắt đầu khôi phục công việc của tôi từ bản sao. Làm thế nào tôi thực sự nên xử lý đó? Tôi không tưởng tượng đây là cách, phải không? Tôi không cho là như vậy bởi vì nó phải xuất hiện thường xuyên với mọi người (ít nhất là những người không biết tương lai nữa). Hoặc có thể có vẻ như quy trình làm việc của tôi có thể bị thiếu sót?


1
Tôi thấy mình trong tình huống tương tự khá thường xuyên, thường là khi thêm thư viện và cấu hình. Tôi chỉ sử dụng git statusđể xem tất cả các tệp đã thay đổi và thực hiện hai hoặc nhiều cam kết bằng cách sử dụng git addvới các tệp cụ thể (thay vì git add --all) và cam kết từng mảnh một.
Chris Cirefice

Bạn có thể chọn các phần của tệp git add -pvà sau đó chỉ cam kết các phần đó. Đó là một kỹ thuật rất mạnh mẽ và tôi sử dụng nó gần như mọi lúc.
eush77

Câu trả lời:


17

Có nhiều cách để giải quyết điều này.

Nếu bạn muốn thực hiện các thay đổi cho lần xác nhận đầu tiên mà không can thiệp vào các thay đổi hiện tại của mình, bạn có thể muốn sử dụng git stash. Điều này sẽ đặt tất cả các thay đổi mở của bạn đi, cho phép bạn khôi phục chúng sau này. Sử dụng git statusđể thấy rằng họ không có mặt nữa. Bây giờ tạo cam kết đầu tiên như bạn đã quen. Tiếp theo, bạn có thể sử dụng git stash popđể khôi phục các thay đổi ban đầu của mình và tạo cam kết thứ hai, thực hiện công việc chính của bạn.

Một cách khác là thực hiện tất cả các thay đổi cần thiết và sau đó tạo hai cam kết, cả hai đều chứa một phần công việc của bạn. Để làm như vậy, bạn có thể sử dụng chỉ mục (còn được gọi là khu vực tổ chức) được cung cấp bởi git. Đây là một khu vực đặc biệt bạn có thể sử dụng để chuẩn bị cam kết. Giả sử bạn đã thay đổi nhiều tệp, bạn có thể thêm từng tệp vào chỉ mục bằng cách sử dụng git add. Khi làm git commitchỉ các tệp được thêm vào chỉ mục sẽ được cam kết. git statussẽ cho bạn thấy những phần thay đổi của bạn sẽ được cam kết và phần nào sẽ không. Ví dụ: nó sẽ nhìn theo cách này sau khi thay đổi tệp a.txt, b.txt và c.txt và sau đó thực hiện git add a.txt:

On branch master
Changes to be committed:
  (use "git reset HEAD <file>..." to unstage)

        modified:   a.txt

Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git checkout -- <file>..." to discard changes in working directory)

        modified:   b.txt
        modified:   c.txt

Khi bạn đang thực hiện git commitở trạng thái này, chỉ những thay đổi đối với a.txt sẽ được thêm vào cam kết của bạn.

Ngoài ra, bạn có thể xem lại các thay đổi chính xác sẽ được cam kết bằng cách sử dụng git diff --cached, điều này sẽ cho bạn thấy sự khác biệt của tất cả các thay đổi sẽ được cam kết.

Nếu một tệp chứa các thay đổi cho cả hai lần xác nhận, bạn cũng có thể chỉ thêm các phần của tệp đó vào chỉ mục bằng cách sử dụng "git add --patch b.txt". git sẽ cung cấp cho bạn một chế độ tương tác yêu cầu bạn thay đổi từng tệp trong tệp đã cho nếu cần thêm vào chỉ mục. Điều này có thể trở nên khó khăn hơn nếu bạn có các thay đổi trong các dòng cạnh nhau, cần được chia thành hai cam kết, tuy nhiên cũng có nhiều cách để giải quyết điều đó.

Nếu bạn muốn tìm hiểu thêm về khu vực tổ chức, bạn có thể muốn đọc phần này: http : // git yet.com/beginner/2009/01/18/the-staging-area.html

Bạn cũng có thể muốn đọc thêm về cách thêm tương tác tại đây: http://nuclearsquid.com/writings/git-add/


5

Nếu bạn sử dụng GUI cho Git, như SourceTree của Atlassian hoặc git gui, bạn có thể cam kết các phần của tệp và khiến các phần khác không được cam kết. Trong thực tế, bạn có thể cam kết các dòng mã riêng lẻ.

Tôi làm điều này thường xuyên khi tôi rơi xuống hố thỏ như bạn mô tả. Đây là một cách tuyệt vời để thực hiện cam kết hợp lý hoặc cam kết như một tiền thân của cam kết chính.

Bạn có thể làm điều này từ dòng lệnh, nhưng đó là loại vụng về.

Khi bạn có thể cam kết ở cấp độ bản vá Git và các dòng riêng lẻ, bạn không cần phải tạo các nhánh mới, stash, commit, stash và hợp nhất. Chỉ cần tiếp tục làm việc và không phá vỡ dòng chảy. Bạn đã có một điều tốt đi.


@MasterMastic NÀY nên là câu trả lời được chấp nhận của bạn. Có thể cam kết chỉ các dòng mã riêng lẻ là một ơn trời đáng sợ.
JesseTG
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.