가져 오기를 수행하지 않고 git-pull을 미리 보는 방법은 무엇입니까?


204

가능합니까?

기본적으로 원격 저장소는 다음을 사용하여 가져옵니다.

git pull

이제 내 쪽의 물건을 건드리지 않고이 당김이 어떻게 바뀌는 지 (diff)를 미리보고 싶습니다. 그 이유는 내가 당기는 것이 "좋은"것이 아닐 수 있으며 다른 사람이 내 저장소를 더러워지기 전에 수정하기를 원하기 때문입니다.


4
편집이 이상합니다. "git fetch"는 작업 트리를 변경하지 않으므로 커밋되지 않은 로컬 변경 사항이 있는지는 중요하지 않습니다. 또한 작업 트리에 닿지 않기 때문에 실행 취소하려는 가져 오기의 일부가 명확하지 않습니다.
dkagedal

고마워 dkagedal, 나는 Git이 어떻게 작동하는지 완전히 이해하기 전에 이것을 썼다. 나는 그 편집을 제거했다.
밀라노 Babuškov

답변:


233

를 수행 한 후 a git fetch를 수행 git log HEAD..origin/master하여 마지막 공통 커밋과 오리진의 마스터 브랜치 사이의 로그 항목을 표시하십시오. diff를 표시하려면 git log -p HEAD..origin/master각 패치를 표시하거나 git diff HEAD...origin/master(두 개가 아닌 세 개의 점)을 사용하여 단일 diff를 표시하십시오.

A가 가져 오는 일을하는 경우에만 업데이트하기 때문에 일반적으로 인출 취소 할 필요는 없다 원격 지점과의 아무도 당신의 지점을. 모든 원격 커밋에서 풀 앤 병합을 수행 할 준비가되지 않은 경우 git cherry-pick원하는 특정 원격 커밋 만 수락 하는 데 사용할 수 있습니다 . 나중에 모든 것을 얻을 준비가 git pull되면 나머지 커밋에 의지가 병합됩니다.

업데이트 : 왜 git fetch를 사용하지 않으려는지 확실하지 않습니다. 모든 git fetch는 원격 브랜치의 로컬 복사본을 업데이트합니다. 이 로컬 사본은 브랜치와 관련이 없으며 커밋되지 않은 로컬 변경과는 관련이 없습니다. 나는 안전하기 때문에 cron 작업에서 git fetch를 실행하는 사람들에 대해 들었습니다. (하지만 일반적으로 권장하지는 않습니다.)


나는 문서를 읽는 동안 '내 가지와 관련이없는 것'의 부분을 놓친 것 같습니다. 감사.
Milan Babuškov

1
어떤 이유로 든 작동하지 않습니다. git diff HEAD ... origin / master를 시도했지만 '풀 원점 마스터'를 수행 할 때 아직 변경 사항을 나열하지 않았으므로 변경 사항을 가져 와서 병합합니다. git remote add를 사용하여 원격 저장소를 설정했기 때문입니까?
screenm0nkey

@ screenm0nkey : 나는 더 많은 정보를 모른다. 아직 확실하지 않은 경우 새 질문을 열어 문의하십시오.
Greg Hewgill

1
무슨 일이 (힘내 후 가져 오기) 나를 위해 작동 : 자식 로그 원산지 / 마스터
slaman

2
git diff ...@{u}git diff HEAD...origin/master원산지 / 마스터가 업스트림 지점 인 경우 와 동일합니다.
모호한

47

나는 git fetch 가 당신이 찾고있는 것이라고 생각 합니다.

로컬 저장소의 색인에 커밋하지 않고 변경 사항과 객체를 가져옵니다.

나중에 git merge를 사용 하여 병합 할 수 있습니다 .

맨 페이지

편집 : 추가 설명

로부터 직선 Git- SVN 크래시 코스 링크

이제 원격 저장소에서 새로운 변경 사항을 어떻게 얻습니까? 당신은 그들을 가져옵니다 :

git fetch http://host.xz/path/to/repo.git/ 

이제 저장소에 있으며 다음을 사용하여 검사 할 수 있습니다.

git log origin 

변경 사항을 비교할 수도 있습니다. git log HEAD..origin 을 사용 하여 지점에없는 변경 사항 만 볼 수도 있습니다 . 그런 다음 병합하려면 다음을 수행하십시오.

git merge origin

가져올 분기를 지정하지 않으면 기본적으로 추적 리모컨이 기본값으로 설정됩니다.

매뉴얼 페이지를 읽으면 옵션과 사용법을 가장 잘 이해할 수 있습니다.

나는 예제와 메모리 로이 작업을 시도하고 있는데 현재 테스트 할 상자가 없습니다. 다음을 봐야합니다.

git log -p //log with diff

git reset --hard ( link )를 사용 하여 가져 오기를 취소 할 수 있지만 가져온 변경 사항뿐만 아니라 트리에서 커밋되지 않은 모든 변경 사항이 손실됩니다.


두 가지를 설명하면 좋습니다. 1. git-fetch를 어떻게 취소합니까? 2. 차이점을 어떻게 알 수 있습니까?
Milan Babuškov

1
1) git-fetch를 실행 취소 하시겠습니까? 2) git diff HEAD..origin
Chris Vest

Christian이 말한 것처럼 diff는 git reset --hard로 가져 오기를 취소 할 수 있지만 커밋 한 변경 사항과 함께 트리에서 커밋되지 않은 모든 변경 사항이 손실됩니다.
Brian Gianforcaro

