Xóa cam kết cuối cùng trong bitbucket


103

Tôi đã mắc lỗi và tôi không biết cách xóa lần đẩy mới nhất của mình trong kho lưu trữ. Tôi kéo các bản cập nhật mới nhất của ứng dụng nhưng nó có xung đột và tôi đẩy nó vào kho lưu trữ.

Làm thế nào để xóa cam kết cuối cùng của tôi? Hoặc làm thế nào để sửa chữa nó?

Câu trả lời:


102

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ữ.


Cảm ơn vì thông tin. Và tôi biết hậu quả nếu tôi xóa cam kết, tôi chỉ không biết cách hoàn tác hành động của mình vì đây là lần đầu tiên tôi mắc lỗi. Tôi cần hoàn tác cam kết của mình vì hệ thống đã hoạt động. Chúng tôi chỉ có hai người đang làm việc với kho lưu trữ đó.
catherine

git backout <REV>? Hoặc hg backout <REV>:?
Armando Pérez Marqués

Nhưng điều gì sẽ xảy ra nếu các cam kết được thêm vào sau khi cam kết được hoàn nguyên đã thực hiện các sửa đổi trên dòng bị xóa?
rahs

@RahulSaha vì những gì bạn đang làm về cơ bản là cố gắng hợp nhất một cam kết vào nhánh, tôi khá chắc chắn rằng nó sẽ mang lại cho bạn một xung đột hợp nhất mà bạn sẽ phải giải quyết.
asermax

98

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.

Nếu bạn đang cố gắng thay đổi một nhánh không phải chính:

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ếu bạn đang cố gắng thay đổi nhánh chính

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 .

Đối phó với những cộng tác viên khó chịu

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-pickcam 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.


1
Đối với những người thoải mái hơn với việc sử dụng SourceTree: 1) Để thay đổi nhánh chính trong giao diện người dùng web cho BitBucket, hãy xem Cài đặt Repo. 2) Để xóa một nhánh trong giao diện người dùng web, hãy xem trên trang Chi nhánh. 3) Đặt lại repo cục bộ như trên. 4) Đẩy các thay đổi cục bộ của bạn lên để tạo lại các nhánh đó.
Richard Le Mesurier

2
Là một người vô tình đẩy ra một bí mật, tôi rất cảm kích sự thấu đáo của câu trả lời này. Cảm ơn!
Mô-men xoắn

48

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ọ.


Github sẽ cho phép điều này, nhưng tại thời điểm viết bài này, Bitbucket không cho phép đẩy lực.
JamesQMurphy

4
thực sự bitbucket không hỗ trợ lực đẩy chỉ khác là thay vì loại bỏ hoàn toàn các cam kết chưa được theo dõi, nó đánh dấu chúng là đã xóa.
Shubanker

Cách được đề xuất từ ​​bitbucket là sử dụng hoàn nguyên. Nhưng tôi nghĩ trong trường hợp của tôi thì điều này phù hợp hơn. Vì tôi là người duy nhất sử dụng nó, và nó cảm thấy sạch sẽ hơn sử dụng hoàn nguyên. Cảm ơn.
nafsaka

1
Có, điều này vẫn hoạt động trên Bitbucket. Bạn vừa tiết kiệm cho tôi thời gian lớn! Tôi đã thực hiện một cam kết / đẩy từ Eclipse của mình và bị trộn lẫn với dự án khác mà tôi có. Một phần là do tôi đã sử dụng cả dòng lệnh và nhật thực tích hợp để làm việc trên git.
DarkCygnus 21/09/17

tuyệt vời, hoặc dễ dàng hơn: đặt lại nhánh hiện tại về cam kết này, sau đó sử dụng lực đẩy đó để máy chủ khắc phục sự cố của tôi
Anthony Kal

3

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


1
Cắt và dán thực sự rất lộn xộn. Thêm vào đó, điều này sẽ không giải quyết được vấn đề từ câu hỏi.
Daniel Lee

1
git revertrấ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.
naught101

1
Git hoàn nguyên là cơ chế bình đẳng như trên.
nafsaka

3

Đâ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.


2

Như những người khác đã nói, thông thường bạn muốn sử dụng hg backouthoặ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 commitsliên kết.

Strip cam kết liên kết trong cài đặt bitbucket

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 Confirmvà 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.


Đó là phiên bản nào và những quyền nào được yêu cầu? Nó trông khác trên v6.4.3 mà tôi đang xem và mục này không có ở đó. Tôi quản trị viên kho lưu trữ.
Raphael

1

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)

nhập mô tả hình ảnh ở đây

Xóa hoàn toàn hàng cam kết cuối cùng

3) lưu nó bằng ctrl+Xhoặ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 ..


1

Bạn cũng có thể viết lệnh cho Bitbucket như Dustin đã đề cập :

git push -f origin HEAD^:master

Lưu ý: thay vì master bạn có thể sử dụng bất kỳ nhánh nào. Và nó xóa chỉ cần đẩy trên Bitbucket.

Để loại bỏ cam kết cuối cùng cục bộ trong sử dụng git:

git reset --hard HEAD~1

0

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'.

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.