Git을 사용하여 이전 커밋에서 분기


1798

커밋이 n 개 있으면 n-3 커밋에서 분기 할 수 있습니까?

모든 커밋의 해시를 볼 수 있습니다.

답변:


2545

해시를 통해 분기를 만들 수 있습니다.

git branch branchname <sha1-of-commit>

또는 기호 참조를 사용하여 :

git branch branchname HEAD~3

지점을 만들 때 체크 아웃하려면

git checkout -b branchname <sha1-of-commit or HEAD~3>

42
Git 1.8.2에서는 첫 번째 양식에 짧은 sha1을 사용하겠습니다.
Dan Benamy

53
@MattFenwick Git을 사용하면 단축 해시가 저장소에서``고유 ''한 한 해시가 허용되는 모든 곳에서 단축 해시를 사용할 수 있습니다. 작동하지 않으면 해시에서 다른 문자를 추가하십시오.
찌르다

29
새 브랜치를 서버에 올바르게 푸시하려면 다음 단계가 필요합니다.git push origin BRANCH_NAME
Gene Bo

3
<sha1-of-commit>실행 에서 분기를 시작 git checkout -b <name-of-branch> <sha1-of-commit>하지만 분기가 이미 존재하는 경우git checkout -B <name-of-branch> <sha1-of-commit>
mostafazh

258

github.com에서이를 수행하려면 :

  1. 프로젝트로 이동하십시오.
  2. "커밋"을 클릭하십시오.
  3. 분기하려는 커밋 에서 <> ( "기록에서이 시점에서 저장소 찾아보기")를 클릭하십시오.
  4. 왼쪽 상단에서 "tree : xxxxxx"를 클릭하십시오. 언어 통계 표시 줄 바로 아래에 "지점 찾기 또는 만들기"옵션이 있습니다 (새 지점 이름을 입력하십시오).이전 커밋에서 분기

4
질문은 github가 아니라 git에 관한 것입니다. 대부분의 git 서버는 github이 아닙니다.
Anders Tornblad

46
이것이 Github가 git이 아니라는 사실에도 불구하고 여전히 도움이되었습니다!
Liz

불행히도 여전히 피하고 싶었던 다른 커밋의 변경 사항을 보여
Maxim

83

마술은 git reset 으로 수행 할 수 있습니다 .

  1. 새 브랜치를 생성 한 후 전환하십시오 (최신 커밋이 모두 여기에 저장 됨)

    git checkout -b your_new_branch

  2. 이전 작업 지점으로 다시 전환하십시오 (마스터라고 가정).

    git checkout master

  3. 최신 x 커밋을 제거하고 마스터를 깨끗하게 유지하십시오.

    git reset --hard HEAD~x # in your case, x = 3

지금부터 모든 최신 x 커밋은 더 이상 이전 작업 지점 (마스터)이 아닌 새 지점에만 있습니다.


7
이것은 마스터에서 커밋을 제거하고 커밋하기 전에 지점을 만드는 것을 기억 한 것처럼 만들기 때문에 내가 찾고있는 것입니다. 감사.
superbeck

7
git reset --hard이미 커밋을 시작했다면 a는 좋은 생각이 아니라는 것을 잊지 마십시오 ...
LuisF

1
당신은 할 수 있습니다 git push --force 당신은 이미 분기 이전에 추진 한 경우
밀라노

--force 사용하지만 정말 조심해야 blog.developer.atlassian.com/force-with-lease
peater

74

어떤 커밋을 미리 시작 해야할지 확실하지 않은 경우 커밋을 확인하고 해당 코드 (소스, 컴파일, 테스트 참조)를 검사 할 수 있습니다

git checkout <sha1-of-commit>

일단 커밋하려는 커밋을 찾으면 일반적인 방법으로 분기를 만들어 커밋 내에서 (즉, 먼저 마스터로 돌아 가지 않고) 커밋을 수행 할 수 있습니다.

git checkout -b <branch_name>

22
git checkout -b <branch-name> <sha1-of-commit>

1
이것이 " git branch branchname <sha1-of-commit>"(허용 된 답변과)와 어떻게 다릅니 까?
피터 Mortensen

