Git과 명령 줄을 사용하여 병합하는 동안 로컬 파일이나 원격 파일을 유지하는 방법은 무엇입니까?


195

vimdiff를 사용하여 수정을 병합하는 방법을 알고 있지만 전체 파일을 보관하거나 버리는 것이 좋다고 가정하면 어떻게해야합니까?

나는 그들 각각에 대해 vimdiff를 열고 싶지 않다. 나는 '로컬 유지'또는 '원격 유지'라는 명령을 원한다.

EG : 누군가가 Windows에서 파일을 열고 EOL을 변경 한 후 커밋했기 때문에 변경된 것으로 표시된 파일과 병합되었습니다. 병합 할 때, 나는 내 자신의 버전을 유지하고 버리고 싶습니다.

나는 또한 그 반대에 관심이있다 : 나는 큰 시간을 망치고 원격 파일을 받아들이고 변경 사항을 버리고 싶다.

답변:


310

당신은뿐만 아니라 할 수 있습니다 :

git checkout --theirs /path/to/file

원격 파일을 유지하려면 다음을 수행하십시오.

git checkout --ours /path/to/file

로컬 파일을 유지합니다.

그런 다음 git add그들과 모든 것이 완료됩니다.

판 : 이것은 merge시나리오를 위한 것임을 명심하십시오 . 작업 중 rebase --theirs은 지점을 말합니다.


4
나는 이것을했다. 그러나 아무 일도 일어나지 않는다. 그것이 올바른 파일을 가지고 있다는 것을 어떻게 알 수 있는가? git version 1.8.4중요한 경우 사용 하고 있습니다.
Rosdi Kasim

3
왜 역어가 사용됩니까? 나는 "그들"이 원격 파일이고 "우리의"파일이 내 파일이라고 가정합니다
phuclv


7
아니, 그 의미는 반대이다 stackoverflow.com/q/2959443/995714의 stackoverflow.com/q/29324812/995714 그들의 내 파일과 우리의 것 원격 지점에있는 파일입니다
phuclv

6
"쉬운", 그렇습니다. 직관적입니까? 호
윌버 Whateley

109

이 방법은 각 파일을 개별적으로 선택할 필요없이보다 간단 해 보입니다.

# keep remote files
git merge --strategy-option theirs
# keep local files
git merge --strategy-option ours

또는

# keep remote files
git pull -Xtheirs
# keep local files
git pull -Xours

직접 복사 : 당기는 동안 변경 사항에 따라 Git 병합 충돌 해결


3
이것을 사랑하십시오. 특히 파일이 둘 이상인 경우.
Tek

문제는 두 가지 다른 명령에 대한 것이지만이 두 가지에 대한 설명은 없습니다. 각 라인은 무엇을합니까?
Alex

나는 이것을 찾기 전에 적어도 5 개의 stackoverflow 답변을 겪었으며, 이것이 내가 원하는 것입니다. 감사.
Bolton Bailey

14

git checkout {branch-name} -- {file-name}

선택한 지점에서 파일을 사용합니다.

posh-git자동 완성 기능이 훌륭하게 작동 하기 때문에 이것을 좋아 합니다. 또한 어느 브랜치가 원격이고 어느 브랜치인지에 대한 모호성을 제거합니다. 그리고 --theirs어쨌든 나를 위해 작동하지 않았다.


모호함이 없으며 {mine} 및 {theirs} 모두에서 작동하며 전체 디렉토리 추가를 지원합니다. 이것이 정답입니다.
dotancohen

9

라인 엔드 문제는 다음을 참조하십시오 man git-merge.

--ignore-space-change 
--ignore-all-space 
--ignore-space-at-eol

Windows 클론 (.git / config) 을 추가 autocrlf = false하거나 추가하십시오.safecrlf = false

git mergetool 사용

다음과 같이 mergetool을 구성하는 경우 :

git config mergetool.cp.cmd '/bin/cp -v "$REMOTE" "$MERGED"'
git config mergetool.cp.trustExitCode true

그런 다음 간단한

git mergetool --tool=cp
git mergetool --tool=cp -- paths/to/files.txt
git mergetool --tool=cp -y -- paths/to/files.txt # without prompting

일을 할 것인가

간단한 자식 명령 사용

다른 경우에는

git checkout HEAD -- path/to/myfile.txt

트릭을해야합니다

망 쳤기 때문에 반대 방향으로 편집하십시오 .

git checkout remote/branch_to_merge -- path/to/myfile.txt

팁은 +1이지만 허용되지는 않지만 요청한 내용이 아닙니다. 예제 사례뿐만 아니라 모든 사례에서 작동하는 것을 원합니다. 또한 병합을 이미 시작한 경우 "git checkout remote / branch_to_merge-path / to / myfile.txt"가 작동하지 않습니다. 병합 중에 있다고 말하면 병합하지 못하게됩니다.
전자 Satis

1
@ e-satis : 놀랍습니다. 경로가있는 체크 아웃이 정기적 인 체크 아웃이 아니기 때문에 버그가 있다고 생각합니다 (HEAD에는 영향을 미치지 않습니다). 믿을 수 없어서 지금 시험해
볼게요

1
@ e-satis : Soooo ... 나는 옳았다; git checkout remote/branch_to_merge -- path/to/myfile.txt병합 충돌을 해결하는 동안 매력처럼 작동합니다. (git 1.7.1)
sehe

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