자식 분기에서 수정 된 모든 파일을 가져옵니다


209

지점에서 어떤 파일이 변경되었는지 확인할 수있는 방법이 있습니까?



2
그들은 내 직원이 아니고 그들은 내 동료이며 특히 일반적인 사람들 만큼은 아닙니다. 그러나 예,이 게시물을 다시 읽으면 조금 농담 해 보입니다. :)
Raif

3
github 또는 bitbucket, gitlab을 사용할 수 있습니까? 이 상황을 정확하게 관리 할 수있는 도구가 있습니다. 개발자가 풀 요청을합니다. 요청을 받으면 각 파일에 대한 모든 변경 사항을 보여주는 매우 훌륭한 인터페이스에 액세스 할 수 있습니다. 주석을 달거나 변경 사항 등을 요청할 수도 있습니다. 변경 사항이 양호하면 변경 사항을 요청 된 분기 (일반적으로 개발)로 병합하는 요청을 수락 할 수 있습니다. 이것이이 상황을 처리하는 가장 좋은 방법입니다.
Scott Wright

답변:


168

@Marco Ponti의 답변에 대한 대안이며 체크 아웃을 피하십시오.

git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)

특정 쉘이 $ () 구문을 이해하지 못하면 대신 백틱을 사용하십시오.


1
아! <notMainDev>를 현재의 브랜치라고 말하고 싶을 때는 어떻습니까? 그것을 지정할 필요가 없습니까?
Raif

29
git diff --name-only <some-other-branch>현재 분기와의 파일이 다른 파일이 표시됩니다 <some-other-branch>. 그래서 본질적으로 동일한 명령,하지만 당신은 사이 다른 파일을 찾으려면이를 사용할 수있는 노트의 어떤 그들이 원격으로 관련이없는 경우에도, 두 가지를. 그 비교가 유용한 지 아닌지는 브랜치의 토폴로지에 달려 있습니다 ... 또한, <some-other-branch>실제로 커밋 또는 태그로 해석되는 것이 될 수 있습니다.
twalberg

흠, 내가 의미하는 것은 git diff --name-only <notMainDev> $ (git merge-base <notMainDev> <MY_CURRENT_CO_BRANCH>)하고 싶습니다. 여기서 MY_CURRENT_CO_BRANCH는 물론 현재 체크 아웃 된 분기가됩니다.
Raif

당신도 그렇게 할 수 있습니다. 즉, 지점 찾을 수 <notMainDev><MY_CURRENT_CO_BRANCH>공통 조상을 가지고 가장 최근에, 그리고 비교 <notMainDev>그 조상에. 그러나 현재 브랜치 이름을 제공해야합니다 git merge-base. 최소한 현재 버전에는 지름길이 없습니다.
twalberg

1
확인! 알았어 내 동료의 호의는 그의 이름입니다. git merge-base <notMainDev>- git branch | grep '\*' | awk '{print $2}' <notMainDev>와 내 현재 분기 사이의 분기 커밋을 가져옵니다. 그런 다음 git diff --name-only <notMainDev> $ (git merge-base <notMainDev> git branch | grep '\*' | awk '{print $2}')
Raif

147

다음과 같이하면됩니다 :

git checkout <notMainDev>
git diff --name-only <mainDev>

그러면 두 분기간에 다른 파일 이름 만 표시됩니다.


와우와 요점. 감사합니다. 나는 자식을 좋아한다. 그것은 항상 빠르고 요점입니다
Raif

23
<mainDev>그래도 지점이 분기 된 이후에 변경된 내용이 표시 될 것이라고 생각합니다 . git diff --name-only <sha-of-branch-point>대신 사용 하거나 체크 아웃을 피하는 게시 된 대체 답변을 참조하십시오.
twalberg

예, 사실 @twalberg는 분기가 분기되면 이러한 변경 사항을 보여줍니다. 나는 notMainDevmainDev 커밋으로 최신 상태를 유지할 것이라고 가정했습니다 ... 보통 그 차이를 보는 것이 유용하다는 것을 알았습니다.
Marco Ponti