당신이 찾고 계십니까 git reset --soft--mixed? 맨 페이지를 확인하십시오.
아리스토텔레스 Pagaltzis

1
내가 제대로 이해한다면 "git fetch"를 실행 취소 할 필요가 없다. 왜냐하면 그것은 작업 사본과 저장소에 영향을 미치지 않기 때문이다. .git / FETCH_HEAD에 저장 개체와 심판을 "가져 힘내"
토르스텐 Niehues에게

21

원격 리포지토리에서 가져 와서 차이점을 확인한 다음 당기거나 병합 할 수 있습니다.

다음은 원격 리포지토리 originmaster원격 분기 추적 이라는 브랜치의 예입니다 origin/master.

git checkout master                                                  
git fetch                                        
git diff origin/master
git pull --rebase origin master

8

나를 위해 사용자 지정 git 별칭을 만들었습니다.

alias.changes=!git log --name-status HEAD..

그것으로 당신은 이것을 할 수 있습니다 :

$git fetch
$git changes origin

이렇게하면을 수행하기 전에 변경 사항을 미리 볼 수있는 쉽고 좋은 방법이 merge있습니다.


당신은 하나님입니다. 이것은 자식 자체 안에 있어야합니다
Z. Khullah

3

이 두 명령을 사용하면 파일을 변경할 수 있습니다.

  1. 먼저 git fetch를 실행 하면 다음과 같은 출력을 제공합니다 (출력의 일부).

    ...
    72f8433..c8af041 개발-> 원산지 / 개발
    ...

이 작업은 두 개의 커밋 ID를 제공합니다. 첫 번째는 이전 ID이고 두 번째는 새 ID입니다.

  1. 그런 다음 git diff를 사용 하여이 두 커밋을 비교하십시오.

    git diff 72f8433..c8af041 | grep "diff --git"

이 명령은 업데이트 될 파일을 나열합니다.

diff --git a/app/controller/xxxx.php b/app/controller/xxxx.php
diff --git a/app/view/yyyy.php b/app/view/yyyy.php

예를 들어 app / controller / xxxx.phpapp / view / yyyy.php 가 업데이트됩니다.

git diff를 사용하여 두 커밋을 비교하면 업데이트 된 모든 파일이 변경된 줄로 인쇄되지만 grep을 사용 하면 출력에서 diff --git 가 포함 된 줄만 검색하여 가져 옵니다 .


3

나는 파티에 늦을지도 모르지만 이것은 너무 오랫동안 나를 괴롭힌 것입니다. 내 경험상 작업 복사본을 업데이트하고 해당 변경 사항을 처리하는 것보다 보류중인 변경 사항을보고 싶습니다.

이것은 ~/.gitconfig파일 에 들어갑니다 .

[alias]
        diffpull=!git fetch && git diff HEAD..@{u}

현재 분기를 가져온 다음 작업 사본과이 가져온 분기간에 차이점을 수행합니다. 따라서 변경 사항 만 표시됩니다 git pull.


1
에 대한 참조 문자열을 바꿀 수 HEAD..@{u}있습니까? 더 간단하고 리모컨의 이름을 "origin"으로 지정하거나 분기의 이름을 리모컨과 동일하게 지정할 필요는 없습니다.
Michael-Clay Shirky는 어디에 있습니까

이것은 잘 된 별칭이지만 처음에 왜 이것을하고 싶을 지 모르겠습니다. 언젠가 변경 사항을 처리해야합니까? git pull수행중인 작업이 마음에 들지 않으면 병합 부분을 중단 할 수 있어야합니다 . 그래서 유스 케이스가 무엇인지 잘 모르겠습니다.
Marnen Laibow-Koser

어느 시점에서 변경 사항을 처리해야한다는 것을 알고 있지만, 글을 쓸 때 가끔 원하지 않습니다. 나는 무언가가 깨질 지 알고 싶고 이것을 위해 더 많은 시간을 예약해야합니다-또는 git pull나중에 그냥 할 수 있는지 . 또한 op의 질문이 무엇인지 생각합니다.
Andy P

-1

git-fetch 가 로컬 .git을 업데이트 하지 않으려면 로컬 리포지토리를 임시 디렉토리에 복사하고 가져옵니다. 여기 손이 있습니다 :

$ alias gtp="tar -c . | (cd /tmp && mkdir tp && cd tp && tar -x && git pull; rm -rf /tmp/tp)"

전의.:

$ git status
# On branch master
nothing to commit (working directory clean)

$ gtp
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master
Updating 32d61dc..05287d6
Fast-forward
 subdir/some.file       |    2 +-
 .../somepath/by.tes    |    3 ++-
 .../somepath/data      |   11 +++++++++++
 3 files changed, 14 insertions(+), 2 deletions(-)

$ git status
# On branch master
nothing to commit (working directory clean)

$ git fetch
remote: Finding sources: 100% (25/25)
remote: Total 25 (delta 10), reused 25 (delta 10)
Unpacking objects: 100% (25/25), done.
From ssh://my.git.domain/reapO
   32d61dc..05287d6  master     -> origin/master

$ git status
# On branch master
# Your branch is behind 'origin/master' by 3 commits, and can be fast-forwarded.
#
nothing to commit (working directory clean)

'gtp'는 .git가있는 로컬 리포지토리의 루트에서 실행해야합니다.
AX Labs

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