it-swarm-vi.com

Làm cách nào để hoàn tác các cam kết gần đây nhất trong Git?

Tôi đã vô tình cam kết các tệp sai thành Git , nhưng tôi chưa đẩy cam kết đến máy chủ.

Làm cách nào tôi có thể hoàn tác các cam kết đó từ kho lưu trữ cục bộ? 

19077
Hamza Yerlikaya

Hoàn tác một cam kết và làm lại

$ git commit -m "Something terribly misguided"             # (1)
$ git reset HEAD~                                          # (2)
<< edit files as necessary >>                              # (3)
$ git add ...                                              # (4)
$ git commit -c ORIG_HEAD                                  # (5)
  1. Đây là những gì bạn muốn hoàn tác.
  2. Điều này làm cho cây làm việc của bạn (trạng thái tệp của bạn trên đĩa) không thay đổi nhưng hoàn tác cam kết và để lại những thay đổi bạn đã cam kết (vì vậy chúng sẽ xuất hiện dưới dạng "Thay đổi không được tổ chức cho cam kết" trong git status, vì vậy bạn sẽ cần thêm họ một lần nữa trước khi cam kết). Nếu bạn chỉ muốn thêm nhiều thay đổi hơn cho lần xác nhận trước hoặc thay đổi thông báo cam kết1, thay vào đó, bạn có thể sử dụng git reset --soft HEAD~, giống như git reset HEAD~ (trong đó HEAD~ giống với HEAD~1) nhưng để lại các thay đổi hiện tại của bạn.
  3. Thực hiện chỉnh sửa các tập tin cây làm việc.
  4. git add bất cứ điều gì bạn muốn đưa vào cam kết mới của bạn.
  5. Cam kết thay đổi, sử dụng lại thông điệp cam kết cũ. reset đã sao chép phần đầu cũ thành .git/ORIG_HEAD; commit với -c ORIG_HEAD sẽ mở trình soạn thảo, ban đầu chứa thông điệp tường trình từ cam kết cũ và cho phép bạn chỉnh sửa nó. Nếu bạn không cần chỉnh sửa tin nhắn, bạn có thể sử dụng tùy chọn -C.

Tuy nhiên, hãy cẩn thận nếu bạn đã thêm bất kỳ thay đổi mới nào vào chỉ mục, sử dụng commit --amend sẽ thêm chúng vào cam kết trước đó của bạn.

Nếu mã đã được đẩy đến máy chủ của bạn và bạn có quyền ghi đè lịch sử (rebase) thì:

git Push Origin master --force

Bạn cũng có thể nhìn vào câu trả lời này: 

Làm cách nào để di chuyển HEAD trở lại vị trí trước đó? (Đầu tách rời)

Câu trả lời ở trên sẽ hiển thị cho bạn git reflog được sử dụng để tìm hiểu SHA-1 mà bạn muốn hoàn nguyên là gì. Khi bạn tìm thấy điểm mà bạn muốn hoàn tác để sử dụng chuỗi lệnh như được giải thích ở trên.


1 Tuy nhiên, lưu ý rằng bạn không cần thiết lập lại cam kết trước đó nếu bạn vừa mắc lỗi trong thông báo commit. Tùy chọn dễ dàng hơn là git reset (để phản ánh bất kỳ thay đổi nào bạn đã thực hiện) và sau đó git commit --amend , sẽ mở trình soạn thảo thông báo cam kết mặc định của bạn được điền trước bằng thông báo cam kết cuối cùng. 

20714
Esko Luontola

Hoàn tác một cam kết là một chút đáng sợ nếu bạn không biết làm thế nào nó hoạt động. Nhưng nó thực sự dễ dàng đáng kinh ngạc nếu bạn hiểu.

Giả sử bạn có cái này, trong đó C là HEAD và (F) là trạng thái của các tệp của bạn.

   (F)
A-B-C
    ↑
  master

Bạn muốn nuke cam kết C và không bao giờ gặp lại. Bạn làm điều này:

git reset --hard HEAD~1

Kết quả là:

 (F)
A-B
  ↑
master

Bây giờ B là ĐẦU. Vì bạn đã sử dụng --hard, các tệp của bạn được đặt lại về trạng thái của chúng tại commit B.

À, nhưng giả sử cam kết C không phải là một thảm họa, nhưng chỉ là một chút thôi. Bạn muốn hoàn tác cam kết nhưng giữ các thay đổi của bạn để chỉnh sửa một chút trước khi bạn thực hiện cam kết tốt hơn. Bắt đầu lại từ đây, với C là ĐẦU của bạn:

   (F)
A-B-C
    ↑
  master

Bạn có thể làm điều này, bỏ --hard:

git reset HEAD~1

Trong trường hợp này, kết quả là:

   (F)
A-B-C
  ↑
master

Trong cả hai trường hợp, HEAD chỉ là một con trỏ trỏ tới cam kết mới nhất. Khi bạn thực hiện git reset HEAD~1, bạn nói với Git để di chuyển con trỏ HEAD trở lại một lần xác nhận. Nhưng (trừ khi bạn sử dụng --hard), bạn vẫn để các tệp của mình như cũ. Vì vậy, bây giờ git status hiển thị các thay đổi bạn đã kiểm tra C. Bạn chưa mất gì!

Đối với cú chạm nhẹ nhất, bạn thậm chí có thể hoàn tác cam kết của mình nhưng để lại các tệp và index:

git reset --soft HEAD~1

Điều này không chỉ để các tệp của bạn một mình, nó thậm chí còn để lại index của bạn. Khi bạn làm git status, bạn sẽ thấy các tệp tương tự nằm trong chỉ mục như trước. Thực tế, ngay sau lệnh này, bạn có thể thực hiện git commit và bạn sẽ làm lại cùng một cam kết mà bạn vừa có.

Một điều nữa: Giả sử bạn hủy một cam kết như trong ví dụ đầu tiên, nhưng sau đó phát hiện ra bạn cần nó sau tất cả? May mắn, phải không?

Không, có vẫn một cách để lấy lại. Nhập git reflog và bạn sẽ thấy một danh sách (một phần) cam kết shas (nghĩa là băm) mà bạn đã di chuyển xung quanh. Tìm cam kết bạn đã phá hủy và thực hiện điều này:

git checkout -b someNewBranchName shaYouDestroyed

Bây giờ bạn đã hồi sinh cam kết đó. Các cam kết không thực sự bị phá hủy trong Git trong khoảng 90 ngày, vì vậy bạn thường có thể quay lại và giải cứu một người mà bạn không có ý định loại bỏ.

10143
Ryan Lundy

Điều này khiến tôi mất một thời gian để tìm ra, vì vậy có lẽ điều này sẽ giúp ai đó ...

Có hai cách để "hoàn tác" cam kết cuối cùng của bạn, tùy thuộc vào việc bạn có thực hiện cam kết của mình hay không (được đẩy vào kho lưu trữ từ xa):

Làm thế nào để hoàn tác một cam kết cục bộ

Giả sử tôi đã cam kết tại địa phương, nhưng bây giờ muốn xóa cam kết đó.

git log
    commit 101: bad commit    # latest commit, this would be called 'HEAD'
    commit 100: good commit   # second to last commit, this is the one we want

Để khôi phục mọi thứ trở lại như trước khi cam kết cuối cùng, chúng ta cần reset cho cam kết trước HEAD:

git reset --soft HEAD^     # use --soft if you want to keep your changes
git reset --hard HEAD^     # use --hard if you don't care about keeping the changes you made

Bây giờ git log sẽ hiển thị rằng cam kết cuối cùng của chúng tôi đã bị xóa.

Làm thế nào để hoàn tác một cam kết công khai

Nếu bạn đã thực hiện các cam kết của mình ở chế độ công khai, bạn sẽ muốn tạo một cam kết mới sẽ "hoàn nguyên" các thay đổi bạn đã thực hiện trong cam kết trước đó (CHÍNH hiện tại).

git revert HEAD

Thay đổi của bạn bây giờ sẽ được hoàn nguyên và sẵn sàng để bạn cam kết:

git commit -m 'restoring the file I removed by accident'
git log
    commit 102: restoring the file I removed by accident
    commit 101: removing a file we don't need
    commit 100: adding a file that we need

Để biết thêm thông tin, hãy xem Cơ bản về Git - Hoàn tác mọi thứ

