Cách xóa các cam kết khỏi một yêu cầu kéo


103

Tôi đã thực hiện một yêu cầu kéo nhưng sau đó tôi đã thực hiện một số cam kết đối với dự án tại địa phương đã kết thúc làm ô nhiễm yêu cầu kéo của tôi, tôi đã cố gắng loại bỏ nó nhưng không gặp may.

Tôi đã tìm thấy một số câu hỏi tương tự trên StackOverflow nhưng tôi không thể áp dụng những gì trong đó. Đây là yêu cầu kéo đầu tiên của tôi trên GitHub vì vậy nó khá lạ đối với tôi về cách tất cả điều này hoạt động.

Cam kết được đánh dấu là cam kết tôi cần giữ và xóa tất cả những thứ khác. Nó trở thành cam kết thứ tư trong lịch sử vì tôi thực hiện một số công cụ hợp nhất.

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

nhật ký git của tôi nhập mô tả hình ảnh ở đây

Ai đó có thể vui lòng giải thích những gì đang xảy ra và làm thế nào để khắc phục sự cố này?


2
Bạn cần phải rebase , và chỉ "nhặt" các "thêm từ github" cam kết (tức bình luận ra các dòng cho cam kết mỗi khác)
Robbie Averill

1
căn cứ lại chi nhánh nào vào chi nhánh nào bạn có thể vui lòng thêm giải thích.
kinh ngạc

what branch= chi nhánh bạn đang làm việc, onto what branch= chi nhánh bạn đang yêu cầu
Robbie Averill

Tôi đã giải thích những gì @Robbie Averill gợi ý trong câu trả lời của mình. Thật kỳ lạ là không ai viết câu trả lời giải thích điều này cho đến bây giờ.
ferit,

Câu trả lời:


107

Bạn có một số kỹ thuật để làm điều đó.

Bài đăng này - đọc phần về hoàn nguyên sẽ giải thích chi tiết những gì chúng ta muốn làm và cách thực hiện.

Đây là giải pháp đơn giản nhất cho vấn đề của bạn:

# Checkout the desired branch
git checkout <branch>

# Undo the desired commit
git revert <commit>

# Update the remote with the undo of the code
git push origin <branch>

Lệnh hoàn nguyên sẽ tạo một cam kết mới với việc hoàn tác cam kết ban đầu.


2
Nó có hoạt động ngay cả khi chúng tôi đã tách dự án khỏi một số người khác và muốn xóa một số nhận xét trong yêu cầu kéo?
Dr.jacky

104

Mọi người sẽ không muốn thấy một cam kết sai và một cam kết hoàn nguyên để hoàn tác các thay đổi của cam kết sai. Điều này gây ô nhiễm lịch sử cam kết.

Đây là một cách đơn giản để loại bỏ cam kết sai thay vì hoàn tác các thay đổi bằng cam kết hoàn nguyên.

  1. git checkout my-pull-request-branch

  2. git rebase -i HEAD~n// đâu nlà số lần cam kết cuối cùng mà bạn muốn đưa vào rebase tương tác.

  3. Thay thế pickbằng dropcho các cam kết mà bạn muốn loại bỏ.
  4. Lưu và thoát.
  5. git push --force

8
điều này làm việc cho tôi như một sự quyến rũ. Tôi đã có rất nhiều cam kết mà lẽ ra không nên có trong PR. Tôi chỉ tương tác rebased nó, bỏ những cam kết và đẩy chúng trở lại
FullStackEngineer

1
Bạn nên đồng bộ với điều khiển từ xa trước khi bắt đầu pr, không?
ferit

5
Để đẩy tôi phải làm: git push origin HEAD:myBranch --force. Nhưng nếu không thì tuyệt vời và hữu ích.
ScottyBlades

@ScottyBlades Tôi đã cố ý bỏ qua phần đó vì nó nằm ngoài phạm vi. Nếu bạn không đặt nhánh theo dõi, bạn cần phải đặt nó hoặc, giống như bạn đã làm, đẩy một cách rõ ràng.
ferit 28/09/18

4
Điều này cũng rất hữu ích khi bạn muốn sửa chữa một PR mở trong GitHub, bạn chỉ cần để có thể làm một push buộc
Vladimir Hidalgo

6

Nếu bạn đang xóa một cam kết và không muốn giữ lại các thay đổi của nó thì @ferit có một giải pháp tốt.

Nếu bạn muốn thêm cam kết đó vào nhánh hiện tại, nhưng không hợp lý khi trở thành một phần của pr hiện tại, bạn có thể làm như sau:

  1. sử dụng git rebase -i HEAD~n
  2. Chuyển cam kết bạn muốn xóa xuống vị trí cuối cùng (gần đây nhất)
  3. Lưu và thoát
  4. sử dụng git reset HEAD^ --softđể bỏ cam kết các thay đổi và đưa chúng trở lại trạng thái theo giai đoạn.
  5. sử dụng git push --forceđể cập nhật chi nhánh từ xa mà không có cam kết bị xóa của bạn.

Bây giờ bạn sẽ xóa cam kết khỏi điều khiển từ xa của mình, nhưng vẫn sẽ có các thay đổi cục bộ.


2

Vì vậy, hãy làm như sau,

Giả sử tên chi nhánh của bạn là my_branch và điều này có thêm cam kết.

  1. git checkout -b my_branch_with_extra_commits (Giữ nhánh này được lưu dưới một tên khác)
  2. gitk (Mở bảng điều khiển git)
  3. Tìm cam kết bạn muốn giữ. Sao chép SHA của cam kết đó vào sổ ghi chú.
  4. git checkout my_branch
  5. gitk (Thao tác này sẽ mở bảng điều khiển git)
  6. Nhấp chuột phải vào cam kết bạn muốn hoàn nguyên (Trạng thái trước khi bạn thay đổi) và nhấp vào " reset branch to here"
  7. Làm một git pull --rebase origin branch_name_to _merge_to
  8. git cherry-pick <SHA you copied in step 3. >

Bây giờ hãy xem lịch sử cam kết chi nhánh cục bộ và đảm bảo mọi thứ đều ổn.


0

Đây là những gì đã giúp tôi:

  1. Tạo một nhánh mới với nhánh hiện có. Hãy gọi cái hiện tại branch_oldvà cái mới là branch_new.

  2. Đặt lại branch_newvề trạng thái ổn định, khi bạn không gặp bất kỳ sự cố nào khi cam kết. Ví dụ: để đặt nó ở cấp độ thạc sĩ địa phương của bạn, hãy làm như sau:

    git reset — hard master git push —force origin

  3. cherry-pickcam kết từ branch_oldthànhbranch_new

  4. git push
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.