Dọn sạch một ngã ba và khởi động lại từ thượng nguồn


396

Tôi đã rẽ nhánh một kho lưu trữ, sau đó tôi đã thực hiện một số thay đổi và có vẻ như tôi đã làm hỏng mọi thứ.

Tôi muốn bắt đầu lại từ đầu, sử dụng ngược dòng / chủ hiện tại làm cơ sở cho công việc của tôi.
Tôi có nên rebase kho lưu trữ của tôi hoặc xóa nó không?


4
Câu trả lời rất phức tạp cho một câu hỏi đơn giản. Chỉ cần xóa mọi thứ và sao chép lại kho lưu trữ.
Yaza

1
@Yaza, không, điều này có thể khiến bạn gặp nhiều rắc rối hơn trong một số tình huống.
Shimmy Weitzhandler

@shimmy, không nếu bạn muốn bắt đầu lại từ đầu như OP đã hỏi.
Yaza

Câu trả lời:


796

Giải pháp đơn giản nhất sẽ là (sử dụng ' upstream' làm tên từ xa tham chiếu repo gốc):

git remote add upstream /url/to/original/repo
git fetch upstream
git checkout master
git reset --hard upstream/master  
git push origin master --force 

(Tương tự trang GitHub này, phần "Tôi nên làm gì nếu tôi ở trong tình huống xấu?" )

Xin lưu ý rằng bạn có thể mất các thay đổi được thực hiện trên masternhánh (cả cục bộ, vì reset --hardvà ở phía xa, vì push --force).

Một cách khác là, nếu bạn muốn duy trì các cam kết của mình master, để phát lại các cam kết đó trên đầu trang hiện tại upstream/master.
Thay thế phần thiết lập lại bằng a git rebase upstream/master. Sau đó bạn sẽ vẫn cần phải đẩy.
Xem thêm " Tôi nên làm gì nếu tôi ở trong tình huống xấu? "


Một giải pháp hoàn chỉnh hơn, sao lưu công việc hiện tại của bạn (chỉ trong trường hợp) được trình bày chi tiết trong " Dọn dẹp chi nhánh chính và chuyển một số cam kết sang chi nhánh mới ".

Xem thêm " Kéo các bản cập nhật mới từ kho lưu trữ GitHub ban đầu vào kho lưu trữ GitHub rẽ nhánh " để minh họa " upstream" là gì.

Thượng nguồn


Lưu ý: repos GitHub gần đây làm bảo vệmaster chống lại chi nhánhpush --force .
Vì vậy, bạn sẽ phải bỏ bảo vệ mastertrước (xem hình bên dưới), và sau đó bảo vệ lại sau khi đẩy mạnh ).

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


Lưu ý: trên GitHub cụ thể, hiện tại (tháng 2 năm 2019) một lối tắt để xóa các repos rẽ nhánh cho các yêu cầu kéo đã được hợp nhất ngược dòng.


4
chào, nó đã làm việc rất tốt btw cú pháp đặt lại chính xác làgit reset --hard upstream/master
tampe125

1
@ tampe125 Tuyệt vời. Tôi đã sửa lỗi cú pháp git resettrong câu trả lời.
VonC

gây tử vong: 'thượng nguồn' dường như không phải là kho lưu trữ git
Benubird

@Benubird đó là tên của điều khiển từ xa tham chiếu repo gốc (cái bạn đã rẽ nhánh): xem biểu đồ và các git remotelệnh "" trong stackoverflow.com/a/3903835/6309 .
VonC

Đúng, nhưng không rõ câu hỏi của bạn làm thế nào để thiết lập điều đó, vì theo mặc định, 'ngược dòng' không được xác định trong dòng lệnh khi tôi rẽ nhánh qua github.
Benubird

31

Yêu câu trả lời của VonC. Đây là một phiên bản dễ dàng của nó cho người mới bắt đầu.

Có một điều khiển từ xa được gọi là origintôi chắc chắn bạn đều biết. Về cơ bản, bạn có thể thêm bao nhiêu điều khiển từ xa vào một repo git như bạn muốn. Vì vậy, những gì chúng ta có thể làm là giới thiệu một điều khiển từ xa mới là repo ban đầu không phải là ngã ba. Tôi thích gọi nóoriginal

Hãy thêm repo gốc vào ngã ba của chúng tôi như một điều khiển từ xa.

git remote add original https://git-repo/original/original.git

Bây giờ, hãy tìm nạp repo gốc để đảm bảo chúng tôi có mã mới nhất

git fetch original

Như, VonC đã đề xuất, hãy chắc chắn rằng chúng tôi đang ở trên bản gốc.

git checkout master

Bây giờ để đưa ngã ba của chúng tôi tăng tốc với mã mới nhất trên repo gốc, tất cả những gì chúng ta phải làm là khó thiết lập lại nhánh chính của mình theo điều khiển từ xa gốc.

git reset --hard original/master

Và bạn đã hoàn thành :)


2
Tôi đang bước fatal: ambiguous argument 'original/master': unknown revision or path not in the working tree.vào bước cuối cùng. Có lời khuyên nào không?
TomNorway

Dường như điều này chỉ khiến bạn tồn kho trên nhánh từ xa ban đầu. Tôi cho rằng điều này thiếu một bước để thiết lập lại ngã ba của bạn trở lại từ xa chính xác?
Ray Suelzer

