Làm cách nào để dọn dẹp fork Github để tôi có thể thực hiện các yêu cầu kéo sạch?


83

Tôi đã tạo một kho lưu trữ trên Github. Tôi đã thực hiện một số thay đổi nhỏ và gửi các yêu cầu kéo lên phía trên, nhưng trong suốt quá trình fork của tôi đã trở nên phức tạp, tôi không thể tạo các yêu cầu kéo rõ ràng; khi tôi bắt đầu một yêu cầu kéo từ một nhánh với sáu thay đổi, Github muốn gửi mười ba, với bảy trong số đó đã tồn tại ở thượng nguồn (natch).

Vấn đề của tôi dường như liên quan đến việc chỉ kéo các cam kết mới nhất , nhưng khi tôi tạo một nhánh mới và các cam kết cherry-pick, tôi vẫn có các tính năng bổ sung. Tôi đã futzed với rebasing là tốt, nhưng bây giờ có vẻ như ngay cả bậc thầy của tôi như vậy là sai lầm Tôi không thể tạo ra một bản sao sạch của thượng nguồn . Điều này rõ ràng là do tôi không hiểu rằng tôi cần phải rebase thay vì hợp nhất , nên rõ ràng là tôi đã mắc sai lầm; những gì tôi đang cố gắng làm là tìm ra cách gỡ bỏ nút thắt đó và trở lại trạng thái sạch sẽ mà tôi có thể tiến về phía trước một cách hữu ích.

Tôi muốn loại bỏ ngã ba của mình và tạo ra một ngã ba mới ở thượng nguồn, nhưng tôi thu thập được điều đó cũng rất khó.

Sau khi thú nhận tội lỗi Git của mình, làm cách nào để nhận được sự giải thoát trên github?


1
Yêu lời thú nhận của bạn và yêu cầu được miễn :-)
Jon Kern

Cái gì, có những người mà git không phải là một tôn giáo? ;-)
pjmorse

Câu trả lời:


102

Bước 1: Kéo các thay đổi ngược dòng
Bạn nên thêm repo ngược dòng là "ngược dòng" như được giải thích trên trang Fork a Repo :

git pull --rebase upstream master

Các --rebasetùy chọn đặt thay đổi của bạn trên đầu trang của các cam kết mới nhất mà không sáp nhập.

Bước 2: (Tùy chọn) Hợp nhất các cam kết của bạn thành 1 cam kết

git reset --soft upstream/master

Lệnh này sẽ "hoàn tác" tất cả các cam kết của bạn, nhưng sẽ không thay đổi các tệp. Vì vậy, bạn có thể cam kết tất cả các thay đổi của mình trong một lần cam kết.

git commit -a

Bước 3: Kiểm tra và thử nghiệm các thay đổi của bạn

Để hiển thị các thay đổi, hãy sử dụng GUI như tích hợp sẵn gitk, Sourcetree , TortoiseGit hoặc Tower (trả phí) , v.v.

Bước 4: Đẩy

git pushsẽ tạo ra một lỗi, bởi vì việc đẩy sẽ thay đổi lịch sử của kho lưu trữ mục tiêu.
Nếu bạn tin rằng các thay đổi được hiển thị trong bước 3 là đúng, hãy nhấn bằng "-f"

git push -f origin master


Thông tin bổ sung
Lệnh để thêm điều khiển từ xa là:

git remote add upstream git://github.com/[username]/[project].git

Bạn cũng có thể lấy từ một URL trực tiếp:

git pull --rebase  git://github.com/[username]/[project].git

Nhưng sau đó bạn sẽ cần băm của cam kết ngược dòng mới nhất thay vì "ngược dòng / tổng thể" trong các bước khác.


3
Cảm ơn rât nhiều. GitHub nên cập nhật Fork A Repo của họ .
buschtoens

