원격 리포지토리에 아직 푸시되지 않은 로컬 커밋을 보려면 어떻게 해야 합니까? 때때로 git status
origin/master
전에 X 커밋이라고 출력하지만 항상 그런 것은 아닙니다.
이것은 Git 설치의 버그입니까, 아니면 누락된 것이 있습니까?
질문자 :Josh Buhler
원격 리포지토리에 아직 푸시되지 않은 로컬 커밋을 보려면 어떻게 해야 합니까? 때때로 git status
origin/master
전에 X 커밋이라고 출력하지만 항상 그런 것은 아닙니다.
이것은 Git 설치의 버그입니까, 아니면 누락된 것이 있습니까?
git log origin/master..HEAD
동일한 구문을 사용하여 diff를 볼 수도 있습니다.
git diff origin/master..HEAD
아직 푸시되지 않은 모든 분기에 대한 모든 커밋을 보려면 다음과 같이 찾을 수 있습니다.
git log --branches --not --remotes
그리고 각 브랜치의 가장 최근 커밋과 브랜치 이름만 보려면 다음과 같이 하십시오.
git log --branches --not --remotes --simplify-by-decoration --decorate --oneline
로컬에 있지만 업스트림에는 없는 모든 커밋을 표시할 수 있습니다.
git log @{u}..
@{u}
또는 @{upstream}
은 현재 분기의 업스트림 분기를 의미합니다(자세한 내용은 git rev-parse --help
또는git help revisions
참조).
git log
하여 이 작업을 수행할 수 있습니다.
git log origin/master..
이것은 origin
이 업스트림 리모트 master
가 업스트림 브랜치의 이름이라고 가정합니다. ..
다음에 개정 이름을 생략하면 푸시되지 않은 새 커밋을 나열하는 HEAD
의미합니다.
다른 모든 답변은 "업스트림"(당신이 가져온 분기)에 대해 이야기합니다.
그러나 로컬 브랜치 는 자신이 가져온 브랜치와 다른 브랜치로 푸시 할 수 있습니다.
master
는 원격 추적 분기 " origin/master
"로 푸시하지 않을 수 있습니다.
master
대한 업스트림 분기는 origin/master
일 수 있지만 원격 추적 분기 origin/xxx
또는 anotherUpstreamRepo/yyy
푸시할 수 있습니다.
global remote.pushDefault
값과 함께 현재 분기에 대한 branch.*.pushremote
에 의해 설정됩니다.
푸시되지 않은 커밋을 찾을 때 계산 되는 원격 추적 분기: 로컬 분기 가 푸시될 branch at the remote
에서 분기를 추적하는 분기입니다.
branch at the remote
의 분기는 다시 origin/xxx
또는 anotherUpstreamRepo/yyy
있습니다.
<branch>@{push}
참조 29bc885 커밋 , 3dbe9db 커밋 , adfe5d0 커밋 , 48c5847 커밋 , a1ad0eb 커밋 , e291c75 커밋 , 979cb24 커밋 , 1ca41a1 커밋 , 3a429d0 커밋 , a9f9f8c 커밋 , 8770e6f 커밋 , da66b27 커밋 , f052154 커밋 , 9e3751d 커밋 , ee2499f 커밋 5 월 (21)로부터 [모든 2015], e41bf35 [2015년 5월 1일] Jeff King( peff
) .
(2015년 6월 5일 커밋 c4a8354 에서 Junio C gitster
-- gitster -- 병합)
커밋 adfe5d0은 다음과 같이 설명합니다.
sha1_name
:@{push}
속기 구현
@{upstream}
과 일반적으로 푸시하는 대상이라는 두 가지 고유한 관심 지점이 있을 수 있습니다. 후자의 속기는 없지만 있으면 유용합니다.
예를 들어, 아직 푸시하지 않은 커밋이 무엇인지 알고 싶을 수 있습니다 .
git log @{push}..
또는 더 복잡한 예로서 일반적으로
origin/master
(@{upstream}
)에서 변경 사항을 가져오고 변경 사항을 포크(예: myfork/topic )myfork/topic
여러 머신에서 포크로 푸시할 수 있으므로 업스트림이 아닌 푸시 대상에서 변경 사항 을 통합해야 합니다.
이 패치를 사용하면 다음을 수행할 수 있습니다.
git rebase @{push}
전체 이름을 입력하는 대신.
커밋 29bc885 는 다음을 추가합니다.
for-each-ref
: "%(push)
" 형식 허용
각 참조에 대해
@{upstream}
"을 보고하는%(upstream)
"이 있는 것처럼@{push}
"와 일치하도록 "%(push)
업스트림과 동일한 추적 형식 수정자를 지원합니다( 예를 들어 푸시할 커밋이 있는 분기를 알고 싶을 수 있기 때문입니다).
푸시하려는 분기와 비교하여 로컬 분기가 얼마나 많은 커밋을 앞/뒤에 있는지 확인하려면 다음을 수행하십시오.
git for-each-ref --format="%(refname:short) %(push:track)" refs/heads
나는 이전에 커밋을 완료했으며 어떤 지점에도 푸시되지 않았으며 원격도 로컬도 아닙니다. 그냥 커밋. 다른 답변의 아무 것도 나를 위해 일하지 않았지만 다음을 사용했습니다.
git reflog
거기에서 내 커밋을 찾았습니다.
현재 분기에서 푸시되지 않은 커밋을 찾기 위한 편리한 git 별칭:
alias unpushed = !GIT_CURRENT_BRANCH=$(git name-rev --name-only HEAD) && git log origin/$GIT_CURRENT_BRANCH..$GIT_CURRENT_BRANCH --oneline
이것이 기본적으로 하는 일:
git log origin/branch..branch
그러나 현재 분기 이름도 결정합니다.
당신은 시도 할 수 있습니다 ....
gitk
나는 그것이 순수한 명령줄 옵션이 아니라는 것을 알고 있지만 당신이 그것을 설치했고 GUI 시스템에 있다면 당신이 찾고 있는 것과 훨씬 더 많은 것을 정확히 볼 수 있는 좋은 방법입니다.
(사실 지금까지 아무도 언급하지 않은 것에 놀랐습니다.)
git branch -v
는 각 로컬 분기에 대해 "앞으로"인지 여부를 표시합니다.
다음 별칭을 사용하여 커밋되었지만 푸시되지 않은 파일 목록(및 상태)만 가져옵니다(현재 분기에 대해).
git config --global alias.unpushed \ "diff origin/$(git name-rev --name-only HEAD)..HEAD --name-status"
다음을 수행하십시오.
git unpushed
이 작업을 수행하는 가장 일반적인 방법은 다음과 같이 실행하는 것입니다.
git cherry --abbrev=7 -v @{upstream}
그러나 나는 개인적으로 다음을 실행하는 것을 선호합니다.
git log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..
이것은 업스트림에 병합되지 않은 모든 분기의 커밋과 업스트림의 마지막 커밋 을 보여줍니다(다른 모든 커밋에 대한 루트 노드로 표시됨). 나는 그것을 너무 자주 사용하여 별칭 noup
을 만들었습니다.
git config --global alias.noup \ 'log --graph --decorate --pretty=oneline --abbrev-commit --all @{upstream}^..'
git cherry -v
해당 메시지와 함께 로컬 댓글 기록(아직 푸시되지 않음)이 나열됩니다.
https://github.com/badele/gitcheck 스크립트를 참조하는 것이 좋습니다. 모든 git 리포지토리를 한 번에 확인하기 위해 이 스크립트를 코딩했으며 커밋하지 않은 사람과 푸시/풀하지 않은 사람을 보여줍니다.
여기 샘플 결과
버그가 아닙니다. 원격에서 변경 사항을 가져왔지만 아직 병합되지 않은 실패한 자동 병합 후 git 상태가 표시될 수 있습니다.
로컬 repo와 remote 사이의 커밋을 보려면 다음을 수행하십시오.
git fetch
이것은 100% 안전하며 작업 복사본을 조롱하지 않습니다. 변경 사항이 있으면 git status
X commits ahead of origin/master
표시합니다.
이제 원격에는 있지만 로컬에는 없는 커밋 로그를 표시할 수 있습니다.
git log HEAD..origin
이것은 나를 위해 더 잘 작동했습니다.
git log --oneline @{upstream}..
또는:
git log --oneline origin/(remotebranch)..
지정된 작업 디렉토리의 모든 Git, Mercurial 및 Subversion 저장소 를 스캔하고 커밋되지 않은 파일 및 푸시되지 않은 커밋 목록을 표시하는 unpushed라는 도구가 있습니다. Linux에서는 설치가 간단합니다.
$ easy_install --user unpushed
또는
$ sudo easy_install unpushed
시스템 전체에 설치합니다.
사용법도 간단합니다.
$ unpushed ~/workspace * /home/nailgun/workspace/unpushed uncommitted (Git) * /home/nailgun/workspace/unpushed:master unpushed (Git) * /home/nailgun/workspace/python:new-syntax unpushed (Git)
자세한 내용은 unpushed --help
또는 공식 설명 을 참조하세요. 또한 커밋되지 않은 변경 사항과 푸시되지 않은 변경 사항에 대한 화면 알림을 위한 cronjob 스크립트 unpushed-notify
모든 분기에서 푸시되지 않은 모든 커밋을 쉽게 나열하려면 다음 명령을 사용할 수 있습니다.
git log --branches @{u}..
푸시아웃되지 않은 커밋 수가 한 자리 숫자인 경우(일반적인 경우) 가장 쉬운 방법은 다음과 같습니다.
$ git checkout
git은 원점과 관련하여 "N 커밋보다 앞서"고 있다고 응답합니다. 이제 로그를 볼 때 이 숫자를 염두에 두십시오. "3개의 커밋보다 앞서 있는" 경우 기록의 상위 3개 커밋은 여전히 비공개입니다.
유사: 병합되지 않은 분기를 보려면 다음을 수행합니다.
git branch --all --no-merged
그것들은 의심 될 수 있지만 cxreg의 답변을 권장합니다.
일을 하는 한 가지 방법은 한 브랜치에서는 사용할 수 있지만 다른 브랜치에서는 사용할 수 없는 커밋을 나열하는 것입니다.
git log ^origin/master master
위에서 말했듯이 :
git diff origin/master..HEAD
그러나 git gui를 사용하는 경우
GUI 인터페이스를 연 후 "저장소"-> " 기록 시각화"를 선택하십시오.
참고: 어떤 사람들은 CMD 프롬프트/터미널을 사용하는 것을 좋아하고 어떤 사람들은 Git GUI를 사용하는 것을 좋아합니다(간단함을 위해)
git cherry -v
또는 git logs @{u}.. -p
를 수행하든 git submodule foreach --recursive 'git logs @{u}..'
를 통해 하위 모듈 을 포함하는 것을 잊지 마십시오.
이 모든 것을 확인하기 위해 다음 bash 스크립트를 사용하고 있습니다.
unpushedCommitsCmd="git log @{u}.."; # Source: https://stackoverflow.com/a/8182309 # check if there are unpushed changes if [ -n "$($getGitUnpushedCommits)" ]; then # Check Source: https://stackoverflow.com/a/12137501 echo "You have unpushed changes. Push them first!" $getGitUnpushedCommits; exit 2 fi unpushedInSubmodules="git submodule foreach --recursive --quiet ${unpushedCommitsCmd}"; # Source: https://stackoverflow.com/a/24548122 # check if there are unpushed changes in submodules if [ -n "$($unpushedInSubmodules)" ]; then echo "You have unpushed changes in submodules. Push them first!" git submodule foreach --recursive ${unpushedCommitsCmd} # not "--quiet" this time, to display details exit 2 fi
나는 파티에 정말 늦었고 언제 구현되었는지 확실하지 않지만 git push
--dry-run option
사용하십시오.
$ git push --dry-run To ssh://bitbucket.local.lan:7999/qarepo/controller.git 540152d1..21bd921c imaging -> imaging
다음은 모든 분기에 대한 원본과의 차이점을 보여주는 휴대용 솔루션(추가 설치 없이 Windows에서도 작동하는 셸 스크립트)입니다. git-fetch-log
예시 출력:
==== branch [behind 1] > commit 652b883 (origin/branch) | Author: BimbaLaszlo <bimbalaszlo@gmail.com> | Date: 2016-03-10 09:11:11 +0100 | | Commit on remote | o commit 2304667 (branch) Author: BimbaLaszlo <bimbalaszlo@gmail.com> Date: 2015-08-28 13:21:13 +0200 Commit on local ==== master [ahead 1] < commit 280ccf8 (master) | Author: BimbaLaszlo <bimbalaszlo@gmail.com> | Date: 2016-03-25 21:42:55 +0100 | | Commit on local | o commit 2369465 (origin/master, origin/HEAD) Author: BimbaLaszlo <bimbalaszlo@gmail.com> Date: 2016-03-10 09:02:52 +0100 Commit on remote ==== test [ahead 1, behind 1] < commit 83a3161 (test) | Author: BimbaLaszlo <bimbalaszlo@gmail.com> | Date: 2016-03-25 22:50:00 +0100 | | Diverged from remote | | > commit 4aafec7 (origin/test) |/ Author: BimbaLaszlo <bimbalaszlo@gmail.com> | Date: 2016-03-14 10:34:28 +0100 | | Pushed remote | o commit 0fccef3 Author: BimbaLaszlo <bimbalaszlo@gmail.com> Date: 2015-09-03 10:33:39 +0200 Last common commit
로그에 대해 전달된 매개변수(예: --oneline
또는 --patch
사용할 수 있습니다.
git show
로컬 커밋의 모든 diff를 표시합니다.
git show --name-only
로컬 커밋 ID와 커밋 이름이 표시됩니다.
git diff origin
지점이 원점을 추적하도록 설정되어 있다고 가정하면 차이점이 표시됩니다.
git log origin
커밋 요약을 제공합니다.
출처 : http:www.stackoverflow.com/questions/2016901/viewing-unpushed-git-commits
AngularJS에서 데이터 바인딩은 어떻게 작동합니까? (0) | 2021.12.04 |
---|---|
Vim은 마지막 검색 강조 표시를 지웁니다. (0) | 2021.12.04 |
Bash에서 명령의 출력에 변수를 어떻게 설정합니까? (0) | 2021.12.04 |
C++11은 표준화된 메모리 모델을 도입했습니다. 무슨 뜻이에요? 그리고 C++ 프로그래밍에 어떤 영향을 미칠까요? (0) | 2021.12.04 |
AngularJS에서 데이터 바인딩은 어떻게 작동합니까? (0) | 2021.12.04 |