1
originallà tốt hơn upstream(mà tài liệu Github sử dụng), như origin/masterlà "thượng nguồn" của địa phương master. Giảm sự mơ hồ. Tôi tự hỏi nếu đây là lý do tại sao bạn sử dụng nó?
vaughan

1
Đó chính xác là lý do tại sao tôi sử dụng nó!
Ahmad Awais

2
Tôi đã làm theo các hướng dẫn này và bây giờ trạng thái git cho biết: Trên nhánh chính Chi nhánh của bạn và 'origin / master' đã chuyển hướng và có 52 và 5 lần xác nhận khác nhau. (sử dụng "git pull" để hợp nhất nhánh từ xa vào nhánh của bạn) - nhưng tôi muốn loại bỏ 5 cam kết của mình. Bước tiếp theo là gì?
dùng3562927

6

Sau câu trả lời tuyệt vời của @VonC. Chính sách công ty GitHub của bạn có thể không cho phép 'ép buộc' đối với chủ.

remote: error: GH003: Sorry, force-pushing to master is not allowed.

Nếu bạn nhận được một thông báo lỗi như thế này, vui lòng thử các bước sau.

Để thiết lập lại ngã ba của bạn một cách hiệu quả, bạn cần làm theo các bước sau:

git checkout master
git reset --hard upstream/master
git checkout -b tmp_master
git push origin

Mở ngã ba của bạn trên GitHub, trong "Cài đặt -> Chi nhánh -> Chi nhánh mặc định" chọn 'new_master' làm chi nhánh mặc định mới. Bây giờ bạn có thể buộc đẩy vào nhánh 'chính':

git checkout master
git push --force origin

Sau đó, bạn phải đặt lại 'chính' làm nhánh mặc định trong cài đặt GitHub. Để xóa 'tmp_master':

git push origin --delete tmp_master
git branch -D tmp_master

Các câu trả lời khác cảnh báo về việc mất thay đổi của bạn vẫn được áp dụng, hãy cẩn thận.


4

Cách thực hiện 100% thông qua GUI Sourcetree

(Không phải ai cũng thích làm việc thông qua giao diện dòng lệnh git)

Khi điều này đã được thiết lập, bạn chỉ cần thực hiện các bước 7-13 từ đó trở đi.

Tìm nạp> kiểm tra chi nhánh chính> đặt lại về chủ của họ> Đẩy các thay đổi đến máy chủ

Các bước

  1. Trong thanh công cụ menu ở đầu màn hình: "Kho lưu trữ"> "Cài đặt kho lưu trữ"

"Kho lưu trữ" được tô sáng trong thanh menu trên cùng

  1. "Thêm vào"

Nút "Thêm" ở dưới cùng của hộp thoại

  1. Quay trở lại GitHub và sao chép URL bản sao.

Nút "Sao chép hoặc Tải xuống" trên trang web Github theo sau là url git

  1. Dán url vào trường "URL / Đường dẫn" sau đó đặt tên cho nó hợp lý. Tôi gọi nó là "chủ nhân". Không chọn hộp kiểm "Từ xa mặc định" . Bạn sẽ không thể đẩy trực tiếp vào kho lưu trữ này.

Các trường "Tên từ xa" và "URL / Đường dẫn" được tô sáng trong hộp thoại "Chi tiết từ xa"

  1. Nhấn "OK" và bạn sẽ thấy nó xuất hiện trong danh sách các kho lưu trữ của bạn ngay bây giờ.

Kho lưu trữ "chính" được thêm vào danh sách các kho lưu trữ trong hộp thoại "Cài đặt kho lưu trữ"

  1. Nhấn "OK" lần nữa và bạn sẽ thấy nó xuất hiện trong danh sách "Điều khiển từ xa".

Kho lưu trữ "chính" được tô sáng trong danh sách điều khiển từ xa trong thanh bên

  1. Nhấp vào nút "Tìm nạp" (trên cùng bên trái của khu vực tiêu đề cây nguồn)

Nút "Tìm nạp" trong vùng tiêu đề

  1. Đảm bảo hộp kiểm "Tìm nạp từ tất cả các điều khiển từ xa" được chọn và nhấn "ok"

Hộp kiểm "Tìm nạp từ tất cả các điều khiển từ xa" được tô sáng trong hộp thoại "Tìm nạp"

  1. Nhấp đúp chuột vào nhánh "chính" của bạn để kiểm tra xem nó chưa được kiểm tra chưa.

  2. Tìm cam kết mà bạn muốn đặt lại, nếu bạn gọi repo là "master", rất có thể bạn sẽ muốn tìm cam kết với thẻ "master / master" trên đó.

Ví dụ về một cam kết với thẻ "master / master" trên đó

  1. Nhấp chuột phải vào cam kết> "Đặt lại chi nhánh hiện tại cho cam kết này".

  2. Trong hộp thoại, đặt trường "Chế độ sử dụng:" thành "Cứng - loại bỏ tất cả các thay đổi bản sao đang hoạt động" rồi nhấn "OK" (đảm bảo đặt bất kỳ thay đổi nào bạn không muốn mất vào một nhánh riêng trước).

Trường "Sử dụng chế độ" được tô sáng trong hộp thoại "Đặt lại để cam kết".  Nó được đặt thành "loại bỏ tất cả các thay đổi bản sao làm việc"

  1. Nhấp vào nút "Đẩy" (trên cùng bên trái của khu vực tiêu đề cây Nguồn) để tải các thay đổi lên bản sao của repo.

Nút "Đẩy" trong vùng tiêu đề

Bạn đã hoàn tất!

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.