모르겠어요 나는 그들이 동등하다고 생각합니다. 나는 항상 git checkout -b새로운 지점을 만드는 데 사용 합니다.
Tyler Long

10
stackoverflow.com/a/7987711/3590629 git branch ...는 브랜치를 생성하지만 현재 브랜치를 남겨 둡니다. git checkout -b ...는 브랜치를 생성하고 그로 전환합니다.
esme_louise

9

Github 리포지토리에서이를 수행하는 빠른 방법은 다음과 같습니다.

  • 지점에서 특정 커밋 찾기
  • SHA id 옆에있는 '기록에서이 시점에서 저장소 찾아보기'를 클릭하십시오.
  • 이 커밋에서 새 브랜치를 만들 수 있습니다. 여기에 이미지 설명을 입력하십시오

1
이것은 실제로 구식입니다
regetskcob

2
질문은 github에 관한 것이 아닙니다.
Anders Tornblad

8

간단히 실행하십시오 :

git checkout -b branch-name <commit>

예를 들면 다음과 같습니다.

git checkout -b import/january-2019 1d0fa4fa9ea961182114b63976482e634a8067b8

checkout매개 변수와 명령은 -b새로운 지점을 만듭니다 그것을 당신을 전환됩니다


1
나는 이것을 많이 좋아한다. 감사합니다
The Fool

풀 요청을 통해 삭제 된 기능 분기의 SHA 커밋을 기반으로 분기를 만들 수 있습니까? 또는 마스터에서 풀 요청 커밋에서 분기해야합니까?
user2966445

터미널을 사용하여 프로젝트 폴더에서 실행 git fetchgit branch명령을 수행 한 다음 기능 분기가 존재하는지 확인하십시오.이 경우 예라면 물론 삭제 된 분기에서 분기를 작성할 수 없습니다. 분기가 사라졌습니다
d1jhoni1b

4

큰 관련 질문은 다음과 같습니다. --helpgit 옵션을 사용하여 어떻게 이것을 알 수 있습니까? 이것을 시도하자 :

git branch --help

우리는이 출력을 본다 :

NAME
       git-branch - List, create, or delete branches    

SYNOPSIS
       git branch [--color[=<when>] | --no-color] [-r | -a]
               [--list] [-v [--abbrev=<length> | --no-abbrev]]
               [--column[=<options>] | --no-column]
               [(--merged | --no-merged | --contains) [<commit>]] [--sort=<key>]
               [--points-at <object>] [<pattern>...]
       git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]
       git branch (--set-upstream-to=<upstream> | -u <upstream>) [<branchname>]
       git branch --unset-upstream [<branchname>]
       git branch (-m | -M) [<oldbranch>] <newbranch>
       git branch (-d | -D) [-r] <branchname>...
       git branch --edit-description [<branchname>]

고 블덕

다음 텍스트에서 "commit"이라는 단어를 검색하십시오. 우리는 이것을 발견합니다 :

   <start-point>
       The new branch head will point to this commit. It may be given as a branch name, a
       commit-id, or a tag. If this option is omitted, the current HEAD will be used instead.

우리는 어딘가에 도착하고 있습니다!

이제이 고 블럭의 라인에 중점을 두십시오.

git branch [--set-upstream | --track | --no-track] [-l] [-f] <branchname> [<start-point>]

이것을 다음과 같이 고백하십시오.

git branch <branchname> [<start-point>]

그리고 끝났습니다.


1
나는 자식이 싫어. 감사.
바이런 휘트 락

4

Eclipse에서이를 수행하려면 다음을 수행하십시오.

  • "Git 리포지토리 탐색"관점으로 이동하십시오.
  • "태그"를 펼치고 브랜치를 작성할 커밋을 선택하십시오.
  • 커밋을 마우스 오른쪽 버튼으로 클릭하고 "브랜치 생성"을 선택하십시오.
  • 지점 이름을 제공하십시오.

그것은 당신을 위해 지역 지점을 만들 것입니다. 그런 다음 변경 사항을 푸시 할 때마다 지점이 원격 서버로 푸시됩니다.


3

Stash에서 할 수 있습니다.

  1. 커밋을 클릭하십시오
  2. 화면 오른쪽 상단에서 "Tag this commit"을 클릭하십시오.
  3. 그런 다음 방금 만든 태그에서 새 분기를 만들 수 있습니다.

