Đóng góp vào dự án trên github, cách "đặt lại yêu cầu kéo của tôi lên đầu trang chủ"


98

Được rồi, tôi đang đóng góp cho một dự án trên github. Dự án trên github là upstream, repo đã chia nhánh của tôi trên github là origin, và localrepo trên máy tính của tôi.

git checkout -b feature
# Working on feature
git commit -a -m 'only commit on feature'

sau đó tôi gửi một yêu cầu kéo

git push origin master

Yêu cầu kéo được xem xét và một thay đổi không liên quan cần được thực hiện. Người khác thực hiện cam kết và hợp nhất vàoupstream/master

Bây giờ tôi được người upstreambảo trì yêu cầu "đặt lại yêu cầu kéo của tôi trên đầu trang chủ"

Đây là câu chuyện của tôi (chèn hiệu ứng âm thanh của Luật và Trật tự) .....

Tôi đã không thực hiện bất kỳ thay đổi nào đối với yêu cầu kéo và nó vẫn giữ nguyên tính năng cam kết trên nhánh.

git checkout master
git fetch upstream
git checkout feature
git rebase master
=> "Current branch feature is up to date."
git push origin feature
=> "Everything up-to-date"

Tôi không hiểu. Làm thế nào điều này có thể xảy ra khi tôi biết rằng ai đó đã cam kết và hợp nhất với upstream/mastersau khi tôi đẩy yêu cầu kéo của mình lên origin/feature?

Bất cứ ai có thể cho tôi biết những gì các thủ tục chính xác nên được trong tình huống này?

Câu trả lời:


109

Bạn chỉ hiển thị một lần tìm nạp trên repo ngược dòng. Điều đó không thực sự cập nhật bất kỳ chi nhánh địa phương nào của bạn. Nó chỉ cập nhật kiến ​​thức của bạn vềupstream . Bạn cần phải đảm bảo upstream/masterđược hợp nhất hoàn toàn vào của bạn master, như với a git pull, trước khi khôi phục lại master, hoặc đơn giản hơn chỉ cần căn cứ lại vào upstream/master.

I E:

git checkout master
git pull upstream master
git checkout feature
git rebase master

hoặc là

git checkout feature
git rebase upstream/master

Cập nhật:

Sau khi sửa featurenhánh cục bộ , bạn sẽ cần phải đẩy nó trở lại originđể hoàn tất cập nhật yêu cầu kéo. Vì bạn đã đẩy featuremột lần rồi, bạn không thể đơn giản là pushlại bởi vì một rebase thay đổi lịch sử và nó không phải là quá trình tua nhanh. Thông thường, nếu một lần đẩy không thành công với "không tua nhanh", bạn sẽ giải quyết nó bằng cách thực hiện một lần kéo, nhưng một lần kéo sẽ chỉ kết hợp hai lịch sử khác nhau, điều này chắc chắn không phải là điều bạn muốn. Điều đó có nghĩa là featurenhánh cũ (trước rebase) của bạn sẽ được kết hợp với nhánh mới (post rebase). Bạn muốn ghi đè origin/feature bằng trạng thái nguy hiểm mớifeature nhánh , kết xuất bất kỳ bản ghi nào của nhánh cũ. Điều đó có nghĩa là bạn sẽ muốn thúc đẩy xảy ra, mặc dù nó không phải là chuyển tiếp nhanh, bằng cách sử dụng git push -f origin feature. Ghi chú:và bạn có thể mất cam kết với nó. Chỉ sử dụng nó nếu bạn hoàn toàn chắc chắn rằng bạn biết mình đang làm gì, chẳng hạn như ngay tại đây, nơi bạn cố ý muốn loại bỏ các cam kết cũ, vô ích trong nhánh pre-rebase feature.


1
Ok, tôi hiểu rồi, cảm ơn bạn đã làm rõ. Tôi thấy rằng tôi nên kéo thay vì tìm nạp. Bây giờ tôi gặp một vấn đề khác, khi tôi git push origin featuregặp lỗi không tua đi nhanh, không đẩy được, v.v. Liệu git pull --rebase có giải quyết được lỗi này và đẩy đến nhánh tính năng của tôi không hay điều này sẽ gây ra sự cố cho người bảo trì và những người khác?
fontno

1
Đã cập nhật câu trả lời của tôi để giải quyết vấn đề.
Ryan Stewart

Trong trường hợp của tôi, tôi đã thêm repo ngược dòng làm điều khiển từ xa, nhưng quên tìm nạp từ đó. git fetch upstreamđã tải xuống các thay đổi mới nhất, sau đó cuối cùng git rebase upstream/developđã hoạt động.
Alberto Chi Lăng

9

Bây giờ tôi được người bảo trì thượng nguồn yêu cầu "đặt lại yêu cầu kéo của tôi lên đầu trang chủ"

Lưu ý rằng kể từ tháng 9 năm 2016, người bảo trì có thể tự kích hoạt rebase.

Xem " Rebase và hợp nhất các yêu cầu kéo "

Khi bạn chọn tùy chọn "Rebase and merge" mới, các cam kết từ nhánh của yêu cầu kéo sẽ được khôi phục lại phần đầu của nhánh cơ sở, và sau đó chính nhánh cơ sở được chuyển tiếp nhanh đến phần đầu mới được khôi phục này. Rebases tự động đặt người cam kết các cam kết được phục hồi cho người dùng hiện tại, trong khi vẫn giữ nguyên thông tin về quyền tác giả. Nhánh của yêu cầu kéo sẽ không được sửa đổi bởi thao tác này.

Nếu không thể thực hiện rebase do xung đột, chúng tôi sẽ cho bạn biết để bạn có thể giải quyết chúng theo cách thủ công nếu cần.

https://cloud.githubusercontent.com/assets/2195/18671961/a03fa9b6-7f35-11e6-8fa0-e16b2fede8ca.gif

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.