2013-03-26 27 views
9

OK, tôi đã làm điều gì đó ngu ngốc.Tôi cần xóa một cam kết với một ngã ba

  • Tôi đã chia đôi một repo Tôi phải đóng góp. Vì vậy, sau đó tôi đã tạo ra một tệp có tên là "blafile" để kiểm tra tôi có thể cam kết (rõ ràng là tôi không hiểu cái nĩa là gì) và cam kết với thông báo "kiểm tra tôi có thể cam kết".
  • Tôi đã đẩy đến repo github chia đôi và quên nó đi.
  • Tôi bắt đầu sửa lỗi vào ngày hôm sau.
  • Tôi đã khắc phục sự cố và được đẩy tới repo được chia đôi với thông báo "cố định lỗi xyz".

Bây giờ tôi muốn đưa ra yêu cầu kéo và đột nhiên tôi thấy "xác nhận tôi có thể cam kết" của mình. Tôi không muốn điều đó xuất hiện trên yêu cầu kéo. :)

Tôi có thể xóa hoàn toàn cam kết đó không? Tôi có thể đưa ra yêu cầu kéo trên một cam kết hay nó sẽ kéo tất cả các cam kết của tôi?

Tôi biết tôi có thể ở địa phương git reset --hard HEAD~1 (đó là một sửa chữa nhỏ tôi có thể làm lại nhanh) nhưng chỉ sửa lỗi repo địa phương của tôi chứ không phải repo github của tôi.

Trả lời

9

Rất nhiều tùy chọn.

Các lựa chọn tốt nhất có lẽ là để tạo ra một ngành mới và anh đào-chọn sửa chữa của bạn vào chi nhánh:

git checkout -b my-fix-branch origin/master 
git cherry-pick master 
git push -u origin my-fix-branch 

sau đó làm một yêu cầu kéo từ my-fix-branch trên GitHub. (Điều này giả định nhánh làm việc của bạn có tên là master, dựa trên điều khiển từ xa master; thay đổi tên chi nhánh nếu thích hợp).


NẾU ai đã kéo hoặc nhân bản ngã ba, bạn có thể viết lại lịch sử một cách mạnh mẽ. Thực hiện git rebase -i HEAD~2 và xóa cam kết vi phạm, sau đó git push --force. Điều này sẽ phá vỡ bất kỳ repo khác dựa trên ngã ba của bạn, do đó, làm không làm điều này nếu bạn nghi ngờ bất cứ ai khác đang sử dụng repo của bạn.

+0

Như tôi chắc chắn không ai chia rẽ repo của tôi (bằng cách nhìn vào đồ thị ngã ba), tôi viết lại lịch sử :) cảm ơn! – faboolous

3

Tôi tin rằng chuỗi lệnh sau đây sẽ hoạt động giả định rằng cam kết không hợp lệ của bạn chỉ là một cam kết trước HEAD hiện tại và tên chi nhánh là master.

LƯU Ý: Các lệnh sau sẽ ghi lại lịch sử không được khuyến nghị nếu có ai đã sao chép bản ghi nhớ của bạn. Nếu đó không phải là trường hợp push -f không phải là một việc lớn.

# Switch the current working tree to master branch 
git checkout master 
# Soft reset to get all the changes since HEAD~2 into the index/staging area 
git reset --soft HEAD~2 
# Remove the blafile from the staging area 
git rm --cached blafile 
# Commit the changes you actually intended to make 
git commit 
# Update the refs on the remote forcefully to push the newer commit. 
# Note that if any one else has pulled master already with your blafile 
# commit, they would be really pissed off with you now. 
git push -f origin master 
+0

'push -f' là nguy hiểm nếu có ai đó đã kéo repo của bạn. – nneonneo

+0

@nneonneo - Có, đã thêm nhận xét cho biết điều đó. Nhưng từ vẻ ngoài của nó, OP muốn viết lại lịch sử, ở đó không có 'blafile' mà không tạo ra một nhánh mới. – Tuxdude

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