이것은 어떤 GUI입니까? GitHub?
ostrichofevil

Atlassian Stash
David Ruan

3

나는 그렇게 할 수 있었다 :

git branch new_branch_name `git log -n 1 --skip 3 --format=%H`

건너 뛰기 값을 입력해야하는 위치 0은 최신, 1은 이전, 2는 그 이전의 커밋 등입니다.


4
HEAD~1(1은 1 커밋을 지정합니까) 사용하지 않습니까?
jduncanator

1
당신의 길은 선택된 답변으로 덮여 있으며 잘 작동합니다. 광산은 선택한 답변과 다른 방법입니다.
Mike Graf

3

하나의 명령으로 분기를 만듭니다.

git push origin <sha1-of-commit>:refs/heads/<branch-name>

나는 분기를 즉시 생성하기 때문에 (앞으로 추가 푸시 명령이 필요하지 않기 때문에) 위에 게시 된 것보다이 방법을 선호합니다.


3

소스 트리 사용 하기 | 가장 쉬운 방법입니다.

  • 먼저, 특정 커밋을 수행하려는 지점을 체크 아웃하여 새로운 지점을 만드십시오.
  • 그런 다음 도구 모음을보고 리포지토리> 분기를 선택합니다. 바로 가기는 Command + Shift + B입니다.
  • 그리고 원하는 특정 커밋을 선택하십시오. 그리고 새로운 지점 이름을 지정하고 지점을 만드십시오!

여기에 이미지 설명을 입력하십시오


마침내이 유용한 답변을 찾았습니다. 감사합니다
Firda Sahidi

1

이것이 내가 한 일입니다.

C:\Users\[path]\build>git checkout -b responsivenavigation 8a75b001096536b3216022484af3026aa9c7bb5b
Switched to a new branch 'responsivenavigation'

C:\Users\jaimemontoya\Dropbox\CuponClub\androidapp\build>git branch
  master
* responsivenavigation

이 경우, 지점에 8a75b001096536b3216022484af3026aa9c7bb5b속한 이전 커밋 master입니다.


1

자식 저장소의 특정 커밋으로 이동

때로는 git 저장소에서 작업 할 때 특정 커밋 (개정)으로 돌아가 특정 시간에 프로젝트의 스냅 샷을 만들려고합니다. 이를 위해서는 커밋의 SHA-1 해시가 필요합니다. 커밋의 SHA-1 해시는 다음 명령으로 로그를 쉽게 확인할 수 있습니다.

git log --abbrev-commit --pretty=oneline

모든 커밋과 짧은 버전의 SHA-1 해시에 대한 간단한 목록을 제공합니다.

이제 커밋의 해시를 알고 있으므로 다음 두 명령 중 하나를 사용할 수 있습니다.

git checkout HASH

또는

git reset --hard HASH

점검

git checkout <commit> <paths>

주어진 커밋에서 경로의 현재 상태를 현재 상태로 바꾸도록 git에 지시합니다. 경로는 파일 또는 디렉토리 일 수 있습니다.

분기가 제공되지 않으면 git은 HEAD 커밋을 가정합니다.

git checkout <path> // restores path from your last commit. It is a 'filesystem-undo'.

경로가 주어지지 않으면 git HEAD은 주어진 커밋으로 이동 합니다 (따라서 앉아 있고 작업중 인 커밋을 변경합니다).

git checkout branch //means switching branches.

초기화

git reset <commit> //re-sets the current pointer to the given commit.

지점에있는 경우 (보통 있어야 함) HEAD이 지점은 커밋으로 이동합니다.

분리 된 HEAD상태 인 경우 git reset 만 이동 HEAD합니다. 지점을 재설정하려면 먼저 확인하십시오.

git reset과 git checkout의 차이점에 대해 더 알고 싶다면 공식 git 블로그 를 읽는 것이 좋습니다 .


2
귀하의 답변에 감사드립니다. 참고 : 이것은 : git log --abbrev-commit --pretty=oneline 약자git log --oneline
Suhaib

0

커밋 선택

