2012-04-17 3 views
23

나는 자식 저장소 인 프로젝트를 서비스하는 웹 서버를 가지고있다. 코드에 몇 가지 변경을 가하면 서버에서 git pull을 수행합니다. 때로는 새로운 코드가 충돌하기도하고, 직전의 최신 코드로 롤백 할 수 있기를 원합니다. 나는 최신의 sha가 무엇인지를 검색 할 필요없이 스크립트로 그렇게하고 싶습니다. 어떻게해야합니까?힘내 상태 롤백 1 당기기

편집 : 그냥 명확히하기 위해 버튼 하나를 누르는 것만 큼 좋을뿐입니다. "이 최신 끌어 오기는 실수였습니다. 나는 그 일을하지 않았 으면 좋겠다"라고 말했습니다. 나는이 상황에서 sha 나 태그 또는 다른 것을 찾아야하는 것을 원하지 않는다. 그것은 마치 '되돌리기'기능과 같다. 그런 다음 코드 작업을 계속할 수 있기를 원하며 서버의 다음 단계는 최신 변경 사항을 가져와야합니다.

답변

52

git reset --hard HEAD^1 당신이 뽑은 것에서 커밋을 되 찾을 것입니다. 당기기 전의 상태로 되돌리려면 git reset --hard [email protected]{1}을 사용하십시오. @{1}은 로컬 repo에서 마지막 작업 이전에 헤드가 있던 위치를 추적하므로 사용자가 당기기 전에 여러 개를 푸시하면 몇 가지 커밋으로 돌아갑니다. 전체 목록을 보려면 git reflog을 참조하십시오.

+1

매우 흥미 롭습니다. 그렇다면 어떻게 정상 작동으로 돌아갈 수 있습니까? 내 말은, 나쁜 코드에 대한 수정을하면 서버에 가서 최신 변경 사항을 얻기 위해 다시 잡아 당길 수 있습니까? – Bastian

+3

예. 당신이 뽑은 적이없는 상태입니다. 그래서 평상시처럼 할 수있는 일은 모두 할 수 있습니다. –

2

git reset HEAD^ 이전 커밋으로 이동해야합니다. 자세한 내용은 here을 참조하십시오.

+0

실행합니다. –

+0

새로운 pull이 문제를 일으킨 후에 repo가 ​​롤백해야하는 질문에 따르면 작업 디렉토리는 비어 있어야합니다. –

0

이렇게하는 또 다른 방법은 태그를 사용하는 것입니다. 당신이 끌어 오기 전에 몇 가지 버전 번호로 당신의 HEAD에 태그를 붙일 수 있다고 생각하면 끌어 당기십시오. 다시 HEAD를 굴릴 필요가 있다면 git reset {tag name} 그런 식으로 끌어 넣기가 여러개있는 경우 건너 뛸 수 있습니다. 병합하기 전에

2

실패 또는 성공시 쉽게 제거하거나 병합 할 수있는 분기를 사용하는 것이 좋습니다. 이렇게하면 새로운 내용을 추적하고 "마지막 커밋 만 제거"(특히 스크립트를 사용하여 수행하기 때문에)보다 복잡한 경우가 있으면 더 깨끗하게 정리할 수 있습니다. 그래서 서버 :

git fetch --all   # fetch new commits from remote 
git checkout -b testing # create and switch to branch 'testing' 
git merge origin/master # merge new commits from remote branch master 
          # (in branch 'testing') 

... 다음 테스트 물건 ... 성공하는 경우 :

git checkout master  # switch back to master 
git merge testing 

실패시 :

git checkout master 
git branch -D testing  # remove testing branch 

어쨌든 ... 그것은 당신의 유일한 요점은 마지막 커밋을 제거하는 것이며, 조쉬가 지적한대로 git reset을 사용할 수 있습니다.

+0

여기에 좋은 점은 내가 생각하고있는 것이 아니고 잘 작동 할 수 있다는 것입니다. 나는 가장 간단한 방법을 시도해 보겠습니다. – Bastian

1

@Karl Bielefeldt의 대답이 정확하지 않았습니다. GIT 버전 2.10.0.windows.1을 사용하고 있습니다. 이전 버전에서는이 기능을 사용할 수 있습니다. "알 수없는 스위치 'e'오류가 발생합니다. 마지막으로 몇 가지 변경 작업을 수행했습니다. 칼이 언급 한 바와 같이

  1. 사용 git reflog 목록을 볼 수 :

    다음은 이전의 풀 이전 상태로 복귀하는 단계입니다.

  2. 뒤로 이동할 목록에서 커밋 버전을 선택하십시오.
  3. 당신이 당신의 작업 디렉토리를 터치하지 않는 한 그것은 실제로 '자식이, --hard HEAD ^을`다시 것 git reset --hard <commit version>