source

커밋 사이에서 앞으로 이동하거나 뒤로 이동하려면 어떻게 해야 합니까?

manysource 2023. 8. 28. 21:14

커밋 사이에서 앞으로 이동하거나 뒤로 이동하려면 어떻게 해야 합니까?

나는 하고 있습니다.git bisect문제가 있는 커밋에 도달한 후, 저는 제가 올바른 커밋에 있는지 확인하기 위해 한 걸음 더 나아가고자 노력하고 있습니다.

알고 있습니다HEAD^역사를 거꾸로 거슬러 올라가지만 다음과 같이 저를 앞으로 나아가게 하는 또 다른 지름길이 있습니까(앞으로 구체적인 약속이 필요합니다).

A - B - C(HEAD) - D - E - F

저는 제 목표가 F라는 것을 알고 있으며 C에서 D로 이동하고 싶습니다.


참고: 이것은 Git의 복제품이 아닙니다: 커밋 사이를 왔다 갔다 하는 방법, 내 질문은 약간 다르며 거기서 대답되지 않습니다.

저는 당신이 할 수 있다고 믿습니다.

git reset HEAD@{1}

시간 내에 한 번의 약속을 이행하는 것.여러 커밋을 진행하려면 HEAD@{2}, HEAD@{3} 등을 사용합니다.

저는 약간의 실험을 해 보았는데, 이것은 앞으로 탐색하는 요령이 있는 것 같습니다(편집: 병합 커밋 없이 선형 히스토리가 있을 때만 잘 작동합니다)

git checkout $(git rev-list --topo-order HEAD..towards | tail -1)

towards커밋 또는 태그의 SHA1입니다.

설명:

  • 내부지권 내의 $(): 현재사모든커밋가져기오평의균이기HEAD그리고.towards커밋, 커제(밋) 제외)HEAD), 우선순위에 따라 정렬합니다(예:git log기본적으로 -- 이상하게도 기본값인 시간 순서 대신.rev-list), 을 가져가세요, 그리고마것가니다져갑을지막▁),다▁the니가갑▁and.tail곳.), 즉, 우, 가싶곳은고가리곳▁),싶은.
  • 이것은 하위 셸에서 평가되고 다음으로 전달됩니다.git checkout체크아웃을 수행합니다.

수있 함수 다음매 변예정 수있다 습니의 할로별 에서 매개변수 기대 수 있는 할 수 ..profile특정 커밋을 향해 앞으로 이동하는 파일:

# Go forward in Git commit hierarchy, towards particular commit 
# Usage:
#  gofwd v1.2.7
# Does nothing when the parameter is not specified.
gofwd() {
  git checkout $(git rev-list --topo-order HEAD.."$*" | tail -1)
}

# Go back in Git commit hierarchy
# Usage: 
#  goback
alias goback='git checkout HEAD~'

분리된 헤드 상태가 아니라 재설정만 하면 됩니다. 체크아웃이 아니라요.

git reset HEAD@{1}

이것이 제가 앞뒤로 탐색하는 데 사용하는 것입니다.

다음 커밋으로 이동

function n() {
    git log --reverse --pretty=%H master | grep -A 1 $(git rev-parse HEAD) | tail -n1 | xargs git checkout
}

이전 커밋으로 이동

function p() {
    git checkout HEAD^1
}

는 F 최근커고다가니에 대한 입니다.trunk(여기에 고유한 지점 이름 삽입)...은 그것을 할수다있니습라고다라고 부를 수 .trunk~0 just (그냥)trunk), Eastrunk~1 스다trunk~2

리필로그에서 커밋 이름을 지정하는 더 많은 방법을 확인하십시오.

나무 아래로 이동하기 때문에 뒤로 이동하는 것은 사소한 일이며, 항상 한 가지 방법이 있습니다.

  function git_down
        git checkout HEAD^
  end

앞으로 이동할 때 트리 위로 이동하므로 대상 분기를 명시해야 합니다.

  function git_up 
        git log --reverse --pretty=%H $argv | grep -A 1 (git rev-parse HEAD) | tail -n1 | xargs git checkout
  end

용도:git down,git up <branch-name>

만약 당신이 앞을 보고 싶다면, 당신은 이 트릭을 할 수 있습니다. Git은 그것에 대한 엄격한 명령을 가지고 있지 않기 때문입니다.

git log --reverse COMMIT_HASH..

로그 기록 해시 목록:

A
B
C -> put this
D

git log --reverse C..출력에서 B와 A를 볼 있습니다.

저는 방금 이것에 대한 테스트를 했습니다.예를 들어 마스터 브랜치에 있다고 말하고 다음을 수행합니다.

