Git을 사용하여 로컬과 원격 사이의 변화를 어떻게 찾을 수 있습니까?


152

두 가지 다른 질문이 있지만 관련이 있다고 생각합니다.

  1. Git을 사용할 때 로컬에서 커밋했지만 아직 원격 지점으로 푸시하지 않은 변경 내용을 어떻게 찾을 수 있습니까? Mercurial 명령과 비슷한 것을 찾고 hg outgoing있습니다.

  2. Git을 사용할 때 끌어 오기 전에 원격 브랜치의 변경 사항을 어떻게 찾을 수 있습니까? Mercurial 명령과 비슷한 것을 찾고 hg incoming있습니다.

두 번째로 : 사용 가능한 항목을 확인한 다음 가져 오려는 변경 사항을 체리 픽 선택하는 방법이 있습니까?


11
답을 보면 실제로 무엇을 hg incoming하고 있는지에 대해 약간의 혼란이있는 것 같습니다 hg outgoing. 내가 찾은 가장 가까운 Git --dry-run옵션 은 옵션입니다. 그냥 git pull --dry-run당신은 일이 필요로하는 모든 것들의 목록을 볼 수 있습니다.
Roman Starkov

답변:


97

Git은 Hg처럼 네트워크를 통해 이런 종류의 정보를 보낼 수 없습니다. 하지만 당신은 실행할 수 있습니다 git fetch(자세한처럼되는 hg pull것보다 hg fetch원격 서버에서 새로운 커밋을 가져 오기 위해).

따라서이라는 분기 master와이라는 원격 이있는 경우을 origin실행 한 후에도 git fetch라는 분기가 있어야합니다 origin/master. 그런 다음 을 수행 하여 수퍼 세트가되어야하는 git log모든 커밋 을 얻을 수 있습니다 . 그 두 가지를 뒤집어 반대를 얻으십시오.masterorigin/mastergit log master..origin/master

내 친구 인 David Dollar가 시뮬레이션 할 몇 가지 git shell 스크립트를 만들었습니다 hg incoming/outgoing. http://github.com/ddollar/git-utils 에서 찾을 수 있습니다 .


113

Git 1.7.0부터는 업스트림 브랜치를 일반적으로 참조 할 수있는 특수 구문이 있습니다 : @{u}또는 @{upstream}.

모방하려면 hg incoming:

git log ..@{u}

모방하려면 hg outgoing:

git log @{u}..

위의 내용을 더 쉽게 사용할 수 있도록 다음 incomingoutgoing별칭을 사용합니다.

git config --global alias.incoming '!git remote update -p; git log ..@{u}'
git config --global alias.outgoing 'log @{u}..'

자식 로그 .. @ {u}는 이러한 오류를 제공합니다. (내 자식 구성에 원본과 업스트림 저장소가 모두 있습니다). 오류 : ''에 대한 업스트림 분기가 없습니다. 오류 : '..'에 대한 업스트림 분기가 없습니다. 오류 : '..'에 대한 업스트림 분기가 없습니다. 치명적 : 모호한 인수 '.. @ {u}': 알 수없는 개정 또는 경로가 없습니다. 작업 트리. '-'를 사용하여 경로와 개정판을 구분하십시오
Henrik

6
로컬 지점이 업스트림으로 구성되지 않은 경우 이러한 오류가 발생합니다. 수정하려면을 실행하십시오 git branch --set-upstream foo origin/foo.
Richard Hansen

git log @{u}..레포의 모든 단일 변경 사항을 나열합니다. 그들이 아직 존재하지 않는 방법은 없습니다.
Roman Starkov

@romkyns : 로컬 지점에 업스트림으로 구성된 잘못된 원격 지점이있을 수 있습니다. 확인 git rev-parse --symbolic-full-name @{u}인쇄에 적절한 원격 참조하십시오. 또한 git log @{u}..업스트림 분기에서 도달 할 수없는 커밋을 보여줍니다. 여기에는 이미 원격 리포지토리에있는 커밋 (다른 참조로 도달 할 수있는 경우)이 포함될 수 있습니다. 이미 푸시 된 브랜치를 병합 한 직후에 발생합니다.
Richard Hansen

