Yêu cầu kéo GitHub hiển thị các xác nhận đã có trong nhánh mục tiêu


136

Tôi đang cố gắng xem xét yêu cầu kéo trên GitHub đến một chi nhánh không phải là chủ. Nhánh mục tiêu đứng sau chủ và yêu cầu kéo hiển thị các xác nhận từ chủ, vì vậy tôi đã hợp nhất chủ và đẩy nó sang GitHub, nhưng các xác nhận và khác biệt cho chúng vẫn xuất hiện trong yêu cầu kéo sau khi làm mới. Tôi đã kiểm tra lại gấp đôi rằng chi nhánh trên GitHub có các cam kết từ chủ. Tại sao chúng vẫn xuất hiện trong yêu cầu kéo?

Tôi cũng đã kiểm tra yêu cầu kéo cục bộ và nó chỉ hiển thị các cam kết chưa hợp nhất.


Điều này có ảnh hưởng đến hành vi sáp nhập PR không?
Nathan Hinchey

Không, chỉ là khác biệt trên Github.
lobati

Có ai biết nếu Gitlab tự lưu trữ bị hành vi tương tự?
Jeff Welling

2
Tôi đề nghị tất cả chúng ta nên liên hệ với GitHub để bày tỏ sự quan tâm của chúng tôi về việc thay đổi hành vi này ( support.github.com/contact ). Nếu họ không nghe từ chúng tôi thì họ sẽ không biết điều này quan trọng như thế nào và nó sẽ theo cách này mãi mãi.
steinybot

Câu trả lời:


106

Có vẻ như Yêu cầu Kéo không theo dõi các thay đổi đối với nhánh mục tiêu (Tôi đã liên hệ với bộ phận hỗ trợ của GitHub và nhận được phản hồi vào ngày 18 tháng 11 năm 2014 cho biết đây là do thiết kế).

Tuy nhiên, bạn có thể làm cho nó hiển thị cho bạn các thay đổi được cập nhật bằng cách thực hiện như sau:

http://githuburl/org/repo/compare/targetbranch...currentbranch

Thay thế githuburl, org, repo, targetbranch, và currentbranchkhi cần thiết.

Hoặc như hexsprite đã chỉ ra trong câu trả lời của anh ấy, bạn cũng có thể buộc nó cập nhật bằng cách nhấp Editvào PR và tạm thời thay đổi cơ sở sang một nhánh khác và quay lại. Điều này tạo ra cảnh báo:

Bạn có chắc chắn muốn thay đổi cơ sở?

Một số cam kết từ nhánh cơ sở cũ có thể bị xóa khỏi dòng thời gian và các nhận xét đánh giá cũ có thể trở nên lỗi thời.

Và sẽ để lại hai mục nhật ký trong PR:

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


4
Vâng, tôi đã liên hệ với bộ phận hỗ trợ một lúc trước và nhận được phản hồi tương tự. Họ không tối ưu hóa cho tình huống này. Đó là một chút bực bội. Cách của chúng tôi để khắc phục điều đó là chỉ cần rebase và buộc đẩy lên, hoặc đóng kéo và tạo một cái mới.
lobati

4
Câu trả lời này không khắc phục được vấn đề, mà chỉ cho phép người dùng thấy sự khác biệt thực sự.
FearlessFuture

4
Câu hỏi là "Tại sao chúng vẫn xuất hiện trong yêu cầu kéo?". Nó trả lời câu hỏi đó.
Adam Millerchip

3
Kiểm tra nhận xét của tôi cho một cách giải quyết tốt. Bạn có thể chỉ cần sử dụng nút chỉnh sửa PR để chuyển sang một nhánh khác và sau đó quay lại nhánh cơ sở ban đầu và nó sẽ tính toán lại diff.
hexsprite

11
Có một yêu cầu github thân yêu để thay đổi điều này?
vossad01

86

Đây là một cách giải quyết tốt. Sử dụng Editnút khi xem PR trong GitHub để thay đổi nhánh cơ sở thành thứ khác master. Sau đó chuyển nó trở lại mastervà bây giờ nó sẽ chỉ hiển thị chính xác các thay đổi từ các cam kết gần đây nhất.


4
Tôi ngạc nhiên khi nhiều người không thừa nhận giải pháp này. Tôi nghi ngờ yêu cầu kéo hết hạn ban đầu sẽ ổn, nhưng tôi không thích GitHub hiển thị tất cả các tệp hết hạn, vì vậy tôi đã sử dụng nó và cả hai đều giữ bình luận và chỉ hiển thị các thay đổi thực tế sắp được hợp nhất . Cảm ơn!
taranaki

