2013-07-16 6 views
2

을 당겨 : 나는에 원격 지점에서 코드를 당겨 후 git pull을하기 전에 나는 상태로 내 코드를 재설정 할 수 있습니다취소 자식 풀은 한마디로

신선한 자식 저장소?

긴 이야기 :

내가 스크립트를 포함하는 두 개의 폴더를 가지고는 한 폴더를 다른 폴더 안에 파일의 다른 버전을 나타냅니다. 버전 관리를 적용하려면 먼저 다른 폴더에 비해 수정 버전이 적은 폴더가있는 gitub에 git 저장소를 만들고 두 폴더를 나타내는 동일한 내용의 분기를 만듭니다.

원격 브랜치의 최신 버전을 가지고 폴더를 동기화하려면, 나는 그 폴더에 다음을 수행하십시오

git init 
git remote add origin [GITHUB_REPO] 
git pull origin [BRANCH_NAME]:[BRANCH_NAME] 
git add . 
git commit -m "Latest revision." 

내가 여러 번하기 전에 워크 플로우를 테스트하고 나중에 내가있을 때까지 아무것도처럼 보인다 잘못했다 git add . 전에 을 실행하고 수정 사항이 표시되지 않았다는 것을 알게되면, 새로운 untracked 파일 만 표시됩니다. 이는 이상합니다.

git pull을 수행하기 전에 상태를 되돌릴 필요가 있습니다. 왜냐하면 일부 파일이 원격으로 덮어 쓰여졌 음을 알았으므로 pull이 첫 번째 작업이고 그 전에 커밋이 없기 때문에 아무 것도 재설정 할 수 없습니다. pull 전. 그것은 마지막 커밋 취소 및 덮어 쓰기 파일

git reset [email protected]{1} 

그리고이 방법으로 문제가 해결되지 않습니다

edbfd0d [email protected]{0}: commit: Import code from development environment. 
da39602 [email protected]{1}: checkout: moving from master to development 

내가 무슨 짓을하는 것은 :

git reflog show의 결과입니다 git pull에서 여전히 돌아 오지 않습니다. 도움이된다면 서버의 자식 버전은 1.7.1이고 내 로컬 컴퓨터는 1.8.2.1입니다. 그들이 다르게 행동하게 된 것은 놀라운 일이 아닙니다.

-

은 추가 연구 후에, 나는 서버에서 git pull의 행동이 내 로컬 개발 컴퓨터에서 다른 것으로 나타났습니다. 서버 내에서는 git pull이 자동으로 병합되는 것처럼 보이지만 로컬 개발에서는 병합시 덮어 쓸 수있는 파일이 있다는 것을 알려줍니다.

이렇게하면 서버의 파일은 추적 할 수없는 파일이있는 기존 파일의 덜 수정 된 버전 git pull을 자동으로 사용하지만 로컬 개발에서는 수정 된 파일을 추가하고 업데이트 된 버전을 사용할 수 있습니다.

+0

이 상태에서'git reflog'는 어떻게 생겼습니까? – Christopher

+0

'edbfd0d HEAD @ {0} : commit : ...'과'da39602 HEAD @ {1} : checkout : ... '두 줄만 출력합니다. –

+0

정확히 무슨 문제입니까? "파일을 실행하고 오류가 발생하기 전에는 아무 문제가없는 것 같습니다." 정확하게 당신은 무엇을 달리고, 어떤 오류가 있습니까? 질문을 편집하십시오. – sleske

답변

4

git pull에 따라 두 가지 시나리오가 있습니다. git pull의 병합 단계가 빨리 감기 병합 결과 경우, 즉시 git pull 후, 당신은이 작업을 수행 할 수 있습니다

git reset --hard [email protected]{1} 

이를 실행하기 전에 즉시 어디에 다시 HEAD와 브랜치 포인터를 재설정합니다 git pull. git pull 이후 다른 작업을 수행 한 경우 git reflog HEAD을 실행하고 다시 설정하려는 항목을 결정해야 할 수 있습니다.