git checkout HEAD@{3}

헤드가 분리되면 다른 커밋으로 이동하기 위해 다시 시도할 수 있습니다.

git checkout HEAD@{4}

다 둘러보고 나면 해당 지점에 체크아웃만 하면 원래 상태로 돌아갈 수 있습니다.예: 마스터 분기

git checkout master

원래 상태로 가고 싶지 않고 커밋 중 하나를 머리로 유지하고 계속하려면 거기서 분기해야 합니다.예를 들어 "git checkout HEAD@{4}" 후에 다음을 발행할 수 있습니다.

git checkout -b MyNewBranch

이 더 나중에 하지만, 가 " 갈 수 도와주는 코드 라인을 .git tree그리고 여러분들도 유용한 자료가 되길 바랍니다.

저는 바시 마술사가 아니므로 변경될 수 있는 것을 찾으면 댓글을 달아주시면 이 코드 라인을 더 나은 것으로 만들 수 있습니다!

뒤로 가기

git log --all --decorate --oneline | grep -A 1 $(git rev-parse --short HEAD) | awk '{print $1}' | tail -1 | xargs -I {} git checkout {}

진행 방법:

git log --all --decorate --oneline | grep -B 1 $(git rev-parse --short HEAD) | awk '{print $1}' | head -1 | xargs -I {} git checkout {}

다음은 몇 가지 설명입니다.

git reflog # Here we get all the commits we need

grep -A 1 $(git rev-parse --short HEAD) # Here we grep for the short commit hash

awk '{print $1}' # Here we get just the hash

tail -1 # We will get at least 2 results, pick the last line, the first would be 0

xargs -I {} git checkout {} # Here we go "forward by 1"

이것이 이와 같은 행동을 하고 싶은 모든 사람에게 도움이 되기를 바랍니다.저는 해시나 로그에 대한 사전 지식 없이 커밋 트리에서 "앞뒤로" 이동하는 명령이 있는 CLI를 구축하고 있습니다.

방법은 것이지만 은 아도가좋방아니사만수있다용습니할지법은을 사용할 수 .git log 를 합니다.git checkout [sha1 of D]D로 이동합니다.

해결 방법으로 다음과 같이 HEAD로 돌아갈 수 있습니다.

git checkout <branch>

그런 다음 원하는 커밋으로 이동합니다.

git checkout HEAD~<offset>

만약 당신이 vs 코드를 사용하고 있다면 Git history는 커밋을 효율적으로 보고 편집기 자체에서 그 내용을 확인할 수 있는 멋진 플러그인입니다.링크를 확인합니다.

branchName=master; commitInOrder=1; git checkout $(git log --pretty=%H "${branchName}" | tac | head -n "${commitInOrder}" | tail -n 1)

위치:

branchName branch (지점 이름)

commitInOrder선택한 분기의 첫 번째 커밋부터 순서대로 커밋과 같습니다(따라서 1은 첫 번째 커밋, 2는 분기의 두 번째 커밋 등).

GUI 및 vcode 사용자에게 확장 깃 그래프를 사용하는 것이 좋습니다.

enter image description here

나는 사용할 것입니다.git-reflog그리고.git-reset.

실행하는 것과 동일한 경우가 아닙니다.git-bisect 당신이 지만당신라고 가정해 보세요.git-resetC를 커밋하고 F를 커밋하기 위해 다시 이동하려고 합니다.

시점에서, 그시에서점,,git-reflog다음과 같이 표시됩니다.

$ git reflog show
4444444 (HEAD -> main) HEAD@{0}: reset: moving to 4444444
1111111 HEAD@{1}: commit: F
2222222 HEAD@{2}: commit: E
3333333 HEAD@{3}: commit: D
4444444 (HEAD -> main) HEAD@{4}: commit: C
5555555 HEAD@{5}: commit: B
6666666 HEAD@{6}: commit: A

그러면, 당신은 달릴 수 있습니다.git-resetHEAD에서 SHA1 해시 또는 오프셋 번호를 지정하여 커밋으로 돌아갑니다.

이경우, 행실을 하세요.git-reset다음과 같이:

$ git reset 1111111

또는

$ git reset HEAD@{1}

F로 이사해야 할 때도 비슷한 문제가 있었습니다.git checkout branch_name헤드를 특정 지점의 최신 커밋으로 이동시킬 것입니다.

사용한 경우git reset HEAD{0}현재 커밋 후에 내가 한 모든 변경 사항(여기서는 C일 것이다)이 수정으로 변경되었는데, 이것은 내가 원하는 것이 아니었습니다.

언급URL : https://stackoverflow.com/questions/6759791/how-do-i-move-forward-and-backward-between-commits-in-git