내가 너무 원격 참조에 적합한 것 알고 멍청한거야 두려워 @RichardHansen 그러나 이것은 내가 만했다있는 갓 복제의 repo했다 checkout <somebranch>merge <otherbranch>. 이 시점에서 나는 log @{u}..모든 변경 사항을 나열했습니다.
Roman Starkov

42

완전한 대답은 아니지만 git fetch는 원격 저장소를 가져 와서 병합하지 않습니다. 그런 다음

자식 diff 마스터 원산지 / 마스터


1
나를 위해 일했습니다 (그러나 다른 방법으로)git diff origin/master master
Nick Grealy

34
  1. "git log origin..HEAD"를 사용하십시오.

  2. "git fetch"다음에 "git log HEAD..origin"을 사용하십시오. 나열된 커밋 ID를 사용하여 개별 커밋을 Cherry-Pick 할 수 있습니다.

위의 내용은 "origin"이 원격 추적 브랜치의 이름이라고 가정합니다 (기본 옵션과 함께 clone을 사용한 경우에 해당).


3
(그리고 당신이 원격 지점을 추적하지 않는 경우, 그것은 "git log origin / master..HEAD"입니다.)
plindberg

4
"origin"은 원격 추적 분기의 이름이 아니라 원격의 이름입니다. 원격 이름 만 지정해도 작동하지 않으므로 원격 추적 분기 (원점 / 마스터)를 지정해야합니다.
robinst

22

모든 가지를 비교하기 위해 이것도 있습니다.

git log --branches --not --remotes=origin

이것은 git log 맨 페이지가 이것에 대해 말하는 것입니다 :

로컬 분기에 있지만 원점에 대한 원격 추적 분기에는없는 모든 커밋을 표시합니다 (원본이없는 것).

위의입니다 outgoing. 의 경우 incoming스왑하십시오.

git log --remotes=origin --not --branches

8

난 그럴거야

$ git fetch --dry-run

대한 hg incoming

$ git push --dry-run

에 대한 hg outgoing.


죄송합니다. 이것은 이미 OP에 대한 의견으로 언급되었다고 간과했습니다.
chris

1

git-outhg outgoing매우 정확하게 에뮬레이트하는 스크립트입니다 . "push -n"출력을 구문 분석하므로 추가 인수를 지정해야 할 경우 정확한 출력을 생성합니다.


0

자식 수신

$ git fetch && git log ..origin/master --stat
OR
$ git fetch && git log ..origin/master --patch

git outgoing

$ git fetch && git log origin/master.. --stat
OR
$ git fetch && git log origin/master.. --patch

0

"git log"와 @ {u} 답변이 처음에 "알 수없는 개정"오류를 표시했을 때 Chris / romkyns의 제안을 시도했습니다 git push --dry-run.

"5905..4878 master-> master"와 같은 출력이 표시됩니다. 5905는 리모트가 가지고 있고 커밋하는 (그리고 4878을 포함하여) 리모트에 적용되는 최신 커밋입니다.

그런 다음 5905..4878을 다른 git 명령에 대한 인수로 사용하여 자세한 내용을 얻을 수 있습니다.

git diff 5905..4878 # Gives full code changes in diff style

git log --online 5905..4878 # Displays each commit's comment

-1

git fetch를 수행 할 때 branch, tag (refs)를 포함한 모든 내용은 .git / FETCH_HEAD에 임시로 저장됩니다. FETCH_HEAD의 내용이 새로운 내용으로 덮어 쓰기됩니다. 이 내용들에서, 당신이 가지고 있다면 병합하려는 브랜치를 보거나 결정할 수 있습니다.

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