이미 대상 브랜치에있는 커밋을 표시하는 GitHub 풀 요청


136

GitHub에서 마스터가 아닌 지점에 대한 풀 요청을 검토하려고합니다. 대상 브랜치가 마스터 뒤에 있었고 풀 요청에 마스터의 커밋이 표시되었으므로 마스터를 병합하여 GitHub에 푸시했지만 새로 고친 후에도 커밋과 diff는 여전히 풀 요청에 나타납니다. GitHub의 브랜치가 master의 커밋을 가지고 있는지 두 배로 확인했습니다. 풀 요청에 여전히 나타나는 이유는 무엇입니까?

또한 풀 요청을 로컬에서 확인했으며 병합되지 않은 커밋 만 표시합니다.


이것이 PR 병합 동작에 영향을 줍니까?
Nathan Hinchey

아니, Github의 차이점.
lobati

자체 호스팅 Gitlab이 동일한 동작을하는지 아는 사람이 있습니까?
Jeff Welling

2
우리는 모두 GitHub에 연락하여이 동작이 바뀌는 것에 대한 관심을 표명 할 것을 제안합니다 ( support.github.com/contact ). 그들이 우리의 말을 듣지 않으면 이것이 얼마나 중요한지 알지 못하며 영원히 이런 식으로 될 것입니다.
steinybot

답변:


107

Pull Request가 대상 브랜치에 대한 변경 사항을 추적하지 않는 것 같습니다 (GitHub 지원 팀에 문의하여 2014 년 11 월 18 일에 의도적으로 설계된 것입니다).

그러나 다음을 수행하여 업데이트 된 변경 사항을 표시 할 수 있습니다.

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

교체 githuburl, org, repo, targetbranch,와 currentbranch같은 필요.

또는 hexsprite가 자신의 답변에서 지적했듯이 EditPR 을 클릭 하고 일시적으로베이스를 다른 지점으로 변경하고 다시 다시 변경 하여 강제로 업데이트 할 수 있습니다 . 경고가 생성됩니다.

받침대를 바꾸시겠습니까?

이전 기본 지점에서 일부 커밋이 타임 라인에서 제거 될 수 있으며 이전 검토 주석이 오래 될 수 있습니다.

그리고 PR에 두 개의 로그 항목남습니다 .

여기에 이미지 설명을 입력하십시오


4
예, 지원팀에 다시 연락하여 같은 응답을 받았습니다. 이러한 상황에 최적화되지 않습니다. 약간 실망입니다. 우리가 그것을 해결하는 방법은 그냥 기지를 세우고 강제로 밀어 올리거나 당기기를 닫고 새 것을 만드는 것입니다.
lobati

4
이 답변은 문제를 해결하지는 않지만 사용자가 진정한 차이점을 볼 수 있도록합니다.
FearlessFuture

4
문제는 "왜 풀 요청에 여전히 나타나는가?"였습니다. 그것은 그 질문에 대한 답입니다.
Adam Millerchip

3
좋은 해결 방법에 대한 내 의견을 확인하십시오. PR 편집 버튼을 사용하여 다른 분기로 전환 한 다음 원래 기본 분기로 다시 전환하면 차이를 다시 계산할 수 있습니다.
hexsprite

11
거기에 사랑 - GitHub의에 이 변경하려면 요청은?
vossad01

87

다음은 좋은 해결 방법입니다. EditGitHub에서 PR을 볼 때이 버튼을 사용하여 기본 분기를 다른 것으로 변경하십시오 master. 그런 다음 다시 전환 master하면 가장 최근의 커밋의 변경 사항 만 올바르게 표시됩니다.


4
더 많은 사람들이이 솔루션을 인정하지 않는 것에 놀랐습니다. 나는 원래의 구식 풀 요청이 잘 될 것이라고 생각하지만, GitHub가 구식 파일을 모두 표시하는 것을 좋아하지 않았기 때문에 이것을 사용했으며 주석을 유지하고 병합 될 실제 변경 사항 만 보여줍니다. . 감사!
taranaki

2
나를 위해 일하지 않았다.
Shashank

젠장!
Anurag Hazra

3 년이 지난 후에도 여전히 훌륭한 솔루션입니다. 그리고 몇 시간 전에 누군가가 댓글을 달았습니다. ^^^
Ricardo Saporta

32

요약하자면, GitHub는 풀 요청에서 커밋 히스토리를 자동으로 리베이스하지 않습니다. 가장 간단한 해결책은 다음과 같습니다.

해결 방법 1 : 리베이스

당신이에 병합한다고 가정 master에서 feature-01:

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

포크로 작업하는 경우 origin위의 로 교체해야 할 수도 있습니다 upstream. GitHub 분기 저장소를 업데이트하는 방법을 참조하십시오 . 원래 저장소의 원격 브랜치 추적에 대해 자세히 알아보십시오.

해결 방법 2 : 새 풀 요청 생성

인트로를 병합한다고 가정합니다 master 에서feature-01 .

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

에 대한 풀 요청을 열고에 대한 요청을 feature-01-rebased닫습니다 feature-01.


4
리베이스는 커밋 해시를 변경하여 기존 검토 주석을 폐기합니까?
haridsv

@haridsv 아마 그렇습니다.
Mateusz Piotrowski

push-force를 수행 할 때주의해야 할 것이 있습니까?
Paul Bendevis 오전

1
@haridsv 그건 내 경험이 아닙니다. 나는 종종 검토 중반을 rebase하고 의견이 손실되지 않습니다. 비록 PR의 변화의 역사를 잃어 버렸지 만
joel