1909
Andrew

Thêm/xóa tệp để có được mọi thứ theo cách bạn muốn:

git rm classdir
git add sourcedir

Sau đó sửa đổi cam kết:

git commit --amend

Cam kết sai lầm trước đây sẽ được chỉnh sửa để phản ánh trạng thái chỉ mục mới - nói cách khác, nó sẽ giống như bạn không bao giờ mắc lỗi ở vị trí đầu tiên.

Lưu ý rằng bạn chỉ nên làm điều này nếu bạn chưa đẩy. Nếu bạn đã đẩy, thì bạn sẽ phải cam kết sửa chữa bình thường.

1669
bdonlan
git rm yourfiles/*.class
git commit -a -m "deleted all class files in folder 'yourfiles'"

hoặc là

git reset --hard HEAD~1

Cảnh báo: Lệnh trên sẽ xóa vĩnh viễn các sửa đổi đối với các tệp .Java (và mọi tệp khác) mà bạn muốn cam kết.

hard reset thành HEAD-1 sẽ đặt bản sao làm việc của bạn về trạng thái của cam kết trước khi cam kết sai của bạn.

933
Lennart Koopmann

Để thay đổi cam kết cuối cùng

Thay thế các tệp trong chỉ mục:

git rm --cached *.class
git add *.Java

Sau đó, nếu đó là một nhánh riêng, sửa đổi cam kết:

git commit --amend

Hoặc, nếu đó là một chi nhánh được chia sẻ, hãy thực hiện một cam kết mới:

git commit -m 'Replace .class files with .Java files'


(để thay đổi một cam kết trước đó, sử dụng phản hồi tuyệt vời tương tác )


ProTip ™: Thêm *.class vào gitignore để ngăn điều này xảy ra lần nữa.


Hoàn nguyên cam kết

Sửa đổi một cam kết là giải pháp lý tưởng nếu bạn cần thay đổi cam kết cuối cùng, nhưng một giải pháp tổng quát hơn là reset.

Bạn có thể đặt lại git thành bất kỳ cam kết nào với:

git reset @~N

Trong đó N là số lần xác nhận trước HEAD@~ đặt lại cho lần xác nhận trước đó.

Vì vậy, thay vì sửa đổi cam kết, bạn có thể sử dụng:

git reset @~
git add *.Java
git commit -m "Add .Java files"

Hãy xem git help reset, cụ thể là các phần trên --soft--mixed--hard, để hiểu rõ hơn về việc này.

Từ chối

Nếu bạn làm phiền, bạn luôn có thể sử dụng reflog để tìm các xác nhận bị hủy:

$ git reset @~
$ git reflog
c4f708b [email protected]{0}: reset: moving to @~
2c52489 [email protected]{1}: commit: added some .class files
$ git reset 2c52489
... and you're back where you started


712
Zaz

Sử dụng git revert <commit-id>

Để nhận ID cam kết, chỉ cần sử dụng git log

594
Jaco Pretorius

Nếu bạn dự định hoàn tác một cam kết cục bộ, bất cứ điều gì bạn thay đổi bạn đã thực hiện trên cam kết đó và nếu bạn không lo lắng bất cứ điều gì về điều đó, chỉ cần thực hiện lệnh sau.

git reset --hard HEAD^1

(Lệnh này sẽ bỏ qua toàn bộ cam kết của bạn và các thay đổi của bạn sẽ bị mất hoàn toàn khỏi cây làm việc cục bộ của bạn). Nếu bạn muốn hoàn tác cam kết của mình, nhưng bạn muốn thay đổi của mình trong khu vực tổ chức (trước khi cam kết giống như sau git add) thì hãy thực hiện lệnh sau.

git reset --soft HEAD^1

Bây giờ các tập tin cam kết của bạn đi vào khu vực tổ chức. Giả sử nếu bạn muốn tăng cường các tập tin, bởi vì bạn cần chỉnh sửa một số nội dung sai, sau đó thực hiện lệnh sau

git reset HEAD

Bây giờ các tập tin đã cam kết đến từ khu vực được dàn dựng vào khu vực chưa được tổ chức. Bây giờ các tệp đã sẵn sàng để chỉnh sửa, vì vậy bất cứ điều gì bạn thay đổi, bạn muốn đi chỉnh sửa và thêm nó và thực hiện một cam kết mới/mới.

Hơn

477
Madhan Ayyasamy

Nếu bạn có Git Extras đã cài đặt, bạn có thể chạy git undo để hoàn tác cam kết mới nhất. git undo 3 sẽ hoàn tác 3 lần xác nhận cuối cùng.

456
nickf

Tôi muốn hoàn tác 5 cam kết mới nhất trong kho lưu trữ được chia sẻ của chúng tôi. Tôi đã tra cứu id sửa đổi mà tôi muốn quay trở lại. Sau đó tôi gõ như sau.

Prompt> git reset --hard 5a7404742c85
HEAD is now at 5a74047 Added one more page to catalogue
Prompt> git Push Origin master --force
Total 0 (delta 0), reused 0 (delta 0)
remote: bb/acl: neoneye is allowed. accepted payload.
To [email protected]:thecompany/prometheus.git
 + 09a6480...5a74047 master -> master (forced update)
Prompt>
424
neoneye

Cách sửa lỗi cam kết cục bộ trước đó

Sử dụng git-gui (hoặc tương tự) để thực hiện git commit --amend. Từ GUI, bạn có thể thêm hoặc xóa các tệp riêng lẻ khỏi cam kết. Bạn cũng có thể sửa đổi thông điệp cam kết.

Làm thế nào để hoàn tác các cam kết cục bộ trước đó

Chỉ cần đặt lại chi nhánh của bạn về vị trí trước đó (ví dụ: sử dụng gitk hoặc git rebase). Sau đó, áp dụng lại các thay đổi của bạn từ một bản sao đã lưu. Sau khi thu gom rác trong kho lưu trữ cục bộ của bạn, nó sẽ giống như cam kết không mong muốn không bao giờ xảy ra. Để thực hiện tất cả điều đó trong một lệnh, sử dụng git reset HEAD~1.

Lời cảnh báo : Sử dụng bất cẩn git reset là một cách hay để đưa bản sao làm việc của bạn vào trạng thái khó hiểu . Tôi khuyên người mới Git nên tránh điều này nếu họ có thể.

Làm thế nào để hoàn tác một cam kết công khai

Thực hiện một chọn cherry đảo ngược ( git-Revert ) để hoàn tác các thay đổi.

Nếu bạn chưa kéo các thay đổi khác lên chi nhánh của mình, bạn chỉ cần thực hiện ...

git revert --no-edit HEAD

Sau đó Đẩy chi nhánh cập nhật của bạn vào kho lưu trữ được chia sẻ.

Lịch sử cam kết sẽ hiển thị cả hai lần xác nhận, riêng biệt .


Nâng cao: Sửa lỗi nhánh private trong kho lưu trữ công cộng

Điều này có thể nguy hiểm - hãy chắc chắn rằng bạn có một bản sao cục bộ của chi nhánh để sửa lại.

Cũng lưu ý: Bạn không muốn làm điều này nếu người khác có thể đang làm việc trên chi nhánh.

git Push --delete (branch_name) ## remove public version of branch

Dọn dẹp chi nhánh của bạn tại địa phương sau đó sửa lại ...

git Push Origin (branch_name)

Trong trường hợp bình thường, có lẽ bạn không cần lo lắng về lịch sử cam kết của chi nhánh tư nhân của mình còn nguyên sơ. Chỉ cần ấn một cam kết tiếp theo (xem 'Cách hoàn tác một cam kết công khai' ở trên) và sau đó, thực hiện squash-merge để ẩn lịch sử.

405
nobar

Tôi thích sử dụng git rebase -i cho công việc này, vì một danh sách Nice xuất hiện nơi tôi có thể chọn các cam kết để loại bỏ. Nó có thể không trực tiếp như một số câu trả lời khác ở đây, nhưng nó chỉ cảm thấy đúng .

Chọn bao nhiêu cam kết bạn muốn liệt kê, sau đó gọi như thế này (để tranh thủ ba lần cuối)

git rebase -i HEAD~3

Danh sách mẫu

pick aa28ba7 Sanity check for RtmpSrv port
pick c26c541 RtmpSrv version option
pick 58d6909 Better URL decoding support

Sau đó, Git sẽ xóa các xác nhận cho bất kỳ dòng nào mà bạn xóa.

401
Steven Penny

Nếu bạn đã phạm tội nhưng không được đẩy,

git reset --soft HEAD~1

ĐẦU ~ 1 là một tốc ký cho cam kết trước đầu. Ngoài ra, bạn có thể tham khảo SHA-1 của hàm băm nếu bạn muốn đặt lại. Tùy chọn --soft sẽ xóa cam kết nhưng nó sẽ để lại tất cả các tệp đã thay đổi của bạn "Thay đổi được cam kết", vì trạng thái git sẽ đặt nó.

Nếu bạn muốn loại bỏ bất kỳ thay đổi nào đối với các tệp được theo dõi trong cây làm việc kể từ khi xác nhận trước khi sử dụng " --hard ".

OR

Nếu bạn đã đẩy và ai đó thường là trường hợp của tôi, bạn không thể sử dụng git reset. Tuy nhiên, bạn có thể thực hiện hoàn nguyên git,

git revert HEAD

Điều này sẽ tạo ra một cam kết mới đảo ngược mọi thứ được giới thiệu bởi cam kết tình cờ.

310
santos_mgr

Nếu bạn muốn hoàn tác vĩnh viễn và bạn đã nhân bản một số kho lưu trữ 

Id cam kết có thể được nhìn thấy bởi 

git log 

Sau đó, bạn có thể làm -

git reset --hard <commit_id>

git Push Origin <branch_name> -f
306
poorva

Trên SourceTree (GUI cho GitHub), bạn có thể nhấp chuột phải vào cam kết và thực hiện 'Cam kết ngược'. Điều này sẽ hoàn tác những thay đổi của bạn.

Trên thiết bị đầu cuối:

Bạn có thể sử dụng thay thế:

git revert

Hoặc là:

git reset --soft HEAD^ # Use --soft if you want to keep your changes.
git reset --hard HEAD^ # Use --hard if you don't care about keeping your changes.
258
Varun Parakh

Một lệnh duy nhất:

git reset --soft 'HEAD^' 

Nó hoạt động tuyệt vời để hoàn tác cam kết địa phương cuối cùng!

242
Manish Shrivastava

Chỉ cần đặt lại nó bằng cách thực hiện lệnh bên dưới bằng cách sử dụng git:

git reset --soft HEAD~1

Giải thích: what git reset, về cơ bản là reset với bất kỳ cam kết nào bạn muốn quay lại, sau đó nếu bạn kết hợp nó với phím --soft, nó sẽ quay trở lại , nhưng hãy giữ các thay đổi trong (các) tệp của bạn, để bạn quay lại giai đoạn tệp vừa được thêm, HEAD là người đứng đầu chi nhánh và nếu bạn kết hợp với ~1 (trong phần này trong trường hợp bạn cũng sử dụng HEAD^), nó sẽ chỉ quay lại một cam kết mà bạn muốn ...

Tôi tạo các bước trong hình ảnh bên dưới để biết thêm chi tiết cho bạn, bao gồm tất cả các bước có thể xảy ra trong các tình huống thực tế và cam kết mã:

 How to undo the last commits in Git?

229
Alireza

Làm thế nào để hoàn tác cam kết Git cuối cùng?

Để khôi phục mọi thứ trở lại như trước khi cam kết cuối cùng, chúng ta cần đặt lại về cam kết trước TRƯỚC.

  1. Nếu bạn không muốn giữ những thay đổi mà bạn đã thực hiện:

    git reset --hard HEAD^
    
  2. Nếu bạn muốn giữ những thay đổi của mình:

    git reset --soft HEAD^
    

Bây giờ hãy kiểm tra nhật ký git của bạn. Nó sẽ cho thấy cam kết cuối cùng của chúng tôi đã bị xóa.

216
Ranjithkumar Ravi

Sử dụng reflog để tìm trạng thái chính xác

git reflog

reflog before REFLOG TRƯỚC KHI THIẾT LẬP

Chọn reflog chính xác (f3cb6e2 trong trường hợp của tôi) và gõ 

git reset --hard f3cb6e2

Sau đó, repo HEAD sẽ được đặt lại thành HEADid đó reset effect ĐĂNG NHẬP SAU KHI THIẾT LẬP

Cuối cùng, reflog trông giống như hình dưới đây

reflog after CUỐI CÙNG REFLOG

174
Shubham Chaudhary

"Đặt lại cây làm việc đến lần xác nhận cuối cùng"

git reset --hard HEAD^ 

"Làm sạch các tệp không xác định khỏi cây làm việc"

git clean    

xem - Tham khảo nhanh Git

LƯU Ý: Lệnh này sẽ xóa cam kết trước đó của bạn, vì vậy hãy thận trọng khi sử dụng! git reset --hard an toàn hơn -

169
Ravi_Parmar

Lần chạy đầu tiên: 

git reflog

Nó sẽ cho bạn thấy tất cả các hành động có thể bạn đã thực hiện trên kho lưu trữ của mình, ví dụ: cam kết, hợp nhất, kéo, v.v.

Sau đó làm:

git reset --hard ActionIdFromRefLog
152
U. Ali

Hoàn tác cam kết cuối cùng:

git reset --soft HEAD^ hoặc git reset --soft HEAD~

Điều này sẽ hoàn tác cam kết cuối cùng.

Ở đây --soft có nghĩa là đặt lại thành dàn.

HEAD~ hoặc HEAD^ có nghĩa là di chuyển đến cam kết trước CHÍNH.


Thay thế cam kết cuối cùng vào cam kết mới:

git commit --amend -m "message"

Nó sẽ thay thế cam kết cuối cùng với cam kết mới.

143
akshay_rahar

Cách khác:

Kiểm tra chi nhánh bạn muốn hoàn nguyên, sau đó đặt lại bản sao làm việc cục bộ của bạn trở lại cam kết mà bạn muốn là bản mới nhất trên máy chủ từ xa (mọi thứ sau đó sẽ tạm biệt). Để thực hiện việc này, trong SourceTree, tôi đã nhấp chuột phải vào và chọn "Đặt lại BRANCHNAME cho cam kết này".

Sau đó điều hướng đến thư mục cục bộ của kho lưu trữ của bạn và chạy lệnh này:

git -c diff.mnemonicprefix=false -c core.quotepath=false Push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

Điều này sẽ xóa tất cả các xác nhận sau cái hiện tại trong kho lưu trữ cục bộ của bạn nhưng chỉ cho một nhánh đó.

138
CommaToast

Nhập git log và tìm mã băm xác nhận cuối cùng rồi nhập:

git reset <the previous co>
129
user853293

Trong trường hợp của tôi, tôi đã vô tình phạm một số tệp mà tôi không muốn. Vì vậy, tôi đã làm như sau và nó đã làm việc:

git reset --soft HEAD^
git rm --cached [files you do not need]
git add [files you need]
git commit -c ORIG_HEAD

Xác nhận kết quả bằng gitk hoặc git log --stat

125
egridasov

Sử dụng SourceTree (công cụ đồ họa cho Git) để xem các cam kết và cây của bạn. Bạn có thể tự đặt lại trực tiếp bằng cách nhấp chuột phải vào nó.

114
iOS Coder

Đơn giản, chạy cái này trong dòng lệnh của bạn:

git reset --soft HEAD~ 
114
kyo

Để đặt lại về phiên bản trước, xóa vĩnh viễn tất cả các thay đổi không được cam kết: 

git reset --hard HEAD~1
113
thestar

Có hai kịch bản chính

Bạn chưa đẩy được cam kết

Nếu sự cố là các tệp bổ sung mà bạn đã cam kết (và bạn không muốn những tệp đó trên kho lưu trữ), bạn có thể xóa chúng bằng cách sử dụng git rm và sau đó cam kết với --amend

git rm <pathToFile>

Bạn cũng có thể xóa toàn bộ thư mục bằng -r hoặc thậm chí kết hợp với các lệnh Bash khác

git rm -r <pathToDirectory>
git rm $(find -name '*.class')

Sau khi xóa các tệp, bạn có thể cam kết, với tùy chọn --amend

git commit --amend -C HEAD # the -C option is to use the same commit message

Điều này sẽ viết lại cam kết cục bộ gần đây của bạn loại bỏ các tệp bổ sung, vì vậy, các tệp này sẽ không bao giờ được gửi trên Push và cũng sẽ bị xóa khỏi kho lưu trữ .git cục bộ của bạn bởi GC.

Bạn đã đẩy cam kết

Bạn có thể áp dụng cùng một giải pháp cho kịch bản khác và sau đó thực hiện git Push với tùy chọn -f, nhưng đó là không được đề xuất vì nó ghi đè lên lịch sử từ xa bằng thay đổi phân kỳ (nó có thể làm rối kho lưu trữ của bạn).

Thay vào đó, bạn phải thực hiện cam kết mà không có --amend (hãy nhớ điều này về -amend`: Tùy chọn đó viết lại lịch sử trên lần xác nhận cuối cùng).

113
dseminara

Có rất nhiều cách để làm điều đó:

Lệnh Git để hoàn tác các cam kết/cam kết trước đó:

Cảnh báo : Không sử dụng - mặc dù bạn không biết bạn đang làm gì .-- khó quá nguy hiểm, và nó có thể xóa các tệp của bạn.

Lệnh cơ bản để hoàn nguyên cam kết trong Git là :

$ git reset --hard <COMMIT -ID>

hoặc là

$ git reset --hard HEAD~<n>

CAM KẾT-ID: ID cho cam kết

n : là số lần xác nhận cuối cùng bạn muốn hoàn nguyên

Bạn có thể lấy id xác nhận như hình dưới đây:

$ **git log --oneline**

d81d3f1 function to subtract two numbers

be20eb8 function to add two numbers

bedgfgg function to mulitply two numbers

trong đó d81d3f1be20eb8 là id xác nhận.

Bây giờ chúng ta hãy xem một số trường hợp :

Giả sử bạn muốn hoàn nguyên cam kết cuối cùng 'd81d3f1'. Đây là hai tùy chọn:

$ git reset --hard d81d3f1

hoặc là

$ git reset --hard HEAD~1

Giả sử bạn muốn hoàn nguyên cam kết 'be20eb8':

$ git reset --hard be20eb8

Để biết thêm thông tin chi tiết, bạn có thể tham khảo và thử một số lệnh khác để đặt lại đầu vào trạng thái được chỉ định:

$ git reset --help
113
Upen

Đối với một cam kết địa phương

git reset --soft HEAD~1

hoặc nếu bạn không nhớ chính xác đó là cam kết nào, bạn có thể sử dụng

git rm --cached <file>

Đối với một cam kết đẩy

Cách thích hợp để xóa các tệp khỏi lịch sử kho lưu trữ là sử dụng git filter-branch. Đó là,

git filter-branch --index-filter 'git rm --cached <file>' HEAD

Nhưng tôi khuyên bạn nên sử dụng lệnh này một cách cẩn thận. Đọc thêm tại git-filter-Branch (1) Trang hướng dẫn.

112
geoom

SỬ DỤNG GÌ, reset --soft hoặc reset --hard?

Tôi chỉ thêm hai xu cho câu trả lời của @ Kyralessa:

Nếu bạn không chắc chắn nên sử dụng cái gì cho --soft (Tôi đã sử dụng quy ước này để ghi nhớ nó - s oft cho an toàn).

Tại sao ?

Nếu bạn chọn --hard do nhầm lẫn, bạn sẽMẤTthay đổi của bạn như trước đây . Nếu bạn chọn --soft do nhầm lẫn, bạn có thể đạt được kết quả tương tự --hard bằng cách áp dụng các lệnh bổ sung

git reset HEAD file.html
git checkout -- file.html

Ví dụ đầy đủ

echo "some changes..." > file.html
git add file.html
git commit -m "wrong commit"

# I need to reset
git reset --hard HEAD~1 (cancel changes)
# OR
git reset --soft HEAD~1 # Back to staging
git reset HEAD file.html # back to working directory
git checkout -- file.html # cancel changes

Tín dụng đến @Kyralessa.

91
amd

Hãy nghĩ rằng chúng tôi có tệp code.txt . Chúng tôi thực hiện một số thay đổi về nó và cam kết. Chúng tôi có thể hoàn tác cam kết này theo ba cách , nhưng trước tiên bạn nên biết tệp được phân đoạn là gì ... Tệp được phân loại là một tệp sẵn sàng để cam kết và nếu bạn chạy git status thì tệp này sẽ được hiển thị với màu xanh lục và nếu đây không phải là giai đoạn cho cam kết sẽ được hiển thị với màu đỏ:

enter image description here

Điều đó có nghĩa là nếu bạn cam kết thay đổi, những thay đổi của bạn trên tệp này sẽ không được lưu. Bạn có thể thêm tệp này trong giai đoạn của mình bằng git add code.txt và sau đó cam kết thay đổi của bạn:

enter image description here

Hoàn tác cam kết cuối cùng:

  1. Bây giờ nếu chúng tôi muốn hoàn tác cam kết mà không có bất kỳ thay đổi nào khác, chúng tôi có thể sử dụng

    git reset --soft HEAD^

    enter image description here

  2. Nếu chúng tôi muốn hoàn tác cam kết và các thay đổi của nó ( NÀY IS NGUY HIỂM, vì thay đổi của bạn sẽ bị mất ), chúng ta có thể sử dụng

    git reset --hard HEAD^

    enter image description here

  3. Và nếu chúng tôi muốn hoàn tác cam kết và xóa các thay đổi khỏi giai đoạn, chúng tôi có thể sử dụng

    git reset --mixed HEAD^ hoặc ở dạng ngắn git reset HEAD^

    enter image description here

72
Ali Motameni

Bạn có thể dùng:

git reset [email protected]{1}

Lệnh này sẽ xóa cam kết sai của bạn mà không có nhật ký Git.

62
Jade Han

Thông thường, bạn muốn hoàn tác cam kết vì bạn đã mắc lỗi và bạn muốn sửa nó - về cơ bản là những gì OP đã làm khi anh ấy đặt câu hỏi. Vì vậy, thực sự, bạn thực sự muốn làm lại một cam kết.

Hầu hết các câu trả lời ở đây tập trung vào dòng lệnh. Mặc dù dòng lệnh là cách tốt nhất để sử dụng Git khi bạn cảm thấy thoải mái với nó, nhưng nó có lẽ hơi xa lạ với những người đến từ các hệ thống kiểm soát phiên bản khác với Git. 

Đây là cách thực hiện bằng GUI. Nếu bạn đã cài đặt Git, bạn đã có mọi thứ bạn cần để làm theo các hướng dẫn này.

LƯU Ý: Tôi sẽ giả sử ở đây rằng bạn nhận ra cam kết là sai trước khi bạn đẩy nó. Nếu bạn không biết đẩy là gì, có lẽ bạn chưa đẩy, vì vậy hãy tiếp tục với hướng dẫn. Nếu bạn đã đẩy cam kết bị lỗi, cách ít rủi ro nhất là theo dõi cam kết bị lỗi với một cam kết mới sửa chữa mọi thứ, cách bạn sẽ thực hiện trong hệ thống kiểm soát phiên bản không cho phép bạn viết lại lịch sử. 

Điều đó nói rằng, đây là cách khắc phục lỗi gần đây nhất của bạn bằng GUI:

  1. Điều hướng đến kho lưu trữ của bạn trên dòng lệnh và bắt đầu gui với git gui
  2. Chọn "Sửa đổi cam kết cuối cùng". Bạn sẽ thấy thông điệp cam kết cuối cùng của bạn, các tệp bạn dàn dựng và các tệp bạn không.
  3. Bây giờ thay đổi mọi thứ theo cách bạn muốn chúng nhìn và nhấp vào Cam kết. 
57
Carl

Nếu bạn đang làm việc với SourceTree, điều này sẽ giúp bạn.

Nhấp chuột phải vào cam kết sau đó chọn " Đặt lại (nhánh hiện tại)/master thành cam kết này "và cuối cùng chọn Đặt lại" Mềm ".

Enter image description here

57
Alexandr

Chỉ cần hoàn tác cam kết cuối cùng: 

git reset --soft HEAD~

Hoặc hoàn tác thời gian trước khi cam kết lần trước: 

git reset --soft HEAD~2

Hoặc hoàn tác bất kỳ cam kết nào trước đó: 

git reset --soft <commitID>

(bạn có thể nhận được xác nhận bằng cách sử dụng git reflog)

Khi bạn hoàn tác một cam kết trước đó, hãy nhớ dọn dẹp nơi làm việc với

git clean

Thông tin chi tiết có thể được tìm thấy trong các tài liệu: git-reset

53
steven

Hoàn tác Cam kết cuối cùng

Có rất nhiều tình huống mà bạn thực sự muốn hoàn tác cam kết cuối cùng vào mã của mình. Ví dụ. bởi vì bạn muốn cơ cấu lại nó một cách rộng rãi - hoặc thậm chí loại bỏ nó hoàn toàn!

Trong những trường hợp này, lệnh "đặt lại" là người bạn tốt nhất của bạn:

$ git reset --soft HEAD~1

Lệnh trên (đặt lại) sẽ tua lại nhánh HEAD hiện tại của bạn để sửa đổi được chỉ định. Trong ví dụ của chúng tôi ở trên, chúng tôi muốn quay lại bản trước khi sửa đổi hiện tại - thực hiện cam kết cuối cùng của chúng tôi hoàn tác.

Lưu ý cờ --soft: điều này đảm bảo rằng những thay đổi trong bản sửa đổi hoàn tác được giữ nguyên. Sau khi chạy lệnh, bạn sẽ tìm thấy các thay đổi dưới dạng sửa đổi cục bộ không được cam kết trong bản sao làm việc của bạn.

Nếu bạn không muốn giữ những thay đổi này, chỉ cần sử dụng cờ --hard. Hãy chắc chắn chỉ làm điều này khi bạn chắc chắn rằng bạn không cần những thay đổi này nữa.

$ git reset --hard HEAD~1

 Enter image description here

51
Mohit

Để hoàn tác cam kết cục bộ của bạn, bạn sử dụng git reset <commit>. Ngoài ra hướng dẫn đó rất hữu ích để cho bạn thấy cách nó hoạt động.

Ngoài ra, bạn có thể sử dụng git revert <commit>: hoàn nguyên nên được sử dụng khi bạn muốn thêm một cam kết khác để quay lại các thay đổi (nhưng giữ chúng trong lịch sử dự án).

47
mfathy00

Một chu kỳ Git điển hình

Khi nói về các lệnh liên quan đến Git trong các câu trả lời trước, tôi muốn chia sẻ các chu kỳ Git điển hình của tôi với tất cả các độc giả có thể hữu ích. Đây là cách tôi làm việc với Git,

  1. Nhân bản lần đầu tiên từ máy chủ từ xa

    git clone $project

  2. Kéo từ xa (khi tôi không có cam kết cục bộ đang chờ xử lý)

    git pull

  3. Thêm tệp cục bộ mới1 vào $ to_be_commned_list (chỉ cần tưởng tượng $ to_be_commned_list có nghĩa là khu vực staged)

    git add $file1

  4. Xóa tệp2 đã thêm nhầm từ $ to_be_commned_list (giả sử rằng tệp2 được thêm vào như bước 3, điều mà tôi không muốn)

    git reset $file2

  5. Cam kết tập tin1 trong $ to_be_commited_list

    git commit -m "commit message description"

  6. Đồng bộ hóa cam kết cục bộ với kho lưu trữ từ xa trước khi đẩy

    git pull --rebase

  7. Giải quyết khi xảy ra xung đột điều kiện tiên quyết cấu hình mergetool

    git mergetool #resolve merging here, also can manually merge

  8. Thêm các tệp được giải quyết xung đột, giả sử file1:

    git add $file1

  9. Tiếp tục lệnh rebase trước đây của tôi

    git rebase --continue

  10. Đẩy sẵn sàng và đã được đồng bộ hóa cam kết cục bộ cuối cùng

    git Push Origin head:refs/for/$branch # branch = master, dev, etc.

41
Sazzad Hissain Khan

Trong trường hợp của tôi, tôi đã cam kết và bị đẩy đến chi nhánh sai, vì vậy điều tôi muốn là lấy lại tất cả các thay đổi của mình để tôi có thể đưa chúng vào một chi nhánh chính xác mới, vì vậy tôi đã làm điều này:

Trên cùng một nhánh mà bạn đã cam kết và đẩy, nếu bạn nhập "trạng thái git", bạn sẽ không thấy bất cứ điều gì mới vì bạn đã cam kết và đẩy, bây giờ hãy gõ:

git reset --soft HEAD~1

Điều này sẽ đưa tất cả các thay đổi (tệp) của bạn trở lại trong khu vực giai đoạn, bây giờ để đưa chúng trở lại trong thư mục làm việc (không có giai đoạn) bạn chỉ cần gõ:

git reset FILE

Trong đó "Tệp" là tệp bạn muốn cam kết lại. Bây giờ TẬP TIN này phải ở trong thư mục làm việc (chưa được xử lý) với tất cả các thay đổi mà bạn đã làm. Bây giờ bạn có thể thay đổi thành bất kỳ nhánh nào bạn muốn và cam kết thay đổi trong nhánh đó. Hy vọng điều này sẽ giúp những người khác mắc lỗi tương tự tôi đã làm. Tất nhiên, nhánh ban đầu mà bạn đã cam kết vẫn ở đó với tất cả các thay đổi, nhưng trong trường hợp của tôi thì không sao, nếu nó không dành cho bạn, bạn có thể tìm cách hoàn nguyên cam kết đó trong nhánh đó.

39
FraK

NGƯỜI SỬ DỤNG STUDIO STUDUAL (2015, v.v.)

Nếu bạn không thể đồng bộ hóa trong Visual Studio vì bạn không được phép Đẩy đến một nhánh như "phát triển" thì nhiều như tôi đã thử, trong Visual Studio CẦN TÌM HO&AGRAVE;N NGUY&ECIRC;N NOR đặt lại (cứng hoặc mềm) sẽ hoạt động.

Theo câu trả lời với TẤN VOTES:

Sử dụng điều này tại lệnh Nhắc root của dự án của bạn để nuke bất cứ điều gì sẽ cố gắng để được đẩy:

git reset --hard HEAD~1

Sao lưu hoặc Zip các tệp của bạn chỉ trong trường hợp bạn không muốn mất bất kỳ công việc nào, v.v ...

38
Tom Stickel

Tôi đã nhận được ID cam kết từ bitbucket và sau đó đã làm:

git checkout commitID .

Thí dụ:

git checkout 7991072 .

Và nó hoàn nguyên nó trở lại bản sao làm việc của cam kết đó.

35
ioopl

Giả sử bạn đã thực hiện một cam kết sai cục bộ và đẩy nó vào một kho lưu trữ từ xa. Bạn có thể hoàn tác mớ hỗn độn bằng hai lệnh này:

Trước tiên, chúng ta cần sửa lỗi kho lưu trữ cục bộ của mình bằng cách quay lại cam kết mà chúng ta mong muốn:

git reset --hard <previous good commit id where you want the local repository  to go>

Bây giờ chúng tôi mạnh mẽ đẩy cam kết tốt này vào kho lưu trữ từ xa bằng cách sử dụng lệnh này:

git Push --force-with-lease

Phiên bản 'cho thuê' của tùy chọn bắt buộc, nó sẽ ngăn việc vô tình xóa các cam kết mới mà bạn không biết (tức là đến từ một nguồn khác kể từ lần kéo cuối cùng của bạn).

34
KawaiKx

Hoàn tác cam kết cuối cùng:

git reset --soft HEAD^ or git reset --soft HEAD~

Điều này sẽ hoàn tác cam kết cuối cùng.

Ở đây --soft có nghĩa là đặt lại thành dàn.

HEAD~ or HEAD^ có nghĩa là di chuyển đến cam kết trước TRƯỚC.

Thay thế cam kết cuối cùng vào cam kết mới:

git commit --amend -m "message"

Nó sẽ thay thế cam kết cuối cùng với cam kết mới.

32
Ankit Patidar

Bạn cần làm dễ dàng và nhanh chóng

    git commit --amend

nếu đó là một chi nhánh tư nhân hoặc

    git commit -m 'Replace .class files with .Java files'

nếu đó là một chi nhánh chung hoặc công cộng.

32
Yahs Hef

Bạn có một số tùy chọn để hoàn tác cam kết cuối cùng của bạn. Dưới đây là một số tùy chọn của bạn được tóm tắt thành một câu trả lời duy nhất với đoạn mã

Trước hết bạn cần tìm ra những cam kết "sai" mà bạn muốn loại bỏ. Chúng tôi sẽ sử dụng git reflog để tìm nó.


git reflog

Bạn luôn có thể sử dụng reflog.
git reflog sẽ hiển thị bất kỳ thay đổi nào đã cập nhật HEAD và kiểm tra mục nhập reflog mong muốn sẽ đặt HEAD trở lại cam kết này. 

Mỗi khi HEAD được sửa đổi, sẽ có một mục mới trong reflog.
reflog tương tự lệnh unix history và được lưu cục bộ trên máy của bạn.

git reflog
git checkout [email protected]{...}
# or
git checkout <sha-1>

Sử dụng thanh toán, bạn có thể quay lại bất kỳ cam kết mong muốn nào và bạn có thể tạo chi nhánh hoặc bất kỳ tùy chọn nào khác mà git checkout sẽ cho phép bạn thực hiện.

 enter image description here


git reset HEAD --hard <commit_id>

"Di chuyển" đầu của bạn trở lại cam kết mong muốn.
Git reset sẽ kiểm tra nội dung cam kết mong muốn vào khu vực tổ chức của bạn và/hoặc vào thư mục làm việc của bạn dựa trên giá trị --hard/--soft/--mixed bạn chọn để chọn. --hard sẽ cập nhật cả khu vực sân khấu và thư mục làm việc với nội dung đã cho và sẽ "tách" mọi cam kết khác ngoài điểm này trên chi nhánh địa phương của bạn. 

Nếu những cam kết đó không phải là một phần của bất kỳ chi nhánh nào khác, chúng sẽ trở thành "lủng lẳng".
Nội dung "dangle" có nghĩa là có một nội dung không thể truy cập trong kho lưu trữ cục bộ của bạn không thuộc bất kỳ chi nhánh nào khác và có thể bị xóa hoặc sẽ bị xóa bởi gc.

# This will destroy any local modifications.
# Don't do it if you have uncommitted work you want to keep.
git reset --hard 0d1d7fc32

# Alternatively, if there's work to keep:
git stash
git reset --hard 0d1d7fc32
git stash pop
# This saves the modifications, then reapplies that patch after resetting.
# You could get merge conflicts, if you've modified things which were
# changed since the commit you reset to.

Lược đồ này minh họa lệnh nào làm gì.
Như bạn có thể thấy ở đó reset && checkout sửa đổi HEAD.

 enter image description here

28
CodeWizard

Sử dụng lệnh này:

git checkout -b old-state number_commit
27
Fadid

Sử dụng lệnh này

git checkout -b old-state 0d1d7fc32
27
Jishnu Sukumaran

Xóa một cam kết sai đã được đẩy sang Github

git Push Origin +(previous good commit id):(branch name)

Vui lòng chỉ định id cam kết tốt cuối cùng mà bạn muốn đặt lại trong Github.

Ví dụ. Nếu id xác nhận mới nhất bị sai thì chỉ định id xác nhận trước đó trong lệnh git ở trên với tên nhánh. 

Bạn có thể nhận id xác nhận trước đó bằng cách sử dụng git log

25
V V

Để loại bỏ (tất cả các thay đổi trong) lần xác nhận cuối cùng, 2 lần xác nhận cuối cùng và lần cam kết cuối cùng:

git reset --hard HEAD~1
git reset --hard HEAD~2
...
git reset --hard HEAD~n

Và, để loại bỏ bất cứ điều gì sau một cam kết cụ thể:

git reset --hard <commit sha>

ví dụ., 

git reset --hard 0d12345

Tái bút
1- Hãy cẩn thận, vì tùy chọn "cứng", nó sẽ xóa các thay đổi cục bộ trong repo của bạn là tốt và trở lại cam kết được đề cập trước đó. Bạn nên chạy cái này nếu bạn chắc chắn rằng bạn đã nhầm lẫn trong (các) cam kết cuối cùng của mình và muốn quay ngược thời gian. 

2- Thông thường 7 chữ cái "commit sha" là đủ, nhưng lớn hơn các dự án, bạn có thể cần tới 12 chữ cái để đảm bảo là duy nhất. Bạn cũng có thể đề cập đến toàn bộ 40 chữ cái sha.

3- Các lệnh trên cũng hoạt động trong Github cho Windows.

24
Alisa

Bạn luôn có thể thực hiện git checkout <SHA code> của phiên bản trước và sau đó cam kết lại với mã mới.

24
shreshta bm

Bạn có thể hoàn tác các cam kết Git của mình theo hai cách: Đầu tiên là bạn có thể sử dụng git revert, nếu bạn muốn giữ lịch sử cam kết của mình:

git revert HEAD~3
git revert <hashcode of commit>

Thứ hai là bạn có thể sử dụng git reset, nó sẽ xóa tất cả lịch sử cam kết của bạn và đưa đầu của bạn đến cam kết ở nơi bạn muốn.

git reset <hashcode of commit>
git reset HEAD~3

Bạn cũng có thể sử dụng từ khóa --hard nếu bất kỳ từ khóa nào bắt đầu hoạt động khác. Nhưng, tôi chỉ muốn giới thiệu nó cho đến khi nó cực kỳ cần thiết.

20
Shwetank

Tham khảo: Làm thế nào để hoàn tác cam kết cuối cùng trong Git?

Nếu bạn đã cài đặt Tiện ích mở rộng Git, bạn có thể dễ dàng hoàn tác/hoàn nguyên bất kỳ cam kết nào (bạn có thể tải xuống tiện ích mở rộng git từ tại đây ).

Mở Tiện ích mở rộng Git, nhấp chuột phải vào cam kết bạn muốn hoàn nguyên sau đó chọn "Hoàn nguyên cam kết". 

 Git Extensions screen shot

Một cửa sổ bật lên sẽ được mở (xem ảnh chụp màn hình bên dưới)

 Revert commit popup

Chọn "Tự động tạo cam kết" nếu bạn muốn trực tiếp thực hiện các thay đổi được hoàn nguyên hoặc nếu bạn muốn cam kết thủ công các thay đổi được hoàn nguyên, giữ hộp không được chọn và nhấp vào nút "Hoàn nguyên cam kết này".

18
Ranadheer Reddy

Chỉ cần sử dụng git reset --hard <last good SHA> để đặt lại các thay đổi của bạn và đưa ra cam kết mới. Bạn cũng có thể sử dụng git checkout -- <bad filename>.

16
hubot

Tôi đã tìm thấy cái này trang mô tả cách hoàn tác những thứ mà bạn đã cam kết vào kho lưu trữ.

Một số lệnh:

git commit --amend        # Change last commit
git reset HEAD~1 --soft   # Undo last commit
16
Eugen Konkov

Đây là trang web: Oh shit, git! .

Dưới đây là nhiều công thức làm thế nào để hoàn tác mọi thứ trong Git. Vài người trong số họ:

Oh shit, tôi cần phải thay đổi tin nhắn trên cam kết cuối cùng của tôi!

git commit --amend
# follow prompts to change the commit message

Ôi chết tiệt, tôi đã vô tình cam kết một cái gì đó để làm chủ mà đáng lẽ phải ở trên một chi nhánh hoàn toàn mới!

# Create a new branch from the current state of master
git branch some-new-branch-name
# Remove the commit from the master branch
git reset HEAD~ --hard
git checkout some-new-branch-name
# Your commit lives in this branch now :)
15
Eugen Konkov

Bạn có thể hoàn tác các cam kết của mình từ kho lưu trữ cục bộ. Hãy làm theo kịch bản dưới đây.

Trong hình ảnh bên dưới, tôi kiểm tra nhánh 'test' (sử dụng lệnh Git git checkout -b test) làm trạng thái cục bộ và kiểm tra (sử dụng lệnh Git git status) của nhánh cục bộ mà không có gì để cam kết.

 Enter image description here

Trong hình ảnh hình ảnh tiếp theo bạn có thể thấy ở đây, tôi đã thực hiện một vài thay đổi trong Filter1.txt và thêm tệp đó vào khu vực tổ chức và sau đó cam kết các thay đổi của tôi với một số thông báo (sử dụng lệnh Git git commit -m "Doing commit to test revert back").

"-m là dành cho thông điệp cam kết"

 Enter image description here

Trong hình ảnh tiếp theo, bạn có thể thấy nhật ký cam kết của mình bất cứ điều gì bạn đã thực hiện (sử dụng lệnh Git git log).

 Enter image description here

Vì vậy, trong hình ảnh trên, bạn có thể thấy id xác nhận với mỗi cam kết và với thông điệp cam kết của bạn bây giờ bất cứ cam kết nào bạn muốn hoàn nguyên hoặc hoàn tác sao chép id cam kết đó và nhấn lệnh Git bên dưới, git revert {"paste your commit id"}. Thí dụ:

git revert 9ca304ed12b991f8251496b4ea452857b34353e7

 Enter image description here

Tôi đã trở lại cam kết cuối cùng của tôi. Bây giờ nếu bạn kiểm tra trạng thái Git của mình, bạn có thể thấy tệp đã sửa đổi là Filter1.txt và chưa được cam kết.

 Enter image description here

14
Raj S. Rusia

Cách đơn giản nhất để hoàn tác cam kết cuối cùng là

git reset HEAD^

Điều này sẽ mang lại trạng thái dự án trước khi bạn thực hiện cam kết.

14
Arun Karnawat

Trong IntelliJ IDEA bạn chỉ có thể mở nhật ký kho lưu trữ Git bằng cách nhấn Alt+9, nhấp chuột phải vào một số thẻ từ danh sách cam kết và chọn: "Đặt lại chi nhánh hiện tại về đây ...".

13
Krzysztof Walczewski

CÁI ĐẦU:

Trước khi thiết lập lại cam kết, chúng ta nên biết về CHÍNH ... HEAD không là gì ngoài trạng thái hiện tại của bạn trong thư mục làm việc. Nó được đại diện bởi một số cam kết.

Git cam kết:

Mỗi thay đổi được chỉ định theo một cam kết được thể hiện bằng một thẻ duy nhất. Cam kết không thể bị xóa. Vì vậy, nếu bạn muốn cam kết cuối cùng của mình, bạn chỉ cần đi sâu vào nó bằng cách sử dụng git reset.

Bạn có thể đi sâu vào cam kết cuối cùng bằng hai phương thức:

Cách 1: (nếu bạn không biết số cam kết, nhưng muốn chuyển lên đầu tiên)

git reset HEAD~1  # It will move your head to last commit

Phương pháp 2: (nếu bạn biết cam kết bạn chỉ cần đặt lại vào cam kết đã biết)

git reset 0xab3 # Số cam kết

Lưu ý: nếu bạn muốn biết một cam kết gần đây hãy thử git log -p -1

Đây là biểu diễn đồ họa:

 Enter image description here

13
Mohideen ibn Mohammed

Sự khác biệt giữa git reset --mixed, --soft và --hard

Điều kiện tiên quyết: Khi sửa đổi tệp hiện có trong .__ của bạn. kho lưu trữ được thực hiện, thay đổi này ban đầu được coi là không được tổ chức . Để thực hiện các thay đổi, nó cần được dàn dựng có nghĩa là thêm nó vào chỉ mục bằng cách sử dụng git add. Trong một hoạt động cam kết, các tập tin được dàn dựng sẽ được thêm vào một chỉ mục.

Hãy lấy một ví dụ: 

- A - B - C (master)

HEAD trỏ tới C và chỉ mục khớp với C.

--mềm mại

  • Khi chúng tôi thực thi git reset --soft B với ý định xóa cam kết Ctrỏ chính/ĐẦU vào B
  • Bây giờ, master/HEAD sẽ trỏ đến B, nhưng chỉ số vẫn thay đổi từ C
  • Khi thực thi git status, bạn có thể thấy các tệp được lập chỉ mục trong commit Cstaged
  • Thực hiện git commit tại thời điểm này sẽ tạo ra một cam kết mới với thay đổi tương tự như C

- trộn lẫn

  • Thực thi git reset --mixed B
  • Khi thực hiện, master/HEAD sẽ trỏ đến B và chỉ mục cũng được sửa đổi để khớp với B vì cờ hỗn hợp được sử dụng. 
  • Nếu chúng tôi chạy git commit vào thời điểm này, sẽ không có gì xảy ra vì chỉ số khớp với HEAD.
  • Chúng tôi vẫn có các thay đổi trong thư mục làm việc, nhưng vì chúng không có trong chỉ mục, trạng thái git hiển thị chúng là không được xử lý
  • Để cam kết với họ, bạn sẽ git add và sau đó cam kết như bình thường.

--cứng

  • Thực thi git reset --hard B
  • Khi thực hiện, master/HEAD sẽ trỏ đến B và sửa đổi thư mục làm việc của bạn
  • Thay đổi được thêm vào trong Ctất cả các thay đổi không được cam kết sẽ là bị xóa.
  • Các tệp trong bản sao làm việc sẽ khớp với cam kết B, điều này sẽ dẫn đến mất vĩnh viễn tất cả các thay đổi được thực hiện trong cam kết C cộng với các thay đổi không được cam kết

Hy vọng việc so sánh các cờ có sẵn để sử dụng với lệnh git reset này sẽ giúp ai đó sử dụng chúng một cách khôn ngoan. Tham khảo những điều này để biết thêm chi tiết link1 & link2

12
Keshan Nageswaran

Rebasing and drop commit là tốt nhất khi bạn muốn giữ lịch sử sạch Hữu ích khi đề xuất các bản vá cho một chi nhánh công cộng, v.v.

Nếu bạn phải bỏ các cam kết cao nhất thì một lớp lót sau sẽ giúp

git rebase --onto HEAD~1 HEAD

Nhưng nếu bạn muốn bỏ 1 trong số nhiều cam kết bạn đã nói

a -> b -> c -> d -> chủ

và bạn muốn bỏ cam kết 'c'

git rebase --onto b c

Điều này sẽ biến 'b' thành cơ sở mới của 'd' loại bỏ 'c'

12
Khem

Tìm mã băm xác nhận cuối cùng bằng cách xem nhật ký bằng cách:

git log

Sau đó

git reset <the previous co>
12
Praveen Singh

Để hoàn thiện, tôi sẽ đưa ra một phương pháp rõ ràng rõ ràng đã bị bỏ qua bởi các câu trả lời trước đó.

Vì cam kết không được đẩy, điều khiển từ xa không thay đổi, vì vậy:

  1. Xóa kho lưu trữ cục bộ.
  2. Nhân bản kho lưu trữ từ xa.

Điều này đôi khi cần thiết nếu ứng dụng khách Git ưa thích của bạn tạm biệt. (ví dụ: lỗi non-fast-forward)

Đừng quên tái cam kết đã lưu thay đổi kể từ lần Đẩy cuối cùng.

11
Dominic Cerisano

 enter image description here

Giả sử bạn đang làm việc trong Visual Studio, nếu bạn truy cập vào lịch sử chi nhánh của bạn và xem tất cả các cam kết của bạn, chỉ cần chọn sự kiện trước cam kết bạn muốn hoàn tác, nhấp chuột phải vào nó và chọn Revert. Dễ như thế.

11
Uchiha Itachi

Nếu bạn muốn loại bỏ các tập tin sai, bạn nên làm 

git reset --soft <your_last_good_commit_hash_here> Ở đây, nếu bạn làm git status, bạn sẽ thấy các tệp trong khu vực tổ chức. Bạn có thể chọn các tệp sai và đưa chúng xuống từ khu vực tổ chức.

Giống như sau.

git reset wrongFile1 wrongFile2 wrongFile3

Bây giờ bạn có thể chỉ cần thêm các tệp mà bạn cần đẩy,

git add goodFile1 goodFile2

cam kết với họ 

git commit -v hoặc git commit -am "Message"

và đẩy

git Push Origin master

Tuy nhiên, nếu bạn không quan tâm đến các tệp đã thay đổi, bạn có thể khó thiết lập lại cam kết tốt trước đó và Đẩy mọi thứ lên máy chủ.

bởi 

git reset --hard <your_last_good_commit_hash_here>

git Push Origin master

Nếu bạn đã xuất bản các tệp sai của mình lên máy chủ, bạn có thể sử dụng cờ --force để Đẩy lên máy chủ và chỉnh sửa lịch sử.

git Push --force Origin master

8
nPcomp

Hãy thử điều này, cứng thiết lập lại cam kết trước đó khi các tệp đó không được thêm vào, sau đó:

git reset --hard <commit_hash>

Hãy chắc chắn rằng bạn có một bản sao lưu các thay đổi của mình chỉ trong trường hợp, vì đó là một thiết lập lại cứng, có nghĩa là chúng sẽ bị mất (trừ khi bạn đã xóa trước đó)

7
serdarsenay
git reset --soft HEAD~1

Đặt lại sẽ tua lại nhánh HEAD hiện tại của bạn để sửa đổi được chỉ định. Lưu ý cờ --soft: điều này đảm bảo rằng những thay đổi trong bản sửa đổi hoàn tác được giữ nguyên. Sau khi chạy lệnh, bạn sẽ tìm thấy các thay đổi dưới dạng sửa đổi cục bộ không được cam kết trong bản sao làm việc của bạn.

Nếu bạn không muốn giữ những thay đổi này, chỉ cần sử dụng cờ --hard. Hãy chắc chắn chỉ làm điều này khi bạn chắc chắn rằng bạn không cần những thay đổi này nữa.

 git reset --hard HEAD~1

Hoàn tác nhiều cam kết

git reset --hard 0ad5a7a6

tuy nhiên, hãy nhớ rằng việc sử dụng lệnh đặt lại sẽ hủy bỏ tất cả các cam kết xuất hiện sau lệnh bạn đã quay lại:  enter image description here

6
Abu Bakr

Những gì tôi làm mỗi lần tôi cần hoàn tác một cam kết/cam kết là:

  1. git reset HEAD~<n> // số lần xác nhận cuối cùng tôi cần hoàn tác
  2. git status // tùy chọn. Tất cả các tập tin hiện có màu đỏ (chưa được phân loại).

  3. Bây giờ, tôi có thể thêm và cam kết chỉ các tệp mà tôi cần:

    • git add <file names> & git commit -m "message" -m "details"
  4. Tùy chọn: Tôi có thể khôi phục các thay đổi của các tệp còn lại, nếu tôi cần, với điều kiện trước đó của chúng, với thanh toán:
    • git checkout <filename>
  5. nếu tôi đã đẩy nó đến Origin từ xa, trước đây:
    • git Push Origin <branch name> -f // sử dụng -f để buộc Đẩy.
6
Theo Itzaris

Nếu bạn muốn hoàn tác cam kết đầu tiên trong repo của bạn

Bạn sẽ gặp phải vấn đề này:

$ git reset HEAD~
fatal: ambiguous argument 'HEAD~': unknown revision or path not in the working tree.
Use '--' to separate paths from revisions, like this:
'git <command> [<revision>...] -- [<file>...]'

Lỗi xảy ra bởi vì nếu lần xác nhận cuối cùng là lần xác nhận ban đầu (hoặc không có cha mẹ) của kho lưu trữ thì không có ĐẦU ~.

Dung dịch

Nếu bạn muốn đặt lại cam kết duy nhất trên nhánh "chính"

$ git update-ref -d HEAD
$ git rm --cached -r .
5
Nicholas

Làm như các bước sau. Nó có thể giúp bạn.

Bước: 1

Nhấn git log

Từ danh sách nhật ký, tìm mã băm xác nhận cuối cùng và sau đó nhập:

Bước: 2

git reset <hash code>
4
Paras Korat

Nhận ID cam kết cuối cùng bằng cách sử dụng lệnh này (trong nhật ký một ở trên cùng, đây là lệnh mới nhất):

git log

Lấy id xác nhận (GUID) và chạy lệnh này:

git revert <commit_id>
3
Nalan Madheswaran

Cách chỉnh sửa một cam kết trước đó

Nói chung, tôi không muốn hoàn tác một loạt các cam kết, mà là chỉnh sửa một cam kết trước đó về cách tôi muốn tôi đã cam kết ở nơi đầu tiên.

Tôi thấy mình đã sửa chữa một cam kết trong quá khứ thường xuyên đến mức tôi đã viết một kịch bản cho nó.

Đây là quy trình làm việc:

  1. git commit-edit <commit-hash>
    

    Điều này sẽ thả bạn vào cam kết bạn muốn chỉnh sửa.

    Những thay đổi của cam kết sẽ là un dàn dựng, sẵn sàng để được dàn dựng như bạn muốn đó là lần đầu tiên.

  2. Sửa chữa và thực hiện cam kết như bạn muốn nó đã ở vị trí đầu tiên.

    (Bạn có thể muốn sử dụng git stash save --keep-index để loại bỏ mọi tệp bạn không cam kết)

  3. Làm lại cam kết với --amend, ví dụ:

    git commit --amend
    
  4. Hoàn thành cuộc nổi loạn:

    git rebase --continue
    

Gọi cái này theo sau git-commit-edit và đặt nó vào $PATH của bạn:

#!/bin/bash

# Do an automatic git rebase --interactive, editing the specified commit
# Revert the index and working tree to the point before the commit was staged
# https://stackoverflow.com/a/52324605/5353461

set -euo pipefail

script_name=${0##*/}

