Câu trả lời:
Trước tiên, nếu bạn đang làm việc với những người khác trên cùng một kho lưu trữ mã, bạn không nên xóa một cam kết vì khi bạn buộc cập nhật trên kho lưu trữ, nó sẽ khiến kho lưu trữ cục bộ của đồng nghiệp của bạn ở trạng thái bất hợp pháp (ví dụ: nếu họ thực hiện các cam kết sau khi bạn đã xóa, các cam kết đó sẽ không hợp lệ vì chúng dựa trên một cam kết hiện không tồn tại).
Nói rằng, những gì bạn có thể làm là hoàn nguyên cam kết. Quy trình này được thực hiện khác nhau (các lệnh khác nhau) tùy thuộc vào CVS bạn đang sử dụng:
Trên git :
git revert <commit>
On lanh lợi :
hg backout <REV>
CHỈNH SỬA: Thao tác hoàn nguyên tạo ra một cam kết mới thực hiện ngược lại với cam kết hoàn nguyên (ví dụ: nếu cam kết ban đầu thêm một dòng, thì cam kết hoàn nguyên sẽ xóa dòng đó), loại bỏ hiệu quả các thay đổi của cam kết không mong muốn mà không cần viết lại lịch sử kho lưu trữ.
git backout <REV>
? Hoặc hg backout <REV>
:?
Nếu bạn không làm việc với những người khác (hoặc rất vui khi gây ra cho họ sự phiền toái đáng kể) , thì bạn có thể xóa các cam kết khỏi các nhánh bitbucket.
git reset HEAD^ # remove the last commit from the branch history
git push origin :branch_name # delete the branch from bitbucket
git push origin branch_name # push the branch back up again, without the last commit
Nói chung, nhánh chủ không có gì đặc biệt - nó chỉ là một quy ước. Tuy nhiên, bitbucket và github và các trang web tương tự thường yêu cầu có một nhánh chính (có lẽ vì nó dễ dàng hơn việc viết nhiều mã hơn để xử lý trường hợp kho lưu trữ không có nhánh - không chắc chắn). Vì vậy, bạn cần tạo một nhánh mới và đặt nhánh đó thành nhánh chính:
# on master:
git checkout -b master_temp
git reset HEAD^ # undo the bad commit on master_temp
git push origin master_temp # push the new master to Bitbucket
Trên Bitbucket, hãy chuyển đến cài đặt kho lưu trữ và thay đổi "Chi nhánh chính" thành master_temp
(trên Github, thay đổi "Chi nhánh mặc định").
git push origin :master # delete the original master branch from Bitbucket
git checkout master
git reset master_temp # reset master to master_temp (removing the bad commit)
git push origin master # re-upload master to bitbucket
Bây giờ, hãy truy cập Bitbucket, và bạn sẽ thấy lịch sử mà bạn muốn. Bây giờ bạn có thể truy cập trang cài đặt và thay đổi lại Chi nhánh chính thành master
.
Quá trình này cũng sẽ hoạt động với bất kỳ thay đổi lịch sử nào khác (ví dụ git filter-branch
:). Bạn chỉ cần đảm bảo đặt lại các cam kết thích hợp, trước khi lịch sử mới tách khỏi lịch sử cũ.
chỉnh sửa : rõ ràng là bạn không cần phải thực hiện tất cả những rắc rối này trên github, vì bạn có thể ép buộc một nhánh đặt lại .
Lần tới khi bất kỳ ai cố gắng lấy từ kho lưu trữ của bạn, (nếu họ đã kéo cam kết xấu), việc kéo sẽ không thành công. Họ sẽ phải đặt lại theo cách thủ công về cam kết trước khi lịch sử thay đổi, sau đó kéo lại.
git reset HEAD^
git pull
Nếu họ đã kéo cam kết xấu và cam kết trên đó , thì họ sẽ phải thiết lập lại, sau đó git cherry-pick
cam kết tốt mà họ muốn tạo, tạo lại toàn bộ nhánh một cách hiệu quả mà không có cam kết xấu.
Nếu họ không bao giờ kéo cam kết xấu, thì toàn bộ quá trình này sẽ không ảnh hưởng đến họ và họ có thể kéo như bình thường.
bạn có thể đặt lại để HEAD^
sau đó buộc đẩy nó.
git reset HEAD^
git push -u origin master --force
Nó sẽ xóa cam kết cuối cùng của bạn và sẽ phản ánh trên bitbucket khi cam kết bị xóa nhưng sẽ vẫn còn trên máy chủ của họ.
Trước đây, tôi đã gặp sự cố với việc hoàn nguyên git (chủ yếu là do tôi không chắc chắn về cách hoạt động của nó.) Tôi đã gặp sự cố khi hoàn nguyên do sự cố hợp nhất ..
Giải pháp đơn giản của tôi là này.
Bước 1.
git clone <your repos URL> .
dự án của bạn trong một thư mục khác, sau đó:
Bước 2.
git reset --hard <the commit you wanna go to>
sau đó Bước 3.
trong dir dự án mới nhất (và chính) của bạn (dự án có lần cam kết cuối cùng có vấn đề), hãy dán các tệp của bước 2
Bước 4.
git commit -m "Fixing the previous messy commit"
Bước 5.
Thưởng thức
git revert
rất đơn giản: nó tạo ra một cam kết mới thực hiện ngược lại những thay đổi trong một cam kết trước đó (hoặc nhiều cam kết). Nó không xóa các cam kết, vì vậy nó không liên quan đến câu hỏi này. Ngoài ra, bước nhân bản ở đây không thực sự cần thiết.
Đây là một cách tiếp cận đơn giản với tối đa 4 bước:
0 - Tư vấn cho nhóm bạn sắp sửa kho lưu trữ
Kết nối với nhóm và cho họ biết về những thay đổi sắp tới.
1 - Xóa cam kết cuối cùng
Giả sử nhánh mục tiêu của bạn là master
:
$ git checkout master # move to the target branch
$ git reset --hard HEAD^ # remove the last commit
$ git push -f # push to fix the remote
Tại thời điểm này, bạn đã hoàn thành nếu bạn đang làm việc một mình.
2 - Sửa các kho lưu trữ cục bộ của đồng đội của bạn
Trên đồng đội của bạn:
$ git checkout master # move to the target branch
$ git fetch # update the local references but do not merge
$ git reset --hard origin/master # match the newly fetched remote state
Nếu đồng đội của bạn không có cam kết mới, bạn đã hoàn thành tại thời điểm này và bạn nên đồng bộ hóa.
3 - Mang lại những cam kết đã mất
Giả sử một đồng đội có một cam kết mới và chưa được xuất bản đã bị mất trong quá trình này.
$ git reflog # find the new commit hash
$ git cherry-pick <commit_hash>
Làm điều này cho nhiều cam kết nếu cần.
Tôi đã sử dụng thành công cách tiếp cận này nhiều lần. Nó đòi hỏi nỗ lực của cả nhóm để đảm bảo mọi thứ được đồng bộ hóa.
Như những người khác đã nói, thông thường bạn muốn sử dụng hg backout
hoặc git revert
. Tuy nhiên, đôi khi bạn thực sự muốn thoát khỏi một cam kết.
Trước tiên, bạn sẽ muốn chuyển đến cài đặt kho lưu trữ của mình. Bấm vào Strip commits
liên kết.
Nhập ID tập hợp thay đổi cho tập hợp thay đổi bạn muốn hủy và nhấp vào Preview strip
. Điều đó sẽ cho bạn biết loại thiệt hại mà bạn sắp gây ra trước khi thực hiện. Sau đó, chỉ cần nhấp vào Confirm
và cam kết của bạn không còn là lịch sử. Đảm bảo rằng bạn nói cho tất cả các cộng tác viên của mình những gì bạn đã làm, để họ không vô tình đẩy lùi cam kết vi phạm.
Khi các thay đổi đã được cam kết, nó sẽ không thể xóa. vì bản chất cơ bản của commit là không xóa.
Điều bạn có thể làm (phương pháp dễ dàng và an toàn),
Rebase tương tác:
1) git rebase -i HEAD~2
# sẽ hiển thị 2 cam kết gần đây của bạn
2) Cam kết của bạn sẽ liệt kê như, Gần đây sẽ xuất hiện ở cuối trang LILO (cuối cùng trong Cuối cùng)
Xóa hoàn toàn hàng cam kết cuối cùng
3) lưu nó bằng ctrl+X
hoặcESC:wq
bây giờ chi nhánh của bạn sẽ được cập nhật mà không có cam kết cuối cùng của bạn ..
Hiện tại, đám mây bitbucket (tôi không chắc phiên bản nào) cho phép hoàn nguyên cam kết từ hệ thống tệp như sau (tôi không thấy cách hoàn nguyên từ giao diện Bitbucket trong trình duyệt Chrome).
-sao lưu toàn bộ thư mục của bạn để bảo mật những thay đổi bạn đã vô tình vi phạm
-chọn thư mục đã kiểm tra
-phút chuột phải: rùa git menu
-repo-browser (tùy chọn menu 'hoàn nguyên' chỉ hoàn tác các thay đổi không giới hạn)
-nhấn nút HEAD
-chọn dòng trên cùng (cam kết cuối cùng)
-phút chuột phải: hoàn nguyên thay đổi theo cam kết này
-sau khi nó hoàn tác các thay đổi trên hệ thống tệp, hãy nhấn cam kết
-điều này cập nhật GIT với thông báo 'Hoàn nguyên (tin nhắn trước đó của bạn). Việc hoàn nguyên này cam kết tương tự như vậy '
-chọn 'cam kết và đẩy'.