git-로컬이 삭제되었지만 파일이 원격에있을 때 병합 충돌


116

나는 git을 처음 접했고 로컬 저장소에서 마스터 브랜치에서 여러 파일을 삭제했지만 이러한 파일은 원격 마스터 브랜치 내에 존재하는 병합에 대해 어떻게해야할지 궁금했습니다.

git-merge를 수행 한 후 발생한 충돌을 표시합니다.

git gui를 사용하면 로컬 파일이 삭제되고 원격 브랜치 파일에는 내용이 있음을 보여줍니다.

이러한 파일이 충돌하는 것을 어떻게 막을 수 있습니까? git gui를 사용하는 간단한 방법이 있습니까?

많은 감사


과거에 제가 한 한 가지는 "삭제 된"파일을 소스 제어에 남겨두고 프로젝트 / 메이크 파일 / 무엇이든 제외하는 것입니다. 적어도 병합 충돌에 대한 괜찮은 임시 해결 방법입니다.
Mark Rushakoff 2010

2
병합 충돌을 수정하는 것과 동일한 방식으로 수정합니다. 원하는 버전 (파일 또는 파일 부족)을 색인에 추가 한 다음 커밋합니다. 어느 것을 원하십니까?
Cascabel


@MarkRushakoff 나는 당신의 충고를 "내가 갈등을 해결해야하는 상황에 처했을 때 나는 단순히 그것들을 진짜로 해결하지 않고 그들을 가려서 미래에 누군가 (아마도 내가 아님)를 물기 때문에"라고 당신의 충고를 다시 표현할 것입니다. 이것은 프로젝트에 더 많은 문제를 가져오고 자하는 사람에게 정말 좋은 조언입니다.
Victor Yarema

답변:


155

적절하다고 판단되면 충돌을 해결해야합니다. 파일이 실제로 제거되어야하고 원본에 해당 변경 사항을 게시 할 경우 다시 제거합니다.

git rm path/to/file

파일이 실제로 추적되어야하는 경우 추가합니다 (작업 트리의 버전은 원본의 버전입니다).

git add path/to/file

둘 중 하나를 수행하여 충돌을 해결 한 후 병합을 커밋합니다.


동일한 디렉토리에 모두 동일한 접미사를 가진 여러 파일이 있습니다. 디렉토리의 나머지 파일을 보존하면서 한 번에 모두 제거하는 바로 가기가 있습니까?
chiborg

@chiborg : 그것은 단지 쉘 질문입니다. cd디렉토리 및 git rm *.ext. 귀하의 (안 힘내) 확장 *.ext일치하는 모든 파일 이름에.
Cascabel

일부 파일을 보존하려면? 플래그 git rm가 없습니다 -i.
chiborg

@chiborg : 당신은 주어진 접미사를 가진 모든 것을 제거하고 나머지는 그대로두고 싶다고 말했습니다. 그게 바로 내가 당신에게 어떻게해야한다고 말한 것입니다. 아니면 그 뜻 git rm *-suffix.ext입니까? 같은 차이. 쉘 와일드 카드 사용 방법을 찾는 데 문제가있는 경우 unix.stackexchange.com에서 문의하십시오. 당신이 원하는 것을 globbing으로 할 수 없다는 사실을 알고 있다면 , 삭제를 선택하기 위해 사용 rm -i하고 따르십시오 git add -u.
Cascabel

2
내가 지정하고있어 경우 @Jefromi, -s recursive -X ours왜 그것은에 필요한 여전히 git rm하고 git add?
Noel Yap 2013 년

27

수락 된 답변에 추가 된 팁으로 "deleted by us" 에서 삭제 된 파일에 적용된 변경 사항을보고 싶은 경우 해당 변경 사항을 다른 곳에 적용 할 수 있습니다.

git diff ...origin/master -- path/to/file

그것이 경우 "그들에 의해 삭제" 시나리오, 당신은 당신이 다른 곳에서 적용 할 수 있도록 변경 사항을보고 싶다, 당신은 사용할 수 있습니다 :

git diff origin/master... -- path/to/file

6
예! 파일의 이름이 방금 변경되었거나 파일이 삭제되기 전에 내용이 이동 된 경우와 같이 병합하려는 변경 사항을 날려 버리고 싶지 않은 경우 중요합니다.
Edward Anderson

8
참고 : 리베이스 중에 충돌이 발생하면 작동하지 않습니다 . 필요 같은 명시합니다git diff mybranch@{1}...origin/master -- path/to/file
nschum

@nschum 감사합니다! 이것이 바로 제가 찾던 것입니다.
Chuim

2
사용할 수도 있습니다 git diff --base(다른 답변 참조).
Dorian Marchal

안녕하세요 Joseph,이 답변이 유망 해 보이지만 여전히 갇혀 있습니다. 잠시 시간이 있으시면 여기에서 답변 해 주시면 감사 하겠습니다. stackoverflow.com/q/63044843/470749 감사합니다!
Ryan

9

Git GUI에서 충돌 된 파일을 선택한 다음 충돌 된 텍스트가 표시되는 기본 텍스트 영역을 마우스 오른쪽 버튼으로 클릭합니다.

나타나는 컨텍스트 메뉴에서 "원격"으로 이동하거나 "로컬"로 이동하도록 선택할 수 있습니다. 따라서 파일이 원격으로 삭제 된 경우 "원격"을 선택하여 삭제를 로컬로 전파 할 수 있으며 그 반대의 경우도 마찬가지입니다.

그것을 알아내는 데 한 달이 걸렸습니다 ... Git GUI에 실제로 문서가 있으면 좋을 것입니다 ...


4

가장 높은 평가를받은 답변은 갈등을 해결하는 방법에 중점을 둡니다.

그 전에 로컬로 제거 된 파일에서 원격이 변경된 내용을 알고 싶을 것입니다.

이를 위해 다음을 사용하여 변경 사항을 볼 수 있습니다.

git diff --base

에서 https://git-scm.com/docs/git-diff#Documentation/git-diff.txt--1--base

작업 트리를 "기본"버전 ​​[...]과 비교하십시오. 색인에는 병합되지 않은 항목, 즉 충돌을 해결하는 동안 만 이러한 단계가 포함됩니다.


다음은 git diff --base stackoverflow.com/a/60484874/470749
Ryan

0

EGit에서도 문제를 발견했습니다. 내 솔루션은 다음과 같습니다.

  • Git 스테이징보기를 사용했습니다.
  • 비교기를 열기 위해 단계 화되지 않은 변경 사항에 표시된 각 파일을 두 번 클릭
  • "왼쪽에서 오른쪽으로 모두 복사"아이콘을 클릭합니다.
  • 파일 저장 (무단계 목록에서 사라짐)

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