오른쪽에서 변경된 파일 만 표시하기 위해 --right-only 만 지정할 수 있습니까?
TheZenker

당신은 <sha-of-branch-point>함께 얻을git rev-parse <branch-name>
fc9.30

69

이것은 지금까지 말하지 않은 것에 놀랐습니다!

git diff master...branch

따라서 변경 사항 만 참조하십시오. branch

현재 지점을 확인하려면

git diff master...

jqr 덕분에

이것은 짧은 손입니다

git diff $(git merge-base master branch) branch

병합베이스 (분 기간 가장 최근의 커밋)와 분기 팁

또한 마스터 대신 원본 / 마스터를 사용하면 로컬 마스터가 날짜가 지정된 경우 도움이됩니다.


4
이것은 변경된 사항을 보여 주지만 변경된 파일의 요약이 아닌 모든 변경 사항을 보여줍니다. 처음에이 페이지로 연결됩니다. :
Chris Rutledge

1
그런 다음 --name-only 플래그를 추가하십시오. 또는 --short-stat
exussum

2
git diff --name-only master..두 분기간에 다른 파일 이름을 원할 경우
Adam

1
사이드 브랜치를 생성 한 후 마스터가 커밋 한 경우에는 제대로 작동하지 않습니다.
simplylizz

2
@simplylizz 그렇습니다. 정확히 이것이 해결하는 것
exussum

45

이 작업을 수행하는 방법이 너무 많다는 것을 믿을 수 없습니다. 나는 다음과 같은 주장으로 이전에 게시 한 내용을 변경했습니다.

git whatchanged --name-only --pretty="" origin..HEAD

여기에는 파일 이름과 현재 분기에서 변경된 파일 이름 만 나열됩니다.


3
추가 정보가 필요하지 않으므로 가장 쉬운 답변 인 것 같습니다. 결과는 정확 해 보이고 허용 된 답변보다 기억하기 쉽습니다!
RickMeasham

1
고마워, 이것은 더 재미 있고 더 재미있다. 각 커밋마다 역순으로 출력을 제공합니다. git-whatchanged-커밋마다 차이가있는 로그 표시 git-scm.com/docs/git-whatchanged
nealmcb

로부터 자식 문서 :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
데릭 S

21

@twalberg의 답변을 정말로 좋아했지만 항상 현재 지점 이름을 입력하고 싶지 않았습니다. 그래서 나는 이것을 사용하고있다 :

git diff --name-only $(git merge-base master HEAD)

1
귀하의 솔루션이 저에게 효과적이며 예상되는 파일 목록을 얻습니다. 나는 Git 초보자이며 git diff master... --name-only대상 분기에서 실행할 때 사용 하고 동일한 결과를 얻었습니다. 답변과 내가 제공 한 명령 사이에 좋은 점과 나쁜 점에 대한 피드백을 제공 할 수 있습니까?
hungerstar

브랜치를 만든 이후 master에 새로운 커밋이 없으면 명령이 동일하게 작동합니다. 내 명령이 동일하다고 생각합니다 git diff master.. --name-only(3 대신 2 점 만 있음). 점의 의미를 이해하려면 이 답변을
Yep_It's_Me

대박! 빠른 답변과 통찰력에 감사드립니다. 매우 감사.
hungerstar

12

git whatchanged 좋은 대안으로 보인다.


1
내가 찾던 것은 정확히 무엇입니까.
Sild

로부터 자식 문서 :New users are encouraged to use git-log instead. The whatchanged command is essentially the same as git-log but defaults to show the raw format diff output and to skip merges.
데릭 S

9
git diff --name-only master...branch-name

우리가 비교하고 싶은


기존 답변의
일부인

이 변형은 마스터의 HEAD를 현재 분기와 비교합니다. 수락 된 답변은 분기점에서 마스터 상태를 비교합니다 . 알고 싶은 내용에 따라 찾고있는 답변이있을 수 있습니다.
Mark Stosberg

8

이처럼 쉬울 수 있다면 어떨까요?

git changed