warn () { printf '%s: %s\n' "$script_name" "$*" >&2; }
die () { warn "[email protected]"; exit 1; }

[[ $# -ge 2 ]] && die "Expected single commit to edit. Defaults to HEAD~"

# Default to editing the parent of the most recent commit
# The most recent commit can be edited with `git commit --amend`
commit=$(git rev-parse --short "${1:-HEAD~}")

# Be able to show what commit we're editing to the user
if git config --get alias.print-commit-1 &>/dev/null; then
  message=$(git print-commit-1 "$commit")
else
  message=$(git log -1 --format='%h %s' "$commit")
fi

if [[ $OSTYPE =~ ^darwin ]]; then
  sed_inplace=(sed -Ei "")
else
  sed_inplace=(sed -Ei)
fi

export GIT_SEQUENCE_EDITOR="${sed_inplace[*]} "' "s/^pick ('"$commit"' .*)/edit \\1/"'
git rebase --quiet --interactive --autostash --autosquash "$commit"~
git reset --quiet @~ "$(git rev-parse --show-toplevel)"  # Reset the cache of the toplevel directory to the previous commit
git commit --quiet --amend --no-edit --allow-empty  #  Commit an empty commit so that that cache diffs are un-reversed

echo
echo "Editing commit: $message" >&2
echo
2
Tom Hale

Nếu bạn chỉ muốn dọn rác tất cả các thay đổi/cam kết cục bộ của bạn và làm cho chi nhánh địa phương của bạn trông giống như chi nhánh Origin mà bạn đã bắt đầu từ ...

git reset --hard Origin/branch-name

1
JeremyWeir

Tôi đã viết về điều này từ lâu trước khi có những vấn đề tương tự:

https://ao.gl/how-to-delete-revert-a-git-commit/

Về cơ bản bạn chỉ cần làm:

git log, nhận bảy ký tự đầu tiên của SHA, sau đó thực hiện git revert <sha> theo sau là git Push --force.

Bạn cũng có thể hoàn nguyên điều này bằng cách sử dụng lệnh hoàn nguyên Git như sau: git revert <sha> -m -1 và sau đó git Push.

1
Andrew Odendaal
git revert commit

Điều này sẽ tạo ra các thay đổi ngược lại từ cam kết mà bạn muốn hoàn nguyên và sau đó chỉ cam kết các thay đổi đó. Tôi nghĩ rằng đây là cách đơn giản nhất.

https://git-scm.com/docs/git-revert

1
Gjorgi Gjorgiev

Bạn có thể sử dụng git revert <commit-id>.

Và để nhận được ID xác nhận, chỉ cần sử dụng git log.

1
Videsh

thay thế phiên bản cục bộ của bạn bao gồm các thay đổi của bạn bằng phiên bản máy chủ, hai dòng mã này sẽ buộc git kéo và ghi đè cục bộ. Mở lệnh Nhắc và điều hướng đến gốc dự án git. Nếu bạn sử dụng VS, nhấp vào Team, Synch và nhấp vào "Open Command Prompt" (xem hình ảnh) bên dưới. 

 Visual Studio

Khi ở Cmd, hãy tiếp tục với hai hướng dẫn sau. 

git fetch --all

sau đó bạn làm

git reset --hard Origin/master

điều này sẽ ghi đè lên phiên bản cục bộ hiện có với phiên bản trên máy chủ git

0
shiraz
git Push --delete (branch_name) //this will be removing the public version of your branch

git Push Origin (branch_name) //This will add the previous version back
0
Omkaar.K