programing

커밋을 병합하지 않고 변경 사항을 단일 파일로 병합하려면 어떻게 해야 합니까?

powerit 2023. 5. 23. 22:31
반응형

커밋을 병합하지 않고 변경 사항을 단일 파일로 병합하려면 어떻게 해야 합니까?

저는 두 개의 지점(A와 B)이 있는데, A 지점의 단일 파일을 B 지점의 해당 단일 파일과 병합하고 싶습니다.

저도 같은 문제를 발견했습니다., 저는 두 의 지점을 있습니다.A그리고.B동일한 파일이지만 일부 파일에서는 다른 프로그래밍 인터페이스를 사용합니다. 파일의 는 다음과 같습니다.f두 분기의 인터페이스 차이와 무관하게 분기에서 변경되었습니다.B하지만 그 변화는 두 지점 모두에 중요합니다.따라서 파일만 병합해야 합니다.f의 지점의B 종로로f의 지점의A.

사항이 두 명령으로 되었습니다.A그리고.B:

git checkout A

git checkout --patch B f

번째 는 분기 " 번명은령전환니다됩분로기첫째▁the"로 됩니다.A내가 합병하고 싶은 곳으로B의 파일 의일버f " 번째명은파패치니다합을일두령▁the다▁file니▁the패"를 패치합니다.f와 함께fHEADB패치의 단일 부분을 승인/폐기할 수도 있습니다.에 에.B커밋을 할 수 . 이 "" ""일 는 없습니다. 반드시 커밋을 지정할 필요는 없습니다.HEAD.

커뮤니티 편집:파일이fB에 .A하지만, 그런 다음 생략합니다.--patch선택. 않으면 그렇지 않으면 "변경 없음" 메시지가 표시됩니다.

이것은 git의 내부 diff 툴을 사용합니다.아마 할 일이 조금 있지만 직접적으로 해야 할 것 같습니다.

#First checkout the branch you want to merge into
git checkout <branch_to_merge_into>
    
#Then checkout the file from the branch you want to merge from
git checkout <branch_to_merge_from> -- <file> 
    
#Then you have to unstage that file to be able to use difftool
git reset HEAD <file> 

#Now use difftool to chose which lines to keep. Click on the mergebutton in difftool
git difftool

#Save the file in difftool and you should be done.

이런 상황에서 제가 하는 일은 이렇습니다.그것은 둔탁하지만 나에게 딱 맞습니다.

  1. 작업 분기를 기반으로 다른 분기를 만듭니다.
  2. git pull/git merge 복사할 파일이 포함된 개정판(SHA1)을 선택합니다.이렇게 하면 모든 변경 사항이 병합되지만 이 분기를 사용하여 하나의 파일만 가져올 수 있습니다.
  3. 충돌 등을 해결하고 파일을 조사합니다.
  4. 당신의 일하는 지점을 확인하세요.
  5. 병합에서 커밋된 파일을 확인합니다.
  6. 커밋합니다.

저는 패치를 시도했지만 제 상황은 그것에 비해 너무 추악했습니다.간단히 말하면 다음과 같습니다.

작업 분기: A 실험 분기: B (파일 포함)접고 싶은 변경 사항이 있는 txt.)

git checkout A

A을(를) 기준으로 새 분기 생성:

git checkout -b tempAB

B를 임시로 병합AB

git merge B

병합의 sha1 해시를 복사합니다.

git log

commit 8dad944210dfb901695975886737dc35614fa94e
Merge: ea3aec1 0f76e61
Author: matthewe <matthewe@matthewe.com>
Date:   Wed Oct 3 15:13:24 2012 -0700

Merge branch 'B' into tempAB

작업 중인 지점을 확인합니다.

git checkout A

복구된 파일을 확인합니다.

git checkout 7e65b5a52e5f8b1979d75dffbbe4f7ee7dad5017 file.txt

그리고 거기서 당신은 그것을 가져야 합니다.결과를 커밋합니다.

저는 이 접근법이 간단하고 유용하다고 생각했습니다.다른 분기에서 특정 파일을 "병합"하는 방법

알고 보니, 우리는 너무 열심히 노력하고 있습니다.우리의 좋은 친구 git checkout은 그 일에 적합한 도구입니다.

git checkout source_branch <paths>...

우리는 단순히 Git Checkout에 기능 분기 A의 이름과 마스터 분기에 추가하고자 하는 특정 파일의 경로를 제공할 수 있습니다.

더 많은 이해를 위해 전체 기사를 읽으십시오.

다음을 사용할 수 있습니다.

git merge-file

팁: https://www.kernel.org/pub/software/scm/git/docs/git-merge-file.html

다음 명령은 (1) 올바른 분기의 파일을 비교하고 마스터(2) 적용할 수정 사항을 대화식으로 묻습니다.

git checkout --patch master <fn>

B가 현재 분기라고 가정합니다.

$ git diff A <file-path> > patch.tmp
$ git apply patch.tmp -R

변경사항은 로컬 파일에만 적용됩니다.나중에 커밋해야 합니다.

병합할 파일의 이전 버전을 체크아웃하여 다른 이름으로 저장한 다음 두 파일에 있는 병합 도구를 실행할 수 있습니다.

예를 들면

git show B:src/common/store.ts > /tmp/store.ts(여기서 B는 지점 이름/커밋/태그)

meld src/common/store.ts /tmp/store.ts

로 하겠습니다.

git format-patch branch_old..branch_new file

이렇게 하면 파일에 대한 패치가 생성됩니다.

대상 branch_old에서 패치 적용

git am blahblah.patch

잘못된 병합 후 이 작업을 수행해야 하는 경우 다음과 같은 작업을 수행할 수 있습니다.

# If you did a git pull and it broke something, do this first
# Find the one before the merge, copy the SHA1
git reflog
git reset --hard <sha1>

# Get remote updates but DONT auto merge it
git fetch github 

# Checkout to your mainline so your branch is correct.
git checkout develop 

# Make a new branch where you'll be applying matches
git checkout -b manual-merge-github-develop

# Apply your patches
git checkout --patch github/develop path/to/file
...

# Merge changes back in
git checkout develop
git merge manual-merge-github-develop # optionally add --no-ff

# You'll probably have to
git push -f # make sure you know what you're doing.
git checkout <target_branch>
git checkout <source_branch> <file_path>

언급URL : https://stackoverflow.com/questions/10784523/how-do-i-merge-changes-to-a-single-file-rather-than-merging-commits

반응형