2
Không làm việc cho tôi.
Shashank

Chết tiệt cái này hoạt động!
Anurag Hazra

Ba năm sau và đây vẫn là một giải pháp tuyệt vời. Và nhìn ai đó vừa mới nhận xét vài giờ trước đây
^^ ^

32

Tóm lại, GitHub không tự động khởi động lại lịch sử cam kết trong các yêu cầu kéo. Các giải pháp đơn giản nhất là:

Giải pháp 1: Nổi loạn

Giả sử bạn muốn hợp nhất mastertừ feature-01:

git fetch origin
git checkout feature-01
git rebase origin/master
git push --force

Nếu bạn đang làm việc trên một ngã ba thì bạn có thể cần phải thay thế originở trên với upstream. Xem Làm cách nào để cập nhật kho lưu trữ rẽ nhánh GitHub? để tìm hiểu thêm về việc theo dõi các nhánh từ xa của kho lưu trữ ban đầu.

Giải pháp 2: Tạo một yêu cầu kéo mới

Giả sử bạn muốn hợp nhất phần giới thiệu mastertừ feature-01:

git checkout feature-01
git checkout -b feature-01-rebased
git push -u origin feature-01-rebased

Bây giờ hãy mở một yêu cầu kéo feature-01-rebasedvà đóng cái cho feature-01.


4
Một rebase thay đổi các băm cam kết, vì vậy nó sẽ kết thúc việc xóa các nhận xét đánh giá hiện có?
haridsv

@haridsv Có lẽ là có.
Mateusz Piotrowski

Bất cứ điều gì để coi chừng khi thực hiện lực đẩy?
Paul Bendevis

1
@haridsv đó không phải là kinh nghiệm của tôi. Tôi thường xuyên phản bác lại đánh giá giữa chừng và những bình luận không bị mất. Mặc dù tôi làm mất lịch sử của những thay đổi trong PR
joel

@JoelBer siêu Tôi thực sự đã trải nghiệm một vài đánh giá trong khi đó tác giả đã phản bác và nhận thấy rằng các bình luận là trong chiến thuật. Tuy nhiên, chúng tôi mất khả năng xem xét tăng dần và đối với các đánh giá lớn thì đó là một hình phạt rất lớn đối với người đánh giá. Bây giờ chúng tôi có một vài hướng dẫn cho PR của chúng tôi và một trong số đó là không bao giờ được phản hồi sau khi đánh giá được mở (trừ khi chắc chắn rằng không ai bắt đầu xem xét). Hợp nhất là tốt nhưng hướng dẫn của chúng tôi là không trộn lẫn thay đổi hợp nhất với bất kỳ thay đổi nào khác ngoài các giải pháp xung đột.
haridsv

17

Bạn cần thêm các mục sau vào ~/.gitconfigtệp của mình :

[rebase]
    autosquash = true

Điều này sẽ tự động đạt được giống như những gì câu trả lời này cho thấy.

Tôi đã nhận được điều này từ đây .


2
chết tiệt, tôi vô tình bấm vào bỏ phiếu. Câu trả lời này đã giúp tôi. hãy để tôi thay đổi nó
Hector

@hosein Đi cho nó. Bạn sẽ có thể làm điều đó ngay bây giờ.
Mateusz Piotrowski

1
Tôi nghĩ rằng đây nên là câu trả lời được chấp nhận, hoặc bao gồm trong câu trả lời được chấp nhận. Điều này đạt được kết quả mà tôi đang tìm kiếm!
Ronald Rey

1
@RonaldRey git rebasing không phải là một giải pháp phổ quát, bởi vì nó liên quan đến việc chỉnh sửa lịch sử. Nếu mọi người đang làm việc trên các nhánh riêng không bao giờ được nhân bản bởi người khác, thì tốt thôi, nhưng ngay khi ai đó nhân bản kho lưu trữ của bạn và sau đó bạn chỉnh sửa lịch sử, bạn sẽ kết thúc với các lịch sử khác nhau.
Adam Millerchip

14

Đối với bất kỳ ai khác gặp phải vấn đề này và bị nhầm lẫn bởi hành vi Yêu cầu Kéo của GitHub, nguyên nhân sâu xa là PR là một khác biệt của đầu nhánh nguồn so với tổ tiên chung của nhánh nguồn và nhánh đích. Do đó, nó sẽ hiển thị tất cả các thay đổi trên nhánh nguồn cho đến tổ tiên chung và sẽ không tính đến bất kỳ thay đổi nào có thể xảy ra trên nhánh đích.

