Git의 다른 브랜치에서 선택적으로 마지 또는 변경 사항을 선택하려면 어떻게 해야 합니까?
저는 Git을 현재 실험적인 두 개의 개발 부서가 있는 새로운 프로젝트에 사용하고 있습니다.
master
및 몇 : Import.exp1
브런치 : 험용용1 1exp2
#2 : 2번
exp1
★★★★★★★★★★★★★★★★★」exp2
매우 다른 두 가지 아키텍처 접근 방식을 나타냅니다. 브랜치에서도 이 되는 수 한 브랜치에서는 진행이 되고 있기 때문에, 다른 브랜치에서는 도움이 되는 편집이 있어, 그 편집만을 Marge 하고 싶은 경우가 있습니다.
다른 모든 것을 뒤로 한 채 특정 개발 지사에서 다른 지사로 선택적 변경 사항을 병합하는 가장 좋은 방법은 무엇일까요?
내가 고려한 접근법:
git merge --no-commit
다음으로 브랜치 간에 공통으로 하고 싶지 않은 많은 편집 내용을 수동으로 언스테이지합니다.을 임시 하고, 그 에 " " " 가 계속됩니다.
git checkout
다른 분기로 이동한 후 임시 디렉토리에서 작업 트리로 더 많은 수동 복사를 수행합니다.포기하다
exp
현재 브랜치 및 실험에 2개의 로컬 저장소를 추가로 사용합니다.이것에 의해, 파일의 수동 카피가 한층 간단하게 됩니다.
이 세 가지 접근 방식 모두 지루하고 오류가 발생하기 쉽습니다.더 나은해서 '필터 경로'를 만들 수 있어요. 필터 경로 매개 변수와 같은 것이git-merge
아, 아, 아, 아, 아, 아, 아, 아, 아.
dr;dr
git checkout source_branch -- path/to/file
# resolve conflicts if any
git commit -am '...'
위에서 말한 것과 똑같은 문제가 있었습니다.하지만 나는 답을 설명하면서 이것이 더 명확하다는 것을 알았다.
요약:.
Marge할 브런치에서 경로를 체크 아웃합니다.
$ git checkout source_branch -- <paths>... Hint: It also works without `--` like seen in the linked post.
또는 선택적으로 헌크를 병합하기 위해
$ git checkout -p source_branch -- <paths>...
한 후 reset 옵션을 합니다.-p
,
$ git reset <paths>...
$ git add -p <paths>...
최종적으로 커밋
$ git commit -m "'Merge' these changes"
cherry-pick 명령어를 사용하면 1개의 브랜치에서 개별 커밋을 얻을 수 있습니다.
원하는 변경이 개별 커밋에 없는 경우 여기에 표시된 방법을 사용하여 커밋을 개별 커밋으로 분할합니다.대략적으로 말하면git rebase -i
하려면 , 「」를 참조해 주세요.git reset HEAD^
, 「 」를 참조해 .git commit
역사의 새로운 커밋으로 그 부분을 커밋하는 거죠
여기 레드햇 매거진에는 또 다른 좋은 방법이 있는데, 거기서 그들은git add --patch
(가능성이 있다)git add --interactive
다른 변경 내용을 개별 파일에 분할할 경우 행크의 일부만 추가할 수 있습니다(이 페이지에서 "search"
거스름돈을 나눠서 원하는 것만 고를 수 있게 되었습니다.
한 분기의 파일을 다른 분기로 선택적으로 병합하려면
git merge --no-ff --no-commit branchX
서 ''는branchX
현재의 브랜치로 하는 입니다.
--no-commit
옵션은 Git에 의해 병합된 파일을 실제로 커밋하지 않고 스테이징합니다.이렇게 하면 병합된 파일을 원하는 대로 수정한 후 직접 커밋할 수 있습니다.
파일을 Marge 하는 방법에 따라 다음 4가지 경우가 있습니다.
1) 진정한 머지를 원합니다.
이 경우 Git이 자동으로 병합하는 방식으로 병합된 파일을 수락한 후 커밋합니다.
2) Marge하고 싶지 않은 파일이 있습니다.
예를 들어 현재 분기의 버전을 유지하고 병합하려는 분기의 버전을 무시하려고 합니다.
현재 분기의 버전을 선택하려면 다음을 수행합니다.
git checkout HEAD file1
그면 の of of の of of of of of of of의 됩니다.file1
를 실시합니다.file1
Git git
3) 버전을 branchX(진정한 머지가 아닌)로 하고 싶은 경우.
실행:
git checkout branchX file1
그면 の of of の of of of of of of of의 됩니다.file1
branchX
「」를 덮어씁니다.file1
Git git git git git git git git git git git 。
는 4)의 특정 입니다.file1
.
한 수정 내용을 할 수 .file1
file1
되고 나서 헌신하게 됩니다.
Git가 파일을 자동으로 병합할 수 없는 경우 파일을 "머지되지 않음"으로 보고하고 충돌을 수동으로 해결해야 하는 복사본을 생성합니다.
을 하자면, '', '합치자', '합치자, 합치자, 합치자, 합치자, 합치자, 합치자, 합치자, 합시다.branchX
현재 브랜치에 접속합니다.
git merge --no-ff --no-commit branchX
'보다 낫다'를 합니다.git status
명령어를 사용하여 변경된 파일의 상태를 표시합니다.
예를 들어 다음과 같습니다.
git status
# On branch master
# Changes to be committed:
#
# modified: file1
# modified: file2
# modified: file3
# Unmerged paths:
# (use "git add/rm <file>..." as appropriate to mark resolution)
#
# both modified: file4
#
서 ★★★★★file1
,file2
, , , , 입니다.file3
successfully .는 파일 git have successfully auto-displayed.로 되어 .
, '변화'는 ''를합니다.master
★★★★★★★★★★★★★★★★★」branchX
이 세 개의 파일이 모두 충돌 없이 결합되었기 때문입니다.
하려면 , 「」를 합니다.git diff --cached
;
git diff --cached file1
git diff --cached file2
git diff --cached file3
일부 Marge가 바람직하지 않다고 생각되는 경우, 다음과 같이 할 수 있습니다.
- 파일을 직접 편집하다
- 절약하다
git commit
file1
(브런치)의 생각하고 있습니다.
달려.
git checkout HEAD file1
file2
요.branchX
달려.
git checkout branchX file2
네가 원한다면file3
자동으로 병합되도록 하려면 아무 것도 하지 마십시오.
Git은 이 시점에서 이미 그것을 통합했다.
file4
마지못해 하다즉, 같은 회선상에서 양쪽 브랜치에 변경이 있는 것을 의미합니다.여기서 수동으로 충돌을 해결해야 합니다.의 checkout 할 수 있습니다.file4
되기 위해.
으로 잊지 git commit
.
나는 위의 접근법이 마음에 들지 않는다.체리 픽을 사용하는 것은 하나의 거스름돈을 고르는 데는 좋지만, 나쁜 것을 제외하고 모든 변화를 가져오고 싶다면 곤란합니다.제 접근 방식은 이렇습니다.
--interactive
merge.merge merge에 할 수 .
대체 방법은 다음과 같습니다.
브랜치 「기능」에 변경이 있어, 모든 것을 「마스터」에 어설프게 전달하고 싶은(즉, 각각을 선택해 커밋하고 싶지 않은) 것이 있습니다.
git checkout feature
git checkout -b temp
git rebase -i master
# Above will drop you in an editor and pick the changes you want ala:
pick 7266df7 First change
pick 1b3f7df Another change
pick 5bbf56f Last change
# Rebase b44c147..5bbf56f onto b44c147
#
# Commands:
# pick = use commit
# edit = use commit, but stop for amending
# squash = use commit, but meld into previous commit
#
# If you remove a line here THAT COMMIT WILL BE LOST.
# However, if you remove everything, the rebase will be aborted.
#
git checkout master
git pull . temp
git branch -d temp
셸 스크립트로 정리하여 마스터를 $to로 변경하고 기능을 $from으로 변경하면 바로 사용할 수 있습니다.
#!/bin/bash
# git-interactive-merge
from=$1
to=$2
git checkout $from
git checkout -b ${from}_tmp
git rebase -i $to
# Above will drop you in an editor and pick the changes you want
git checkout $to
git pull . ${from}_tmp
git branch -d ${from}_tmp
다른 방법이 있습니다.
git checkout -p
git checkout
★★★★★★★★★★★★★★★★★」git add -p
그리고 당신이 찾고 있는 것이 바로 이것일 수도 있습니다.
-p, --patch
Interactively select hunks in the difference between the <tree-ish>
(or the index, if unspecified) and the working tree. The chosen
hunks are then applied in reverse to the working tree (and if a
<tree-ish> was specified, the index).
This means that you can use git checkout -p to selectively discard
edits from your current working tree. See the “Interactive Mode”
section of git-add(1) to learn how to operate the --patch mode.
이러한 답변 중 일부는 매우 좋지만, 운영 체제의 원래 제약 사항인 특정 지점에서 특정 파일을 선택하는 것에 대한 답변은 실제로 없는 것 같습니다.이 솔루션은 그렇게 하는데 파일이 많으면 지루할 수 있습니다.
'우리'가 칩시다.master
,exp1
, , , , 입니다.exp2
을 마스터로합니다.각 실험 분기에서 하나의 파일을 마스터로 병합하려고 합니다.저는 이렇게 하고 싶어요.
git checkout master
git checkout exp1 path/to/file_a
git checkout exp2 path/to/file_b
# Save these files as a stash
git stash
# Merge stash with master
git merge stash
이렇게 하면 원하는 각 파일에 대한 파일 내 차이가 나타납니다.더 이상은 없어요.그 이상도 이하도 아니다.버전 간에 근본적으로 다른 파일 변경을 하는 것은 도움이 됩니다.내 경우는 애플리케이션을 Ruby on Rails 2에서 Ruby on Rails 3으로 변경하는 것입니다.
이렇게 하면 파일이 병합되지만 스마트 병합이 수행됩니다.이 방법을 사용하여 파일 내 diff 정보를 얻는 방법을 찾을 수 없었습니다(극단적인 차이에 대해서도 마찬가지일 수 있습니다.과 같은 짜증나는 작은 .-s recursive -X ignore-all-space
□□□□□□□□★
1800 INFORMATION의 답변은 완전히 정확합니다.하지만 Git을 처음 접하는 사람으로서 Git 체리픽을 사용하는 것만으로는 인터넷을 좀 더 파헤치지 않고는 알 수 없었기 때문에, 같은 처지에 있는 사람이 있을 경우에 대비해, 보다 상세한 가이드를 투고하고 싶다고 생각했습니다.
다른 사람의 GitHub 브랜치 변경 사항을 선택적으로 내 것으로 가져오기를 원했습니다.변경사항이 있는 로컬브런치가 이미 있는 경우 2단계와 5-7단계만 수행하면 됩니다.
가져올 변경 사항을 사용하여 로컬 분기를 만듭니다(생성하지 않은 경우).
$ git branch mybranch <base branch>
갈아타세요.
$ git checkout mybranch
다른 사용자의 계정에서 원하는 변경 사항을 끌어냅니다.아직 추가하지 않은 경우 리모트로 추가할 수 있습니다.
$ git remote add repos-w-changes <git url>
나뭇가지에 있는 모든 것을 끌어내리세요.
$ git pull repos-w-changes branch-i-want
커밋 로그를 표시하여 원하는 변경을 확인합니다.
$ git log
변경 내용을 가져올 분기로 다시 전환합니다.
$ git checkout originalbranch
체리는 해쉬로 커밋을 하나씩 골라요.
$ git cherry-pick -x hash-of-commit
모자 힌트 : http://www.sourcemage.org/Git_Guide (복사본)
수 .Myclass.java
master
로 with with with 로 Myclass.java
feature1
분점.해도 된다Myclass.java
하지 않다master
.
git checkout master
git checkout feature1 Myclass.java
이렇게 하면 병합이 아닌 덮어쓰기가 되고 마스터 브랜치의 로컬 변경은 무시됩니다.
간단한 방법은 특정 파일을 다른 분기의 파일로 바꾸는 것이 아니라 두 분기의 특정 파일을 실제로 병합하는 것입니다.
순서 1: 브런치를 분산하다
git diff branch_b > my_patch_file.patch
현재 분기와 branch_b 사이의 차이에 대한 패치 파일을 만듭니다.
순서 2:패턴과 일치하는 파일에 패치 적용
git apply -p1 --include=pattern/matching/the/path/to/file/or/folder my_patch_file.patch
옵션에 대한 유용한 참고 사항
하시면 됩니다.*
와일드카드로 지정합니다.
찰과상은 피할 필요가 없습니다.
또한 --exclude를 사용하여 패턴과 일치하는 파일을 제외한 모든 파일에 적용하거나 -R로 패치를 되돌릴 수 있습니다.
은 *이 각 에 -p1 "*Unix patch" 가 .a/
★★★★★★★★★★★★★★★★★」b/
(또는 패치파일이 생성된 방법에 따라 다름) 패치가 적용되는 파일의 경로에 대한 실제 파일을 알아낼 수 있도록 해야 합니다.
기타 옵션은 man 페이지에서 git-apply를 확인하십시오.
3단계: 3단계는 없습니다.
물론 변경을 커밋하고 싶겠지만 커밋하기 전에 해야 할 다른 관련 수정 사항이 없다고 누가 말할 수 있겠습니까?
여기에서는, 「심플한」머지를 실시하면, 불필요한 변경을 훨씬 더 많이 가져오는 경우라도, 다른 브랜치로부터 몇개의 파일만을 간단하게 팔로우 할 수 있습니다.
먼저 작업 디렉토리 내의 파일에 대해 Git이 전혀 조작하지 않고, 커밋하려는 것이 머지라고 사전에 선언하는 이례적인 절차를 밟습니다.
git merge --no-ff --no-commit -s ours branchname1
...여기서 "margechename"은 당신이 합병한다고 주장하는 모든 것을 의미합니다.만약 당신이 즉시 헌신한다면, 그것은 아무런 변화도 없을 것이지만, 그것은 여전히 다른 지파의 조상을 나타낼 것이다.필요한 경우 명령줄에 분기, 태그 등을 추가할 수도 있습니다.다만, 현시점에서는 커밋할 변경은 없기 때문에, 다음에 다른 리비전의 파일을 취득합니다.
git checkout branchname1 -- file1 file2 etc.
여러 분기에서 병합하는 경우 필요에 따라 를 반복합니다.
git checkout branchname2 -- file3 file4 etc.
이제 다른 분기의 파일이 인덱스에 포함되어 커밋할 준비가 되었습니다.내역이 표시됩니다.
git commit
그리고 당신은 그 약속 메시지에서 설명해야 할 것이 많을 것이다.
확실히 알 수 없는 경우를 대비해서 말씀드리지만, 이 일은 엉망진창입니다.그것은 "가지"가 무엇을 위한 것이 아니며, 체리픽은 여러분이 여기서 하고 있는 일을 더 솔직하게 하는 방법입니다.이전에 가져오지 않은 동일한 분기의 다른 파일에 대해 "merge"를 다시 수행할 경우 "ready update" 메시지가 나타납니다."from" 브랜치는 여러 브랜치여야 하기 때문에 브랜치해야 할 때 브랜치하지 않는 증상입니다.
이것은 선택한 파일을 병합하기 위한 워크플로우입니다.
# Make a new branch (this will be temporary)
git checkout -b newbranch
# Grab the changes
git merge --no-commit featurebranch
# Unstage those changes
git reset HEAD
(You can now see the files from the merge are unstaged)
# Now you can chose which files are to be merged.
git add -p
# Remember to "git add" any new files you wish to keep
git commit
가장 쉬운 방법은 저장소를 병합할 분기로 설정한 후 실행하는 것입니다.
git checkout [branch with file] [path to file you would like to merge]
뛰면
git status
이미 준비된 파일을 볼 수 있습니다.
그럼 달려라
git commit -m "Merge changes on '[branch]' to [file]"
간단하죠.
git에 아직 그런 편리한 툴이 없는 것이 이상합니다.현재 버전 브랜치에서 몇 가지 버그 수정만으로 오래된 버전 브랜치(소프트웨어 사용자가 많은 브랜치)를 업데이트할 때 많이 사용합니다.이 경우 트렁크 내의 파일에서 코드 몇 줄만 빠르게 가져와야 합니다.다른 많은 변경은 무시합니다(이전 버전에는 들어가지 않습니다).물론 이 경우 인터랙티브한 3자 결합이 필요합니다.git checkout --patch <branch> <file path>
이 선택적 병합에는 사용할 수 없습니다.
간단하게 할 수 있습니다.
은 그냥 이 행에 주세요.[alias]
를 참조해 주세요..gitconfig
로컬 " " " ".git/config
삭제:
[alias]
mergetool-file = "!sh -c 'git show $1:$2 > $2.theirs; git show $(git merge-base $1 $(git rev-parse HEAD)):$2 > $2.base; /C/BCompare3/BCompare.exe $2.theirs $2 $2.base $2; rm -f $2.theirs; rm -f $2.base;' -"
이는 비교 이상의 사용을 의미합니다.필요한 경우 원하는 소프트웨어로 변경하기만 하면 됩니다.또는 대화형 선택적 병합이 필요하지 않은 경우 3방향 자동 병합으로 변경할 수 있습니다.
[alias]
mergetool-file = "!sh -c 'git show $1:$2 > $2.theirs; git show $(git merge-base $1 $(git rev-parse HEAD)):$2 > $2.base; git merge-file $2 $2.base $2.theirs; rm -f $2.theirs; rm -f $2.base;' -"
다음으로 다음과 같이 사용합니다.
git mergetool-file <source branch> <file path>
이를 통해 다른 브랜치 내의 모든 파일에 대한 진정한 선택적 트리웨이 머지 기회를 얻을 수 있습니다.
나는 이 게시물이 가장 간단한 답을 담고 있다는 것을 알았다.다음 작업을 수행합니다.
git checkout <branch from which you want files> <file paths>
예
지점 B에서 현재 분기로 .gitignore 파일을 가져오는 중:
git checkout branchB .gitignore
상세한 것에 대하여는, 투고를 참조해 주세요.
당신이 찾고 있던 것은 아니지만, 나에게 도움이 되었습니다.
git checkout -p <branch> -- <paths> ...
몇 가지 답이 섞여 있습니다.
위에서 말한 것과 똑같은 문제가 있었습니다.하지만 나는 이 Git 블로그가 답을 설명하는 것이 더 명확하다는 것을 알았다.
위 링크의 명령어:
# You are in the branch you want to merge to
git checkout <branch_you_want_to_merge_from> <file_paths...>
같은 경우에는요.git reset --soft branch
는 다른 브런치에서 변경 내용을 선택하는 가장 쉬운 방법입니다.이 명령어를 사용하면 작업 트리에 모든 차이가 저장되고 필요한 변경 내용을 쉽게 선택하거나 되돌릴 수 있기 때문입니다.
이렇게 하면 커밋된 파일을 완전히 제어할 수 있습니다.
나는 할 것이다.
git diff commit1..commit2 filepattern | git-intern --index & & git commit
이렇게 하면 브런치로부터의 파일 패턴의 커밋 범위를 제한할 수 있습니다.
어떤 브랜치에서 다른 브랜치로 파일을 몇 개만 풀하려면 어떻게 해야 합니까?
하시면 됩니다.read-tree
지정된 원격 트리를 읽거나 현재 인덱스에 병합하려면 다음과 같이 하십시오.
git remote add foo git@example.com/foo.git
git fetch foo
git read-tree --prefix=my-folder/ -u foo/master:trunk/their-folder
, 「」를 합니다.-m
★★★★★★ 。
다음 항목도 참조하십시오.Git에서 서브디렉토리를 Marge하려면 어떻게 해야 하나요?
앞의 '기트-인터랙티브-머지' 답변은 좋았지만, 한 가지 더 쉬운 답변이 있습니다.Git이 인터랙티브와 on의 기본 재설정을 사용하여 이 작업을 수행하도록 합시다.
A---C1---o---C2---o---o feature
/
----o---o---o---o master
즉, C1과 C2는 '피처' 브랜치(브런치 포인트 'A')에서 취득하고 나머지는 취득하지 않는 것이 좋습니다.
# git branch temp feature
# git checkout master
# git rebase -i --onto HEAD A temp
위의 답변과 같이 인터랙티브에디터로 드롭 되어 C1 및 C2의 '선택' 행을 선택합니다(위).저장한 후 종료하면 기본 재설정이 진행되어 브랜치 'temp'가 표시되고 마스터 + C1 + C2의 HEAD도 표시됩니다.
A---C1---o---C2---o---o feature
/
----o---o---o---o-master--C1---C2 [HEAD, temp]
그런 다음 마스터를 HEAD로 업데이트하고 temp 브랜치를 삭제하기만 하면 됩니다.
# git branch -f master HEAD
# git branch -d temp
디렉토리를 부분적으로 병합하기 위해 '퍼지'라는 나만의 대본을 썼습니다.아직 진행 중인 작업이고 Git과 Bash 스크립트를 모두 배우고 있습니다.
에서는 " " 가 사용됩니다.git merge --no-commit
그런 다음 제공된 경로와 일치하지 않는 변경 내용을 적용합니다.
: 사법 usage :git pmerge branch path
::git merge develop src/
광범위하게 테스트한 적은 없습니다.작업 디렉토리에는 커밋되지 않은 변경 및 추적되지 않은 파일이 없어야 합니다.
#!/bin/bash
E_BADARGS=65
if [ $# -ne 2 ]
then
echo "Usage: `basename $0` branch path"
exit $E_BADARGS
fi
git merge $1 --no-commit
IFS=$'\n'
# List of changes due to merge | replace nulls with newlines | strip lines to just filenames | ensure lines are unique
for f in $(git status --porcelain -z -uno | tr '\000' '\n' | sed -e 's/^[[:graph:]][[:space:]]\{1,\}//' | uniq); do
[[ $f == $2* ]] && continue
if git reset $f >/dev/null 2>&1; then
# Reset failed... file was previously unversioned
echo Deleting $f
rm $f
else
echo Reverting $f
git checkout -- $f >/dev/null 2>&1
fi
done
unset IFS
파일에 의한 선택적 병합/커밋을 위한 간단한 접근법:
git checkout dstBranch
git merge srcBranch
// Make changes, including resolving conflicts to single files
git add singleFile1 singleFile2
git commit -m "message specific to a few files"
git reset --hard # Blow away uncommitted changes
변경된 파일이 너무 많지 않으면 추가 커밋이 필요하지 않습니다.
1. 일시적으로 브런치를 복제한다.
$ git checkout -b temp_branch
로 리셋합니다. 마지막으로 원하는 커밋으로 리셋
$ git reset --hard HEAD~n
서, snowledge.n
.
3. 원본 브랜치에서 각 파일을 체크아웃합니다.
$ git checkout origin/original_branch filename.ext
이제 필요에 따라 (리모트를 덮어쓰도록) 커밋 및 강제 푸시할 수 있습니다.
것을 창조하다target-branch
the off master
실험하기 전에.
는 분기가 두 개 합니다.target-branch
★★★★★★★★★★★★★★★★★」source-branch
「」를 참조해 주세요dir-to-merge
은 "Merge"에.source-branch
, 이 밖에도 you, 음, 음, 음, 다 등의 가정해 dir-to-retain
바꾸고 싶지 않고 역사를 보존하고 싶지 않은 목표에서 말이죠.또,에서는, ,, 에, 에, conflicts, conflicts에 Marge 경합이 을 전제로 .dir-to-merge
.
git checkout target-branch
git merge --no-ff --no-commit -X theirs source-branch
# the option "-X theirs", will pick theirs when there is a conflict.
# the options "--no--ff --no-commit" prevent a commit after a merge, and give you an opportunity to fix other directories you want to retain, before you commit this merge.
# the above, would have messed up the other directories that you want to retain.
# so you need to reset them for every directory that you want to retain.
git reset HEAD dir-to-retain
# verify everything and commit.
두 브랜치의 현재 커밋 간에 변경된 파일이 몇 개만 있는 경우 다른 파일을 통해 변경 내용을 수동으로 병합합니다.
git difftool <branch-1>..<branch-2>
참고 자료:https://sites.google.com/site/icusite/setup/git-difftool
이 문제의 서브셋에 주목합니다.브런치가 2개 있는데 하나의 파일을 다른 파일로 의사적으로 병합하고 싶습니다.
(마지 커밋이 필요없거나 필요없기 때문에 '의사 머지'라고 하는 것입니다.단, 두 버전의 파일 모두 적절한 방법으로 공헌을 조합하고 싶을 뿐입니다.
저의 접근방식은 https://stackoverflow.com/a/39916536/341994에서 채택된 접근방식을 기반으로 합니다.유감스럽게도 그 질문은 중복으로 종결되었습니다(잘못된 것은 이 질문의 중복이 아니며, 답변자가 거기서 한 것과 같은 중복으로 답변하고 닫는 것은 잘못되었다고 생각합니다).하지만 그 답변에는 잘못된 점이 몇 가지 있기 때문에 저는 접근방식을 현대화하고 정리했습니다.대신checkout
★★★★★★★★★★★★★★★★★」reset
, , , 을합니다.restore
그리고 나는 내가 하지 않아도 되는 어떤 것도 하지 않는다.
좋아, 세 가지 파일이 있다고 상상해봐
$ ls
a b f
그 중 .a
에서, syslogsotherbranch
어떤 상황인지 한번 살펴봅시다..
$ cat a
line one
line two
line three
line four
line five
other branch 버전은 다음과 같습니다.
$ git show otherbranch:a
line one
line two edited
line three
line four
line five
line six
여기서 중요한 것은 인덱스를 스크래치 패드로 사용하는 것입니다(그것은 결국 그 용도입니다).다음으로 (STEP 1)버전이 인덱스에 복사되어 있는지 확인합니다.
$ git add a
이제 (2 )를 사용할 수 .restore
을 otherbranch
, (사양,)restore
보다 checkout
을 사용하다
$ git restore --source otherbranch a
건건언언언언보보보보보보보요요요요요요 。를 a의 .otherbranch
다음 중 하나:
$ cat a
line one
line two edited
line three
line four
line five
line six
하지만 걱정하지 마세요!의 이전 버전은 다음과 같이 인덱스에 남아 있습니다.
$ git diff a
diff --git a/a b/a
index abf51fa..333614b 100644
--- a/a
+++ b/a
@@ -1,6 +1,7 @@
line one
-line two
+line two edited
line three
line four
line five
+line six
자, 이제 주요 이동(3단계)을 시작할 준비가 되었습니다).인터랙티브 패치를 실시합니다. add
작업 트리에서 인덱스로 파일을 전송합니다.
라고 할 수 .git add -p a
인터랙티브 패치프로세스를 시작합니다.이 경우, 우리는 한번에 한 마리씩 훈크를 받습니다.그러나 이 경우 hunk는 1개뿐이므로 편집하고 싶기 때문에 다음과 같이 말합니다.
$ git add --e a
그 결과 편집기에서 diff 패치 파일을 열 수 있습니다!다음과 같습니다.
line one
-line two
+line two edited
line three
line four
line five
+line six
신중하게 편집하면 어떤 부품을 받아들일지, 어떤 부품을 원하지 않을지를 결정할 수 있습니다."6행"은 인정하지만 "2행 편집"은 인정하지 맙시다.다음과 같이 편집합니다.
line one
line two
line three
line four
line five
+line six
에디터를 닫고 의 인덱스 버전에 패치가 적용됩니다.하지만 우린 아직 끝나지 않았어!otherbranch
트리에 .
$ cat a
line one
line two edited
line three
line four
line five
line six
우리가 좋아하는 버전이 색인에 있어요, 기억나요? ( 4 (STEP 4)라고 .git restore
restore
낫다reset
에 적용할 수 : 1개의 파일에 할 수 있습니다.
$ git restore a
이제 a가 올바르고 모두 끝났습니다.
$ cat a
line one
line two
line three
line four
line five
line six
현시점에서는 커밋할 수 있지만, 할 필요는 없습니다.우리는 목표를 달성했습니다.
원하는 것:인터랙티브하게 브랜치(복수의 커밋이 있는)에서 새로운 브랜치에서의 깨끗한 커밋을 선택합니다.
git diff
+git apply
바이너리 파일이 있으면 동작하지 않습니다.
나의 접근법:
# New branch from a clean starting point, e.g. master
git checkout new-clean-branch origin/master
# Get all changes from the messy branch
# (quote the star so your shell doesn't expand it)
git checkout messy-branch -- '*'
# Unstage ("un-add") everything
git restore --staged .
# Interactively add hunks to be staged for commit
git add -p
저는 이 질문에 대해 정말 아름답고 단순한 해결책을 찾았습니다.그래서 저는 이 솔루션을 사용하고 싶은 분들을 위해 여기에 보관하고 있습니다.
하다.
file1이라는 단일 파일이 포함된 branch1에 있다고 가정합니다.txt
그럼 에는 file1.txt
파일로file2.txt
지점 2에 있습니다.
" " " 입니다.
git checkout --patch branch2 <path_of_file2.txt_in_context_of_branch2>
현재 브랜치1의 변경을 반영하기 위해 특정 문자를 입력해야 한다는 메시지가 콘솔에 표시됩니다.때때로 나는 모든 훈남들을 받아들이기 위해 a를 사용한다.
이 답변이 도움이 되길 바랍니다.
합니다.
여기 Gitkraken 사용자라면 작은 가이드를 가지고 있습니다.
요약:
- 변경 내용을 가져올 분기로 이동합니다.(개발 등)
- 새로운 변경이 있는 브랜치를 오른쪽 클릭하여 [Cherrypick commit]옵션(예: feature-ABC)을 선택합니다.
- 마지막으로 경합이 있는 경우 수락하고 확인합니다.
언급URL : https://stackoverflow.com/questions/449541/how-can-i-selectively-merge-or-pick-changes-from-another-branch-in-git
'programing' 카테고리의 다른 글
Bash에서 변수에 대한 사용자 입력을 읽으려면 어떻게 해야 합니까? (0) | 2023.04.13 |
---|---|
레코드를 검색하기 위한 SQL 쿼리(count > 1 ) (0) | 2023.04.13 |
NSApp Transport Security를 info.plist 파일에 추가하려면 어떻게 해야 하나요? (0) | 2023.04.13 |
뭐 하는 거야? (0) | 2023.04.08 |
Windows 의 인스톨 시각과 일자를 가르쳐 주세요. (0) | 2023.04.08 |