Cảm ơn! Tôi đã thử nhiều cách để giải quyết vấn đề này, không có kết quả. Tôi đã sẵn sàng để thổi bay cái dĩa của mình trước khi tìm thấy câu trả lời này ... và nó đã hoạt động. Cảm ơn!
Judah Gabriel Himango

Xin chào, @JudahHimango. Bạn đã làm theo "bước 2" quá. Vì tôi cũng đang ở trong hoàn cảnh như bạn. Bạn có thể giúp tôi được không.
arunit21

Đây là nguồn tài nguyên tuyệt vời. Cảm ơn!
Tiến sĩ Jan-Philip Gehrcke,

Repo đã chia của tôi liên tục nói rằng nó không đồng bộ với ngược dòng, vì vậy tôi sẽ kéo xuống và hợp nhất - điều này dẫn đến các cam kết trên fork của tôi là không cần thiết. Sử dụng cách tiếp cận này và ép buộc đã sắp xếp điều này. Tôi cũng đã sử dụng rebase để kết hợp một số cam kết trước đó của mình: git rebase -i HEAD ~ n [trong đó n là số lượng cam kết]
The Coder

4

Theo tôi hiểu, với cả Git và Mercurial (tôi chỉ sử dụng cái thứ hai, vì vậy tôi có thể sai) việc thổi bay một chiếc fork và tái fork nó không phải là một vấn đề lớn. Tôi làm điều đó mọi lúc với các dự án của mình. Nếu bạn đồng ý với việc đó (có thể sao lưu các thay đổi của bạn hoặc không có bất kỳ thay đổi đáng kể nào trong đợt fork của bạn), tôi muốn nói rằng đó có thể là cách để đi.

Hãy nhớ rằng, với DVCS, việc tạo một kho lưu trữ sẽ tạo ra một bản sao đầy đủ của toàn bộ kho đó . Nếu bạn xóa fork hiện tại của mình và sau đó fork repo ban đầu một lần nữa, bạn sẽ có một phương tiện hoàn toàn sạch sẽ để làm việc.


Fork trong trường hợp này là một tính năng đặc biệt của github, không phải git lõi, mặc dù nó sử dụng các tính năng git cốt lõi. Có những khả năng quản trị github đặc biệt mà bạn có thể làm với github-fork.
Seth Robertson

1
Ah tôi thấy. Tôi sử dụng BitBucket là chủ yếu và ở đó "Fork" đồng nghĩa với "clone" khi bạn đang làm việc với các bản sao làm việc cá nhân. Tôi sẽ để lại câu trả lời của tôi ở đây mặc dù chỉ trong trường hợp.
Sean Edwards

Vâng, tôi đã xóa bản sao cục bộ của mình và sao chép lại vài lần rồi. Tôi đã thực hiện một thử nghiệm với một repo khác và có vẻ như không có vấn đề gì khi xóa một fork và tạo một repo mới từ cùng một nguồn.
pjmorse

NB Tôi đang sử dụng git format-patchđể bảo toàn các cam kết mà tôi muốn lưu trước.
pjmorse

1
Việc xóa kho lưu trữ được phân nhánh và cải tiến lại là không cần thiết và việc sử dụng git format-patchđể lưu công việc của bạn là bước phụ của tất cả các công cụ hữu ích mà git có để quản lý các nhánh. Trong tương lai, việc sử dụng git rebase -iđể viết lại một cách có chọn lọc các cam kết của bạn trên đầu masternhánh ngược dòng mới là điều nên làm.
Mark Longair

0

Trên repo riêng tư của bạn, thêm repo của forkee làm điều khiển từ xa. Rebase / đặt lại các nhánh của bạn từ các nhánh của điều khiển từ xa. Thực hiện một lực đẩy tới repo github của bạn.

Nếu bạn cần lệnh chính xác, hãy cho tôi biết. Ngoài ra, hãy cho tôi biết liệu bạn có muốn thử và duy trì các cam kết cục bộ hay không hay "thổi bay".

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.