git pull은 빨리 감기가 불가능했기 때문에 또는 머기가 빠른 병합을 요청했기 때문에 새로운 병합 커밋을 만든 경우 위의 명령이 계속 작동합니다. 당신이 확인해야 할 수 있습니다, 당신이 사이에 다른 물건을 수행 한 경우,하지만 다시

git reset --hard HEAD^1 

: 그러나이 경우, 당신은 또한 바로이 명령으로 커밋 다시 현재의 첫 번째 부모를 재설정 할 수 귀하의 reflog를 사용하고 첫 번째 명령 대신 1 이외의 숫자를 사용하십시오 ...

+0

문제는 'git pull'이후에 내가하는 일이 아니라 그 전에하는 일입니다. 문제를 일으키는 원인이되기 전에 나는 아무것도하지 않는다는 사실. –

+0

여기에 쓰여진 내용은 정확하지만 OP는 도움이되지 않습니다. 문제는 더러운 트리에서'git pull '을했다는 것입니다 (커밋을하지 않고 비어 있지 않은 디렉토리에서'git init'을 주목하십시오). 병합이 untracked 파일을 덮어 썼거나 변경했다면,'reset' 또는 유사한 것으로 돌아갈 커밋이 없습니다. – sleske

1

I do the following in that folder:

git init 
git remote add origin [GITHUB_REPO] 
git pull origin [BRANCH_NAME]:[BRANCH_NAME 

사실, 그건 좋은 생각이 아닙니다. git의 중요한 규칙 중 하나는 은 "더티"작업 트리 (즉, 체크인되지 않은 파일)을 사용하여 복잡한 작업을 수행해서는 안된다는 것입니다.

이 경우 파일이있는 디렉토리에 repo를 만들었지 만 파일을 커밋하지 않았습니다. 따라서 파일은 자식에게는 알려지지 않으므로 git status에 "untracked"로 표시됩니다. 이제 git pull은 자동으로 병합을 시도하고 더러운 트리와 병합하는 것은 문제가 있습니다. git은 데이터를 덮어 쓰지 않으려하지만, 원하는대로 병합이 실행되지 않으면 이전 버전의 파일이 커밋되지 않았기 때문에 일부 변경 사항을 실행 취소 할 수있는 쉬운 방법이 없습니다.

그래서 더 좋은 방법은 먼저/원격 추가 초기화/ 디렉토리에 당기 (또는 복제 원격 REPO)을 수행하는 것입니다 : 당신의 깨끗한 사본을 제공

git clone [GITHUBREPO] 
git checkout BRANCH_NAME # note: This will create a local branch from the remote 

원격 지점. 당신이 다시 한 번 그 시점에서

git add . 
git commit -m "Files from folder2" 

:

rm oldfiles; cp -a ../folder2/* . # or similar 

이 그럼 당신은이 모든 커밋 : 그런 다음 분기의 의도 된 새로운 상태를 만들려면 최신 버전으로 폴더에서 파일을 복사 깨끗한 작업 트리가 있습니다. 이제 데이터 손실의 두려움없이 다른 분기와 병합하거나 변경 사항을 적용하거나 분기를 병합 할 수 있습니다. 일이 잘못되면 항상 이전 커밋으로 돌아갈 수 있습니다.

참고 :

The problem is my files gets overwritten with remote branch, and I can't undo to a state before I pull, because that's the first action

일반적으로 발생해서는 안된다. git pull이 커밋되지 않은 로컬 파일과 충돌하는 경우 (git pull) 오류가 발생하여 중단되어야합니다. 이처럼 :

가, 어쩌면 자식이 충돌을 무시하도록 구성되어 있지 않은 경우
error: Untracked working tree file 'myFile' would be overwritten by merge. 

(이, 내가 믿는, 수없는 기본하지만). 어쨌든, 더러운 작업 트리와 병합하지 않으면 문제가되지 않습니다.

+0

예, 그 오류 : "오류 : Untracked working tree file ..."이 서버에 나타나지 않았습니다. 그래서 수정 된 파일이 보이지 않고 새로운 untracked 파일 만 있다는 것을 깨닫기 전까지 아무 문제가 없다고 생각한 것입니다. –