Git GUI 사용자의 경우 모든 히스토리를 시각화 한 다음 (필요한 경우) 분기하려는 커밋을 마우스 오른쪽 단추로 클릭하고 분기 이름을 입력하십시오.

지점 이름 입력

모든 역사를 시각화


이것은 사용자가 Windows 및 MAC과 같은 UI 기반 OS를 사용하는 경우에만 작동합니다.
Saurabhcdt

맞습니다. 내 대답은 특히 "Git GUI 사용자의 경우 ..."라는 단어로 시작합니다. 나는 모든 사람들에게 효과가있는 답장을주지 않았다. 많은 사람들이 쉽게 사용할 수있는 대체 방법을 제공했습니다. 내 답변이 마음에 들지 않는 이유는 모든 사람을위한 해결책이 아니라 이미 수천 개의 공감대가 존재하기 때문이라고 생각합니다. 그러나 이것이 "Git GUI 사용자의 경우!"라는 잘못된 답을 만들지는 않습니다. GUI에 새 지점 만들기가 있습니다. 나는 내가 그것을 사용하는 세계에서 유일한 사람이라고 의심한다!
Ivan

0

Visual Studio 2015 및 2017에서 허용되는 답변을 수행하려면

변경 클릭

변경 클릭 (위의 빨간색 화살표)

작업을 클릭하여 기록을 봅니다.

동작 (위의 빨간색 화살표)을 클릭하고 드롭 다운 메뉴에서 기록보기를 클릭하십시오.

그리고 새로운 탭이 열립니다 :

히스토리 탭

코드를 되돌릴 이전 커밋을 마우스 오른쪽 버튼으로 클릭해야합니다. 이전 커밋을 마우스 오른쪽 버튼으로 클릭하십시오.

새로운 지점을 체크 아웃하고 선택하십시오!

아래는 OP 질문의 일부는 아니지만 많은 것을 수행 하며이 방법은 적어도 나에게 속임수입니다. 새로운 분기를 체크 아웃하지 않고 이전 커밋으로 되돌리려면 revert (! )); redefine --mixed 또는 --hard를 선택해야합니다.

이전 커밋을 마우스 오른쪽 버튼으로 클릭하고 재정의


우리 대부분은 영어 이외의 다른 언어를 말하거나 알지 못하므로 답을 영어로 공유하십시오.
Shamiul Hasan Rumman

@ShamiulHasanRumman, 이미지를 설명하는 텍스트에서-일반적으로 아래-빨간색 화살표가 가리키는 용어를 영어로 번역했습니다. 클릭 동작 (위의 빨간색 화살표)으로 는 충분하지 않습니까?
Marcelo Scofano

@MarceloScofano, 스크린 샷을 찍기 전에 영어로 편집기를 전환하는 것이 어려웠습니까?
앤드류 Surdu

1
@AndreiSurdu : 그렇게 할 필요가 없었기 때문에 영어로 변경하려면 추가 패키지를 설치해야한다고 기대했습니다. 그러나 당신은 옳습니다 .VS 재시작 만 필요하며 전혀 설치하지 않아도됩니다. 여유 시간이 되 자마자 위의 이미지를 변경하려고합니다.
Marcelo Scofano

0

아주 간단한 소스 트리를 사용한다면

  • 새 브랜치를 생성해야 할 곳에서 커밋을 마우스 오른쪽 버튼으로 클릭하십시오.
  • '지점'을 클릭하십시오
  • 대화 상자에 새 지점의 이름을 입력하고 '분기 만들기'를 클릭하십시오.

0

명령 줄 기반 솔루션을 찾고 있다면 내 대답을 무시해도됩니다. GitKraken 을 사용하는 것이 좋습니다 . 특별한 자식 UI 클라이언트입니다. 홈페이지에 Git 트리가 표시됩니다. 당신은 그들을보고 프로젝트에 무슨 일이 일어나고 있는지 알 수 있습니다. 특정 커밋을 선택하고 마우스 오른쪽 버튼으로 클릭하고 '여기서 분기 만들기'옵션을 선택하십시오. 지점 이름을 입력 할 수있는 텍스트 상자가 나타납니다. 지점 이름을 입력하고 '확인'을 선택하면 설정됩니다. 정말 사용하기 쉽습니다.

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