2012-03-15 3 views
1

좋습니다. 그래서 여기 이야기가 있습니다. 우리는 20-30k 줄의 코드를 가진 git 저장소를 가지고 있습니다. 내 직장 동료가 다른 모듈을 만들기 위해 일부 파일을 repo에 복사 (복사, 이동하지 않음)했습니다. 이 파일의 내용은 약간 수정되었습니다. 그런 다음 그는 커밋을했다. 그 동안 나는 그가 복사 한 파일 중 일부 (원본)를 작업하고 내 작업을 커밋했다. 내가 당기고있을 때 나는 그가 가지고있는 파일에서 충돌을 발견했다. 갈등을 해결 한 후 로컬 레포를 확인했는데 가지고있는 파일 중 절반이 없습니다. git은 파일 이름이 아닌 파일의 내용을 추적하지만, 지금은별로 도움이되지 않습니다. Git repo에서 유사한 파일 중 하나가 복사 후 사라졌습니다.

git log remote_repo --stat --diff-filter=D 

는 몇 개의 파일이 삭제 된 것을 보여주고,

git log remote_repo --stat -C --diff-filter=D 

적은 파일이 삭제 된 (하지만 여전히 일부)

우리는 우리가 무엇을해야하는 파일의 두 복사본이 필요하다는 것을 보여줍니다?

답변

1

리베이스 (rebase)를하고 충돌을 다시 해결해야합니다. 이것은 단순하거나 약간 더 복잡 할 수 있습니다. 단순한 경우 병합을 리베이스하고 삭제 된 파일을 수정하지 않아도됩니다. 이것을 시도하십시오 :

git rebase -i HEAD~1 

각 커밋에 무엇을하고 싶은지 묻는 화면이 나타납니다. 편집, 저장하고 편집기를 종료

pick bb009b7 merge commit 

# Rebase 9775146..bb009b7 onto 9775146 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

변경 선택 : 뭔가 같은 것입니다. 이제 병합 커밋으로 돌아 왔습니다. 실행 :

git checkout <id of the previous commit> <filename> 
git commit --amend 
git rebase --continue 

해결해야합니다. 그렇지 않은 경우 더 이상 뒤로 가야하며 더 복잡 할 수도 있습니다.

나는 이런 식으로 뭔가를 갈 것이라고 생각합니다 : 당신은 각 커밋에 수행 할 작업을 묻는 화면이 나타납니다

# rebase the last three commits, assuming: 
# the oldest is your most recent changes 
# the next is your co-worker's 
# the last is the merge 
# You can probably go back only two but I generally 
# go back one extra just to see that things are as I 
# expect. 

git rebase -i HEAD~3 

. 그대로

pick 8d25cf0 Your changes 
pick e9ddd29 His changes 
pick bb009b7 merge 

# Rebase 9775146..bb009b7 onto 9775146 
# 
# Commands: 
# p, pick = use commit 
# r, reword = use commit, but edit the commit message 
# e, edit = use commit, but stop for amending 
# s, squash = use commit, but meld into previous commit 
# f, fixup = like "squash", but discard this commit's log message 
# 
# If you remove a line here THAT COMMIT WILL BE LOST. 
# However, if you remove everything, the rebase will be aborted. 
# 

이 첫 번째 줄을 남겨 : 그것은 무언가 같이 될 것입니다. 두 번째 선택을 수정하여 편집하십시오. 마지막으로 편집하고 싶다고 생각합니다.

이것을 쓰고 저장하면 rebase가 시작됩니다. 첫 번째 커밋을 통해 실행되고 두 번째 커밋에서 중단됩니다. 파일이 누락되었습니다. 이제 다음을 실행하고 싶습니다.

git checkout <id of the previous commit> <filename> 

그러면 동료가 삭제 한 파일이 복원됩니다.

는 다음과 같이 실행 :

git commit --amend 
git rebase --continue 

그냥 예상대로 일이 있는지 확인하십시오 커밋 병합에 도착하면. 파일이 누락 된 경우 다시 체크 아웃하십시오. 그런 다음 수정하고 계속하십시오. 이제는 필요한 모든 것을 갖추어야합니다.

당신이 일이 어떤 점

git rebase --abort 

에서 잘못 가고있다 생각한다면 이것은 당신이 시작한 곳으로 다시 넣을 것입니다 당신이 다시 시도 할 수 있습니다.

+0

그래서 내가 말하려는 것은 리베이스 (repase)하고 원격 리포 (repo)를 강요하고 관련된 모든 사람들에게이 브랜치를 버리고 다시 가져올 필요가 있다는 것입니다. –

+0

파일이없는 히스토리에 커밋을하는 것이 문제가 아니라면 현재 커밋에서'git checkout '을 시도해 볼 수 있습니다. – Ilion

+0

나는 그 파일들의 역사를 가지고 싶기 때문에 일을 시작하자마자 rebase를 먼저 시도 할 것이다. –

관련 문제