Thêm thông tin có sẵn tại đây: https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

Khác biệt dựa trên tổ tiên có vẻ nguy hiểm. Tôi ước GitHub có một tùy chọn để thực hiện PR dựa trên hợp nhất 3 chiều chuẩn hơn.


1
Lý do bạn đề cập có vẻ đúng, nhưng tôi bối rối vì nói chung bất cứ khi nào chủ được cập nhật, tôi lại hợp nhất các thay đổi cho chi nhánh của mình ... git checkout my-Branch -> git merge master . Yêu cầu kéo được làm mới ngay lập tức. Có phải tổ tiên chung cũng được cập nhật?
G.One

2
Hành vi này dường như xảy ra khi thực hiện rebase thay vì hợp nhất
G.One

1
@ G.One, trả lời thực sự muộn, nhưng có - nếu bạn hợp nhất từ ​​nhánh chính đó với nhánh nguồn của mình, theo định nghĩa, bạn đã cập nhật tổ tiên chung. Đó là cam kết về chủ bạn đã hợp nhất từ.
David K. Hess

13

Một cách để khắc phục điều này là git rebase targetbranchtrong PR đó. Sau đó git push --force targetbranch, sau đó Github sẽ hiển thị các xác nhận đúng và khác. Hãy cẩn thận với điều này nếu bạn không biết những gì bạn đang làm. Có thể kiểm tra một nhánh thử nghiệm trước để thực hiện rebase sau đó git diff targetbranchđể đảm bảo nó vẫn là những gì bạn muốn.


10

Điều này xảy ra với GitHub khi bạn squash cam kết hợp nhất từ ​​nhánh đích.

Tôi đã sử dụng squash và hợp nhất với Github làm chiến lược hợp nhất mặc định, bao gồm cả hợp nhất từ ​​nhánh đích. Điều này giới thiệu một cam kết mới và GitHub không nhận ra rằng cam kết bị bẹp này giống như các cam kết đã có trong chủ (nhưng với các giá trị băm khác nhau). Git xử lý nó đúng cách nhưng bạn sẽ thấy tất cả các thay đổi một lần nữa trong GitHub, gây khó chịu khi xem xét. Giải pháp là thực hiện hợp nhất thường xuyên các cam kết ngược dòng này thay vì nén và hợp nhất. Khi bạn muốn hợp nhất một nhánh khác vào nhánh của bạn như một sự phụ thuộc git merge --squashvà hoàn nguyên cam kết đó trước khi rút khỏi chủ một khi nhánh khác thực sự biến nó thành chủ.

EDIT: một giải pháp khác là rebase và lực đẩy. Lịch sử sạch nhưng viết lại


1
Cảm ơn @achille, đây thực sự là vấn đề về phía tôi. Sau khi vô hiệu hóa hợp nhất squash nó được giải quyết.
Ashvin777

0

Tôi không chắc chắn chính xác về lý thuyết đằng sau này. Nhưng tôi đã nhận được điều này nhiều lần và có thể khắc phục điều này bằng cách làm như sau.

git pull --rebase

Điều này sẽ tìm nạp và hợp nhất các thay đổi từ nhánh chính repo gốc của bạn (Nếu bạn có điểm đó)

Sau đó, bạn đẩy mạnh các thay đổi của mình vào kho lưu trữ nhân bản github (mục tiêu)

git push -f origin master

Điều này sẽ đảm bảo bản sao github của bạn và repo cha mẹ của bạn ở cùng mức cam kết github và bạn không thấy bất kỳ thay đổi không cần thiết nào giữa các chi nhánh.


0

Hãy thử các lệnh dưới đây, từng cái một.

git pull "latest

git reset --hard master

-1

Thất bại trong cách tiếp cận an toàn nếu bạn quá lo lắng về việc làm rối tung mọi thứ: truy cập tệp và xóa thủ công các thay đổi, sau đó xóa bằng cam kết cuối cùng của bạn bằng cách sử dụng

git add .  && git commit -a --allow-empty-message -m '' && git reset --soft HEAD~2 &&
git commit --edit -m"$(git log --format=%B --reverse HEAD..HEAD@{1})"

Tôi không có xung đột, bạn tốt để đi!

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.