Làm thế nào để cam kết không thay đổi và tin nhắn mới?


136

Làm cách nào tôi có thể tạo mới commitvà tạo một tin nhắn mới nếu không có thay đổi nào được thực hiện đối với các tệp?

Điều này là không thể vì mã của cam kết (SHA?) Sẽ giống nhau phải không?

Câu trả lời:


167

Rất hiếm khi có một lý do chính đáng để làm điều này, nhưng tham số này --allow-emptydành cho các xác nhận trống (không có tệp nào thay đổi), ngược lại với --allow-empty-messagecác thông báo cam kết trống. Bạn cũng có thể đọc thêm bằng cách gõ git help commithoặc truy cập tài liệu trực tuyến .

Mặc dù đối tượng cây (có hàm băm của riêng nó) sẽ giống hệt nhau, nhưng cam kết thực sự sẽ có hàm băm khác, vì có lẽ nó sẽ có dấu thời gian và thông báo khác, và chắc chắn sẽ có một cam kết cha mẹ khác. Tất cả ba yếu tố này được tích hợp vào gitthuật toán băm đối tượng.


một vài lý do khiến bạn muốn có một empty cam kết (kết hợp một số ý kiến):

  • Là một "cam kết khai báo", để thêm tường thuật hoặc tài liệu (thông qua DavidNeiss ), bao gồm cả dữ liệu thực tế về việc vượt qua các bài kiểm tra hoặc lint (thông qua Robert Balicki ).
  • Để kiểm tra gitcác lệnh mà không tạo ra các thay đổi tùy ý (thông qua Vaelus ).
  • Để tạo lại một kho lưu trữ trống đã xóa bằng cách sử dụng gitolite(thông qua Tatsh ).
  • Để tự ý tạo một cam kết mới, chẳng hạn như để kích hoạt lại công cụ xây dựng (thông qua mattLummus ) hoặc vì mục đích ghi nhật ký hoặc số liệu cá nhân (thông qua DynamiteReed ). Tuy nhiên, hãy suy nghĩ hai lần: tùy thuộc vào cấu trúc chi nhánh / hợp nhất của bạn, các cam kết có thể tồn tại trong một thời gian rất dài, do đó, chiến lược "chỉ cam kết không có gì" có thể vô tình làm ô nhiễm kho lưu trữ của nhóm bạn với các tạo phẩm quy trình công việc tạm thời và khó phân tách các sửa đổi mã từ du thuyền phù du.

Các chiến lược khác để thêm siêu dữ liệu vào cây cam kết bao gồm:

  • Các nhánh hoặc thẻ nhẹ luôn chỉ ra một cam kết của một trạng thái cụ thể (ví dụ: "cam kết được chấp nhận cuối cùng" hoặc "cam kết dàn hiện tại").
  • Thẻ được chú thích cho một cách để ghi lại dấu thời gian, dấu phẩy và thông báo, trỏ đến một cam kết hiện có mà không cần thêm một mục trong chính cây cam kết.
  • git notes để liên kết một ghi chú có thể thay đổi trên đầu trang của một cam kết bất biến hiện có.

2
Tôi đã bắt đầu theo mô hình nhánh dòng git . Khi bạn tạo một devhình thức chi nhánh mastervà sau đó là một featchi nhánh ngay lập tức dev, featchi nhánh có vẻ như đến từ masterchi nhánh vì không có cam kết phân biệt trên devchi nhánh mà featchi nhánh đến từ. Một cam kết trống khi bạn lần đầu tiên tạo devchi nhánh giúp thiết lập devchi nhánh vì nó sở hữu chi nhánh vô thời hạn độc lập master. Nói chung, nó hữu ích khi bạn sử dụng các nhánh làm lớp và tạo hai lớp từ một cam kết duy nhất
Novice C

2
Một lý do khác: Nếu bạn bỏ qua một cái gì đó quan trọng ra khỏi thông điệp cam kết của mình trước khi đẩy, bạn không thể làm gì commit --amendnếu điều khiển từ xa không cho phép đẩy lực. Bằng cách này, bạn có thể cho phép các nhà phát triển thấy một thông điệp quan trọng đi kèm với cam kết trước đó.
Andy J

1
Tôi muốn làm điều này bởi vì tôi đã đẩy một cam kết, nhưng quên đề cập đến một cái gì đó trong thông điệp cam kết. Thông điệp cam kết của chúng tôi được tích hợp với phần mềm theo dõi vấn đề và tích hợp liên tục và nội dung của thông điệp cam kết ảnh hưởng đến các ứng dụng đó. Có cách nào tốt hơn? Đây dường như là giải pháp tốt nhất trong trường hợp của tôi. Điều duy nhất tôi có thể tưởng tượng là bằng cách nào đó có thể hoàn nguyên các cam kết trước đó.
sytech

1
Tôi chỉ sử dụng điều này để kích hoạt hook pre-commit của chúng tôi, kịch bản cơ sở dữ liệu. Vì vậy, đã có thay đổi, chỉ cần git không thể nhìn thấy chúng cho đến khi kịch bản đã chạy. Tất nhiên có thể chạy nó bằng tay, nhưng sau đó sẽ chạy tập lệnh hai lần.
yoyodyn

1
Rất hữu ích khi tương tác với vấn đề theo dõi tích hợp với máy chủ git dưới dạng github và gogs.
SimonF

37

Nếu tôi hiểu bạn đúng, bạn muốn thực hiện một cam kết trống. Trong trường hợp đó bạn cần:

git commit --allow-empty

34

Cam kết trống với một tin nhắn

git commit --allow-empty -m "Empty test commit"

Cam kết trống với một tin nhắn trống

git commit --allow-empty --allow-empty-message

3

Nếu bạn đang sử dụng một hệ thống như gitversion Sẽ rất có ý nghĩa khi thực hiện loại cam kết này. Bạn có thể có một cam kết dành riêng cho việc trả lại phiên bản chính bằng cách sử dụng + semver: nhận xét chính.


3

Có thể là một sự thay thế hợp lý hơn, bạn có thể tạo một thẻ chú thích (một cam kết có tên với một thông điệp). Xem git tag -atùy chọn.

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.