@JoelBerkeley 필자는 저자가 리베이트하여 의견이 사실임을 확인한 몇 가지 리뷰를 실제로 경험했습니다. 그러나 점진적으로 검토 할 수있는 능력을 잃어 버리고 대규모 검토의 경우 검토 자에게 큰 위약을줍니다. 이제 PR에 대한 몇 가지 지침이 있으며 검토를 시작한 후 아무도 검토를 시작하지 않은 경우를 제외하고는 그 중 하나가 절대 리베이스되지 않습니다. 병합은 괜찮지 만 병합 변경 사항을 충돌 해결 이외의 다른 변경 사항과 혼합하지 않는 것이 좋습니다.
haridsv

17

~/.gitconfig파일에 다음을 추가해야 합니다.

[rebase]
    autosquash = true

이것은 이 답변이 보여주는 것과 동일한 결과를 자동으로 얻습니다 .

나는 여기 에서 이것을 얻었다 .


2
젠장, 실수로 투표를 클릭했습니다. 이 답변이 도움이되었습니다. 변경해주세요.
헥터

@hosein 가자. 지금 할 수 있어야합니다.
Mateusz Piotrowski

1
나는 이것이 대답으로 받아 들여 지거나 대답에 포함되어야한다고 생각합니다. 이것은 내가 찾던 결과를 얻습니다!
로널드 레이

1
@RonaldRey git rebasing은 히스토리 편집과 관련되어 있기 때문에 보편적 인 솔루션이 아닙니다. 모든 사람이 다른 사람에 의해 복제되지 않은 개인 포크 작업을하고 있다면 괜찮습니다.하지만 누군가가 저장소를 복제하고 기록을 편집하자마자 다른 역사가 생깁니다.
Adam Millerchip

14

다른 사람이 GitHub Pull Request 동작으로 혼란스러워하는 이유는 PR이 소스 브랜치와 대상 브랜치의 공통 조상에 대한 소스 브랜치 팁의 차이이기 때문입니다. 따라서 소스 브랜치의 모든 변경 사항을 공통 조상까지 표시하고 대상 브랜치에서 발생할 수있는 변경 사항은 고려하지 않습니다.

자세한 내용은 여기를 참조 하십시오 : https://developer.atlassian.com/blog/2015/01/a-better-pull-request/

공통 조상 기반의 차이는 위험 해 보입니다. GitHub에보다 표준적인 3 방향 병합 기반 PR을 만들 수있는 옵션이 있었으면합니다.


1
당신이 언급 한 이유는 정확 해 보이지만 일반적으로 마스터가 업데이트 될 때마다 변경 사항을 내 분기로 다시 병합하기 때문에 혼란 스럽습니다 ... git checkout my-branch-> git merge master . 풀 요청이 즉시 새로 고쳐집니다. 공통 조상도 업데이트됩니까?
G.One

2
이 동작은 병합 대신 리베이스를 수행 할 때 발생하는 것 같습니다
G.One

1
@ G.One, 정말 답글이 그렇습니다. 그러나 예 – 해당 마스터 브랜치에서 소스 브랜치로 병합하면 공통 조상을 정의한 것입니다. 병합 한 마스터에 대한 커밋입니다.
David K. Hess

13

이 문제를 해결하는 한 가지 방법 git rebase targetbranch은 해당 PR에서하는 것입니다. 그런 git push --force targetbranch다음 Github은 올바른 커밋과 차이점을 보여줍니다. 하고있는 일을 모르는 경우이 점에주의하십시오. 어쩌면 먼저 테스트 브랜치를 체크 아웃하여 rebase를 수행 한 다음 git diff targetbranch여전히 원하는 지 확인하십시오.


10

이는 대상 브랜치에서 병합 된 커밋을 스쿼시 할 때 GitHub에서 발생합니다.

스쿼시를 사용하고 대상 지점의 병합을 포함하여 Github와 기본 병합 전략으로 병합했습니다. 이것은 새로운 커밋을 도입하고 GitHub는이 스쿼드 된 커밋이 이미 마스터에있는 커밋과 동일하다는 것을 인식하지 못합니다 (그러나 다른 해시). 힘내가 제대로 처리하지만 GitHub에서 모든 변경 사항을 다시 볼 수 있으므로 검토가 번거 롭습니다. 해결책은 스쿼시 및 병합 대신에 업스트림 커밋에서 가져온 이들을 정기적으로 병합하는 것입니다. 종속성으로 다른 브랜치를 병합하려는 경우,git merge --squash 하고 다른 브랜치가 실제로 마스터로 만든 후 마스터에서 가져 오기 전에 해당 단일 커밋을 되돌리려면.

편집 : 또 다른 해결책은 푸시하고 rebase하고 강제하는 것입니다. 깨끗하지만 재기록 된 역사


1
@achille에게 감사드립니다. 이것은 내 측면의 문제였습니다. 스쿼시 병합을 비활성화하면 해결됩니다.
Ashvin777

0

나는 이것의 이론에 대해 정확히 확신하지 못한다. 그러나 나는 이것을 여러 번 얻었고 다음을 수행하여 해결할 수 있습니다.

git pull --rebase

원래 리포지토리 마스터 브랜치에서 변경 사항을 가져오고 병합합니다 (지시 한 경우)

그런 다음 변경 사항을 github 복제 저장소 (대상)에 강제로 푸시하십시오.

git push -f origin master

이렇게하면 github 클론과 상위 리포지토리가 동일한 github 커밋 수준에 있고 분 기간에 불필요한 변경 사항이 표시되지 않습니다.



-1

엉망이 너무 걱정되면 안전한 접근 방법을 실패하십시오 : 파일로 이동하여 수동으로 변경 사항을 제거한 다음 마지막 커밋으로 스쿼시하십시오.

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})"

나는 갈등이 없습니다, 당신은 갈 수 있습니다!

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.