답변:
임의의 확장 객체 참조를 SHA-1로 바꾸려면 git-rev-parse 를 사용하십시오.
git rev-parse HEAD
또는
git rev-parse --verify HEAD
(!) 참고 : 당신이 설정하려면 참조 ( 지점 및 태그를 SHA-1로),이git show-ref
와git for-each-ref
.
git rev-parse --short HEAD
누군가 궁금해하는 경우를 대비하여 해시의 짧은 버전을 반환합니다.
--short
같은 --short=12
해시에서 숫자의 특정 번호를 얻을.
--short=N
에 관한 최소한의 자릿수; git은 단축 된 다른 커밋과 구별 할 수없는 경우 큰 자릿수를 사용합니다. 예를 들어 git rev-parse --short=2 HEAD
또는을 시도하십시오 git log --oneline --abbrev=2
.
git rev-parse HEAD | GREP_COLORS='ms=34;1' grep $(git rev-parse --short=0 HEAD)
단축 된 해시 만 원하는 경우 :
git log --pretty=format:'%h' -n 1
또한 % H를 사용하는 것이 긴 해시를 얻는 또 다른 방법입니다.
git log
도자기이고 git rev-parse
배관 이라고 생각 합니다.
git checkout 33aa44; git log -n 1
나에게 준다 33aa44
. 어떤 버전의 자식을 사용하고 있습니까?
자식 로그를 사용하는 다른 하나 :
git log -1 --format="%H"
@outofculture와 매우 유사하지만 조금 짧습니다.
HEAD
.
HEAD
이름이 지정된 브랜치 가 아닌이 커밋을 가리키는 분리 헤드라고 합니다.
전체 SHA를 얻으려면 :
$ git rev-parse HEAD
cbf1b9a1be984a9f61b79a05f23b19f66d533537
단축 버전을 얻으려면 :
$ git rev-parse --short HEAD
cbf1b9a
git
commit
해시가 필요하다 등의 하나로서 branch
당신은 현재 작업중인 A는 master
branch
, 당신은 또한 사용할 수 있습니다 git rev-parse FETCH_HEAD
당신이 해시해야하는 경우 master
commit
는 것이 merge
현재에 거라고를 branch
. 예를 들어, 당신이있는 경우 branch
ES를 master
하고 feature/new-feature
주어진 REPO합니다.에있는 동안 feature/new-feature
당신이 사용할 수있는 git fetch origin master && git merge FETCH_HEAD
다음 git rev-parse --short FETCH_HEAD
당신은 필요한 경우 commit
로부터 해시 master
그냥 merge
D에 모든 스크립트에 대한 당신이있을 수 있습니다.
아무도 그것을 아직 제안하지 않았기 때문에 완전성을 위해. .git/refs/heads/master
한 줄만 포함 된 파일입니다 : 최신 커밋의 해시 on master
. 거기서 읽을 수 있습니다.
또는 명령으로
cat .git/refs/heads/master
최신 정보:
git은 / refs / heads / 폴더의 파일 대신 pack-ref 파일에 일부 헤드 참조 저장을 지원합니다. https://www.kernel.org/pub/software/scm/git/docs/git-pack-refs.html
master
반드시 그런 것은 아닙니다.
master
.
.git/HEAD
SHA1이 있으면 헤드 모드가 분리 된 것입니다.
.git
하위 디렉토리 가 있다고 가정하기 때문에 반드시 그렇지는 않습니다. 참고 항목 --separate-git-dir
에 깃발을 git init
매뉴얼 페이지를 참조하십시오.
항상 git describe
있습니다. 기본적으로 그것은 당신에게-
john@eleanor:/dev/shm/mpd/ncmpc/pkg (master)$ git describe --always
release-0.19-11-g7a68a75
git describe --long --dirty --abbrev=10 --tags
그것이 나에게 같은 것을 줄 것이다 7.2.0.Final-447-g65bf4ef2d4
"65bf4ef2d4"이다 447 개 7.2.0.Final 태그 후 커밋과 제 (10)는 현재 HEAD에서 글로벌 SHA-1의 다이제스트 인을. 버전 문자열에 매우 좋습니다. --long을 사용하면 태그가 정확하게 일치하더라도 항상 카운트 (-0-)와 해시를 추가합니다.
git describe --always
것 "고유 축약 보여 대체 등의 목적 커밋"
git describe --tags --first-parent --abbrev=11 --long --dirty --always
합니다. 이 --always
옵션은 태그가 없어도 결과 (해시)를 제공함을 의미합니다. 이는 --first-parent
병합 커밋에 의해 혼동되지 않고 현재 분기의 항목 만 따릅니다. 또한 참고 --dirty
추가합니다 -dirty
현재 분기 않은 변경이있는 경우 결과에.
사용하다 git rev-list --max-count=1 HEAD
슈퍼 해키 방법을 원한다면 :
cat .git/`cat .git/HEAD | cut -d \ -f 2`
기본적으로 git은 HEAD의 위치를 .git / HEAD에 형식으로 저장 ref: {path from .git}
합니다. 이 명령은 그 내용을 읽고 "ref :"를 잘라 내고 지정한 파일을 읽습니다.
HEAD는 "ref : ..."가 아니지만 해시 자체는 아니기 때문에 분리 헤드 모드에서는 실패합니다. 그러나 당신은 알고 있습니다. 라이너. 세미콜론이 바람을 피우고 있다고 생각하지 않는다면 ...
HASH="ref: HEAD"; while [[ $HASH == ref\:* ]]; do HASH="$(cat ".git/$(echo $HASH | cut -d \ -f 2)")"; done; echo $HASH
sh
. 30 분의 문서에 대한 주석은 나중에, 여기에 요점이 있습니다 : gist.github.com/Fordi/29b8d6d1ef1662b306bfc2bd99151b07
내가 아는 가장 간결한 방법 :
git show --pretty=%h
해시의 특정 자릿수를 원하는 경우 다음을 추가 할 수 있습니다.
--abbrev=n
git show
, 도자기 명령 (즉, 사용자 대면)이라고 알려진 것이기 때문에 출력에 변경이있을 수 있으므로 스크립트에 사용 해서는 안됩니다 . git rev-parse --short HEAD
대신 위의 답변 ( )을 사용해야합니다.
git help show
하십시오 porcelain
.
--porcelain
지므로 혼란 스럽습니다. 당신의 세부 사항 찾을 수 있습니다 VonC에 의해이 큰 대답을
아마도 별명을 원할 것이므로 모든 멋진 세부 사항을 기억할 필요는 없습니다. 아래 단계 중 하나를 수행 한 후 간단히 다음을 입력 할 수 있습니다.
$ git lastcommit
49c03fc679ab11534e1b4b35687b1225c365c630
수락 된 답변 에 이어 다음 과 같이 두 가지 방법으로 설정할 수 있습니다.
1) 전역 설정 (원래 답변)을 편집하여 git에게 명시적인 방법을 가르치십시오.
# open the git config editor
$ git config --global --edit
# in the alias section, add
...
[alias]
lastcommit = rev-parse HEAD
...
2) 또는 최근 Adrien이 언급 한 것처럼 git에게 단축키를 가르치는 단축키를 좋아하는 경우 :
$ git config --global alias.lastcommit "rev-parse HEAD"
여기에서 git lastcommit
마지막 커밋의 해시를 표시하는 데 사용하십시오 .
git config --global alias.lastcommit "rev-parse HEAD"
좀 더 다른 것이 필요했습니다. 커밋의 전체 sha1을 표시하지만 작업 디렉토리가 깨끗하지 않으면 끝에 별표를 추가하십시오. 여러 명령을 사용하고 싶지 않으면 이전 답변의 옵션 중 어느 것도 작동하지 않습니다.
하나의 라이너는 다음과 같습니다.
git describe --always --abbrev=0 --match "NOT A TAG" --dirty="*"
결과 :f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe*
설명 : 주석이 달린 태그를 사용하여 현재 커밋을 설명하지만 "NOT A TAG"가 포함 된 태그 만 사용합니다. 태그는 공백을 가질 수 없으므로 태그와 일치하지 않으며 결과를 표시하려고하기 때문에 --always
명령 --abbrev=0
은 커밋 의 전체 ( ) sha1을 표시하고 작업 디렉토리가있는 경우 별표를 추가합니다 --dirty
.
별표를 추가하지 않으려면 이전 답변의 다른 모든 명령과 같이 작동합니다.
git describe --always --abbrev=0 --match "NOT A TAG"
결과 :f5366ccb21588c0d7a5f7d9fa1d3f85e9f9d1ffe
--match "NOT A TAG"
. 자식 2.18.0과 2.7.4에서 테스트되었습니다. 이 논쟁이 필요한 상황이 있습니까?
git show-ref --head --hash head
cat .git/refs/heads/<branch-name>
지금까지 여기에 나열된 다른 방법보다 훨씬 빠릅니다.
show-ref
이 배관 명령의 향후 릴리스에서 안정을 유지하는 것이 보장 (또는 매우 가능성이 적어도) 이후, 스크립팅을위한 최선의 선택이 될 나에게 보인다 다른 답변 사용 rev-parse
, show
, describe
, 또는 log
모든 도자기 명령이있다. 그리고 속도가 핵심 이 아닌 경우 show-ref
맨 페이지 의 참고 사항이 적용됩니다. '.git 디렉토리에있는 파일에 직접 액세스하는 것이 좋습니다.'
또 다른 직접 액세스 구현은 다음과 같습니다.
head="$(cat ".git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
head="$(cat ".git/${head#ref: }")"
done
이것은 또한 로컬 패키지 아카이브에 유용한 http를 통해 작동합니다 (공개 웹 사이트의 경우 .git 디렉토리에 액세스 할 수 없도록 권장하지 않음).
head="$(curl -s "$baseurl/.git/HEAD")"
while [ "$head" != "${head#ref: }" ]; do
head="$(curl -s "$baseurl/.git/${head#ref: }")"
done
여기에 다른 방법이 있습니다 :)
git log | grep -o '\w\{8,\}' | head -n 1
cat .git/HEAD
출력 예 :
ref: refs/heads/master
그것을 파싱하십시오 :
cat .git/HEAD | sed "s/^.\+ \(.\+\)$/\1/g"
창이있는 경우 wsl.exe 사용을 고려할 수 있습니다.
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g"
산출:
refs/heads/master
이 값은 나중에 체크 아웃하는 데 사용될 수 있지만 SHA를 가리키게됩니다. 이름으로 실제 현재 분기를 가리 키도록하려면 다음을 수행하십시오.
wsl cat .git/HEAD | wsl sed "s/^.\+ \(.\+\)$/\1/g" | wsl sed "s/^refs\///g" | wsl sed "s/^heads\///g"
출력 :
master
--verify
그 의미 :The parameter given must be usable as a single, valid object name. Otherwise barf and abort.