2009-04-30 26 views
5

Tôi có một repo git cục bộ mà gần đây tôi đã thực hiện một cam kết, sau đó được đẩy đến một repo được chia sẻ. Chỉ sau khi tôi đẩy nó vào repo được chia sẻ thì tôi mới nhận ra mình đã mắc phải một sai lầm xấu xí. Tôi sửa đổi nó tại địa phương không có vấn đề sau khi tôi cố định nguồn của tôi với:Sửa đổi Git cam kết với một repo được chia sẻ

git commit -C HEAD -a --amend 

Sau đó, tôi đã cố gắng một nguồn gốc git push và tôi nhận được lỗi sau:

! [rejected]  mybranch -> mybranch (non-fast forward) 

cách tốt nhất để khắc phục điều này là gì tình hình?

Trả lời

7

git không (theo mặc định) cho phép bạn đẩy tới nhánh bất kỳ thứ gì "tua lại" mẹo chi nhánh. Nói cách khác, nếu người đứng đầu chi nhánh hiện tại không phải là cha mẹ trực tiếp hoặc tổ tiên của nhánh chi nhánh thì việc đẩy sẽ bị từ chối.

Bạn vẫn có thể thử đẩy bằng cách sử dụng tùy chọn -f để git push hoặc bằng cách sử dụng refspec có dấu '+' hàng đầu, ví dụ: git push origin +mybranch:mybranch.

Thông thường kho từ xa sẽ không cho phép điều này xảy ra vì bạn có nguy cơ mất cam kết nếu những người khác có thể bừa bãi các mẹo chi nhánh không bao gồm các cam kết mà họ không có cục bộ.

Bạn có thể ghi đè hành vi này bằng cách thay đổi tham số cấu hình receive.denyNonFastForwards trên kho lưu trữ từ xa (giả sử rằng bạn có quyền truy cập vào vùng chứa từ xa).

Nếu bạn không có quyền truy cập như vậy, bạn có thể có thể thực hiện việc này bằng cách xóa nhánh từ xa và tạo lại nó.

ví dụ:

git push origin :mybranch 
git push origin mybranch 

Lưu ý rằng nhiều phiên bản gần đây của git bao gồm một tham số cấu hình receive.denyDeletes sẽ, nếu được thiết lập, ngăn chặn workaround nguy hiểm tiềm tàng này từ làm việc.

+0

Tốt, tôi không biết về denyNonFastForwards: Tôi cho rằng bạn cần một cái móc để thực thi điều đó. – araqnid

5

Nếu bạn muốn ép buộc, bạn có thể ... ehm ... vượt qua --force đến push.

Tuy nhiên, thường được coi là biểu mẫu không hợp lệ để ghi lại lịch sử trên kho lưu trữ công khai.

0

Giả sử repo chia sẻ của bạn cho phép, chỉ cần tiền tố tên chi nhánh với một dấu cộng để buộc đẩy phi nhanh về phía trước:

git push origin +mybranch 
2

Trong trường hợp này có lẽ tốt nhất chỉ để thực hiện một cam kết thứ hai với sửa chữa. Vì bạn đã thay đổi commit đầu tiên ban đầu trong kho lưu trữ cục bộ của mình, có thể bạn sẽ muốn kéo nó từ kho lưu trữ được chia sẻ và di chuyển HEAD để cam kết thay đổi của bạn có thể được thu gom rác.

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