메인 브랜치를 "마스터"라고하고 마스터에서 다른 브랜치를 만들려면이 별칭을 ~/.gitconfig파일에 추가하여 쉽게 만들 수 있습니다.

cbranch = !"git branch | grep '*' | cut -f2 -d' '"
changed = !"git diff --name-only $(git cbranch) $(git merge-base $(git cbranch) master)"

이러한 가정은 대부분의 상황에서 대부분의 사람들에게 효과가 있지만,이를 만들고 있다는 사실을 알고 있어야합니다.

또한을 지원하는 쉘을 사용해야합니다 $(). 쉘이 이것을 지원할 가능성이 큽니다 .


3
git show --stat origin/branch_name

이 분기에서 추가 또는 수정 된 파일 목록이 표시됩니다.


2
이것은 잘못입니다. 전체 브랜치가 아닌 해당 브랜치의 헤드 커밋에서 변경된 파일 만 표시합니다.
davidtbernal

2

어떤 이유로 든 아무도 언급하지 않았습니다 git-tree. https://stackoverflow.com/a/424142/1657819를 참조 하십시오.

git-tree배관 명령 이기 때문에 선호됩니다 . 프로그래밍 방식이어야합니다 (아마도 더 빠름)

(기본 지점이 있다고 가정 master)

git diff-tree --no-commit-id --name-only -r master..branch-name

그러나 이것은 브랜치에서 영향을받은 모든 파일을 보여줍니다. 명시 적으로 수정 된 파일 만 보려면 다음을 사용할 수 있습니다 --diff-filter.

git diff-tree --no-commit-id --name-only -r master..branch-name --diff-filter=M

또한 파일 상태를 보는 --name-status대신 사용할 수 있습니다 --name-only( A/ M/ D등).


이것은 삭제 된 파일을 제외하고 변경된 파일을 린트하는 데 필요한 것입니다. rubocop --fail-level error $(git diff-tree --no-commit-id --name-only -r origin/master..HEAD --diff-filter=M)
HarlemSquirrel

1

허용 된 답변-- git diff --name-only <notMainDev> $(git merge-base <notMainDev> <mainDev>)은 매우 가깝지만 삭제 상태가 잘못되었음을 알았습니다 . 지점에 파일을 추가했지만이 명령 (을 사용하여 --name-status)은 "A"상태를 삭제 한 파일과 "D"상태를 추가 한 파일을 제공했습니다.

대신이 명령을 사용해야했습니다.

git diff --name-only $(git merge-base <notMainDev> <mainDev>)

0

어떤 이유로 든 cmd를 사용하는 경우 @twalberg 및 @iconoclast의 기능을 확장하면 다음을 사용할 수 있습니다.

FOR /F "usebackq" %x IN (`"git branch | grep '*' | cut -f2 -d' '"`) DO FOR /F "usebackq" %y IN (`"git merge-base %x master"`) DO git diff --name-only %x %y

0

다음 배치 파일은 twalberg의 답변을 기반으로하지만 Windows에서 작동합니다.

@ECHO OFF
C:                               :: <== OR USE A DIFFERENT DRIVE
CD \path\to\where\git\files\are  :: <== CHANGE TO THE ACTUAL PATH
SET /p b="Enter full path of an ALREADY MERGED branch to compare with origin/master: "
bash --login -i -c "git diff --name-only %b% $(git merge-base %b1% origin/drop2/master)"
PAUSE

위의 내용은 메인 브랜치가 origin / master이고 Git이 설치 될 때 git bash가 포함되어 있다고 가정합니다 (그리고 그 위치는 경로 환경에 있습니다). 실제로 구성된 diff 도구 (kdiff3)를 사용하여 실제 차이점을 표시해야하므로 위의 bash 명령을 대체했습니다.

bash --login -i -c "git difftool --dir-diff %b% $(git merge-base %b1% origin/drop2/master)"

0

grep을 사용 하므로 파일 경로 인 diff --git 줄만 가져옵니다 .

git diff branchA branchB | grep 'diff --git'
// OUTPUTS ALL FILES WITH CHANGES, SIMPLE HA :)
diff --git a/package-lock.json b/package-lock.json
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.