병합을 미리 보려면 어떻게 해야 합니까?
Git 브랜치(예: 메인 라인)가 있는데 다른 개발 브랜치로 병합하려고 합니다.아니면 제가?
이 분기를 병합할지 여부를 결정하기 위해 병합이 수행할 작업에 대한 미리 보기를 보고 싶습니다.적용 중인 커밋 목록을 볼 수 있는 기능을 사용하는 것이 좋습니다.
해 낼 수 은 지까지제생가수낼있최은선는금해각▁so입니다.merge --no-ff --no-commit
,그리고 나서.diff HEAD
.
git log ..otherbranch
- 현재 분기에 병합될 변경사항 목록입니다.
git diff ...otherbranch
- 공통 조상(모순 기저)에서 병합될 대상의 머리 부분으로 diff.두 개의 점과 비교하여 특별한 의미를 갖는 세 개의 점에 주목합니다(아래 참조).
gitk ...otherbranch
- 마지막으로 병합된 이후의 분기를 그래픽으로 표현합니다.
은 " 문열은의니다합미빈"를 의미합니다.HEAD
그냥 ㅠㅠㅠㅠㅠ..otherbranch
에 HEAD..otherbranch
.
두 개의 점과 세 개의 점은 수정사항(log, gitk 등)을 나열하는 명령과 차이에 대한 의미가 약간 다릅니다. 및 두 의 점그및 기 두 개 의 점 로 타 점 ( 개 의 ▁for ▁and 로)의 경우a..b
는 )에 합니다.b
하지만 아닙니다.a
세 점 (점 세 개 ( 개 세 점 (a...b
는 ) 중 합니다.a
또는b
는 두 하고 두 되는 더 한 경우가 ("diff", "diff", "diff", "diff", "diff", "diff").a..b
한 차이입니다.a
b
세 점 (점 세 개 ( 개 세 점 (a...b
과 )의 b
(git diff $(git merge-base a b)..b
).
저에게 가장 적합한 해결책은 병합을 수행하고 충돌이 있는 경우 중단하는 것입니다.이 특정 구문은 저에게 깨끗하고 단순하게 느껴집니다.이것이 아래의 전략 2입니다.
그러나 현재 분기를 엉망으로 만들지 않으려면 또는 충돌의 유무에 관계없이 병합할 준비가 되지 않은 경우에는 해당 분기에서 새 하위 분기를 만들고 다음과 같이 병합합니다.
전략 1: 안전한 방법 – 임시 지점에서 병합:
git checkout mybranch
git checkout -b mynew-temporary-branch
git merge some-other-branch
이렇게 하면 충돌이 무엇인지 확인하려는 경우 임시 분기를 쉽게 버릴 수 있습니다.병합을 "중단"할 필요가 없으며, 다시 작업으로 돌아가서 '내 분기'를 다시 확인하기만 하면 분기에서 병합된 코드나 병합 충돌이 발생하지 않습니다.
이것은 기본적으로 시운전입니다.
전략 2: 확실히 병합을 원할 때, 그러나 충돌이 없는 경우에만.
git checkout mybranch
git merge some-other-branch
Git가 충돌을 보고하는 경우(충돌이 있는 경우에만 해당) 다음 작업을 수행할 수 있습니다.
git merge --abort
병합이 성공하면 해당 병합을 중단할 수 없습니다(재설정만).
병합할 준비가 되지 않은 경우 위의 더 안전한 방법을 사용하십시오.
[편집: 2016-11월 - 전략 1을 2로 바꿨습니다. 대부분의 사람들이 "안전한 방법"을 찾고 있는 것 같기 때문입니다.이제 전략 2는 병합에 처리할 준비가 되지 않은 충돌이 있는 경우 병합을 중단할 수 있다는 점에 더 가까워졌습니다.[댓글을 읽을 때 명심하세요!]
여기서 대부분의 답변은 깨끗한 작업 디렉토리와 여러 대화형 단계(스크립트 작성에 좋지 않음)를 필요로 하거나, 모든 경우(예: 대상 분기에 이미 미결 변경 사항 중 일부를 가져오는 과거 병합 또는 동일한 작업을 수행하는 체리픽)에 대해 작동하지 않습니다.
미래에 무엇이 바뀔지 진정으로 확인하는 것.master
를 develop
지금 당장, 그 안으로.
git merge-tree $(git merge-base master develop) master develop
배관 명령어이기 때문에 무슨 말인지 추측할 수 없습니다. 명시적으로 말해야 합니다.또한 출력을 컬러화하거나 호출기를 사용하지 않으므로 전체 명령은 다음과 같습니다.
git merge-tree $(git merge-base master develop) master develop | colordiff | less -R
— https://git.seveas.net/previewing-a-merge-result.html
(링크에 대한 David Normington의 감사)
추신:
병합 충돌이 발생할 경우 출력에 일반적인 충돌 마커와 함께 다음과 같이 표시됩니다.
$ git merge-tree $(git merge-base a b ) a b
added in both
our 100644 78981922613b2afb6025042ff6bd878ac1994e85 a
their 100644 61780798228d17af2d34fce4cfbdf35556832472 a
@@ -1 +1,5 @@
+<<<<<<< .our
a
+=======
+b
+>>>>>>> .their
사용자 @dreftymac은 좋은 지적을 합니다. 상태 코드에서 쉽게 찾을 수 없기 때문에 스크립팅에 적합하지 않습니다.충돌 마커는 상황에 따라 상당히 다를 수 있습니다(삭제됨과 수정됨 등). 이는 또한 이해하기 어렵게 만듭니다.조심하라.
당신도 나와 같다면, 당신은 당신과 동등한 것을 찾고 있는 것입니다.svn update -n
다음은 속임수를 쓰는 것으로 보입니다.다음 작업을 수행해야 합니다.git fetch
먼저 로컬 담당자가 비교할 적절한 업데이트를 가지고 있어야 합니다.
$ git fetch origin
$ git diff --name-status origin/master
D TableAudit/Step0_DeleteOldFiles.sh
D TableAudit/Step1_PopulateRawTableList.sh
A manbuild/staff_companies.sql
M update-all-slave-dbs.sh
또는 머리에서 원격으로 차이가 필요한 경우:
$ git fetch origin
$ git diff origin/master
IMO 이 솔루션은 "합병 후 중단"을 제안하는 상위 솔루션보다 훨씬 쉽고 오류 발생 가능성이 낮으며(따라서 훨씬 덜 위험합니다).
변경 내용을 이미 가져온 경우에는 다음과 같이 하십시오.
git log ...@{u}
하지만 1.7.x는 필요하다고 생각합니다. 그@{u}
"드랜모트"보다 조금 더 합니다.git log ...origin/master
.
참고: zsh와 확장 글로그 기능을 사용하는 경우 다음과 같은 작업을 수행해야 할 수 있습니다.
git log ...@\{u\}
기존 답변에 추가하여 병합 전 디프 및/또는 로그를 표시하는 별칭을 만들 수 있습니다.많은 대답들이 생략합니다.fetch
"실행 전에 먼저 . 은 이의 병실을 "행하기전 "합에먼 " 저수야 " " 니다preview "와 함). 이것은 이 두 단계를 하나로 결합하는 별칭입니다(머큐리얼의 것과 유사한 것을 에뮬레이션).hg incoming
/outgoing
)
그래서, "에 기반을 두고 있습니다.git log ..otherbranch
당신은 추수있다니습에 할 수 .~/.gitconfig
:
...
[alias]
# fetch and show what would be merged (use option "-p" to see patch)
incoming = "!git remote update -p; git log ..@{u}"
대칭을 위해 다음 별칭을 사용하여 푸시하기 전에 커밋된 항목과 푸시할 항목을 표시할 수 있습니다.
# what would be pushed (currently committed)
outgoing = log @{u}..
그리고 나서 당신은 실행할 수 있습니다.git incoming
또는 " 변보기위해주여를화또많는, 은▁"는"git incoming -p
"diff "diff(diff, "diff")"를 합니다.git incoming --pretty=oneline
간결한 요약 등을 위하여.그런 다음 (선택적으로) "를 실행할 수 있습니다.git pull
실로합병는것입다니하제. (단, 이미 할 수 .)(그러나 이미 가져왔기 때문에 병합을 직접 수행할 수 있습니다.)
" 찬가지로마▁","git outgoing
에서는 " 실행할경어를작수보업다행여니줍지는"를실행할 줍니다.git push
".
저는 비주얼 스튜디오 코드의 변화를 검토하기 위해 이것을 시도했습니다.
dev에서 임시 분기를 만듭니다.그런 다음 파일을 변경한 분기를 --no-ff --no-commit 플래그로 병합합니다.
git checkout dev
git checkout -b feature_temp
git merge feature --no-ff --no-commit
피쳐 분기의 변경된 파일이 feature_temp 분기에 반영됩니다.
git log currentbranch..otherbranch
병합을 수행할 경우 현재 분기로 이동할 커밋 목록을 제공합니다.커밋에 대한 세부 정보를 제공하는 로그에 대한 일반적인 인수는 더 많은 정보를 제공합니다.
git diff currentbranch otherbranch
하나가 될 두 커밋 사이의 차이를 제공합니다.이것은 합병될 모든 것을 제공하는 어려움이 될 것입니다.
이게 도움이 될까요?
실제로 병합을 일회용 방식으로 수행하지 않는 한(카사포의 답변 참조), 이를 볼 수 있는 신뢰할 수 있는 방법은 없는 것 같습니다.
그렇긴 하지만, 여기 약간 가까운 방법이 있습니다.
git log TARGET_BRANCH...SOURCE_BRANCH --cherry
이것은 어떤 커밋이 병합될 것인지에 대한 공정한 표시를 제공합니다.차를보면추를 합니다.-p
파일 이름을 보려면 다음 중 하나를 추가합니다.--raw
,--stat
,--name-only
,--name-status
.
의 git diff TARGET_BRANCH...SOURCE_BRANCH
접근 방식(Jan Hudec의 답변 참조)은 소스 분기에 교차 병합이 포함된 경우 대상 분기에 이미 변경된 사항에 대한 차이를 볼 수 있습니다.
요청 꺼내기 - 이미 제출된 아이디어 대부분을 사용했지만, 제가 자주 사용하는 아이디어 중 하나는 (특히 다른 개발사의 아이디어인 경우) 요청 꺼내기를 수행하는 것입니다. 이는 병합이 발생하기 전에 모든 변경 사항을 검토하는 편리한 방법을 제공합니다.나는 그것이 깃허브가 아니라는 것을 알지만 그것은 확실히 유용합니다.
이것이 도움이 될 수도 있습니다. git-diff-tree - 두 개의 트리 개체를 통해 찾은 블롭의 내용과 모드를 비교합니다.
충돌하는 파일을 검토하기 전에 git merge 명령을 사용하지 않습니다.병합을 수행하지 않고, 병합하기 전에 잠재적인 문제(자동 병합으로 인해 숨겨질 수 있는 문제)를 확인하려고 합니다.제가 찾던 해결책은 앞으로 공통 조상과 관련하여 두 분기 모두에서 함께 병합될 파일 목록을 뱉어내는 방법입니다.이 목록이 있으면 다른 파일 비교 도구를 사용하여 더 자세히 알아볼 수 있습니다.나는 여러 번 검색했지만, 여전히 네이티브 git 명령에서 내가 원하는 것을 찾지 못했습니다.
다른 사람에게 도움이 될 경우를 대비해 다음과 같은 해결 방법을 제시합니다.
이 시나리오에서는 QA라는 지사가 있으며, 마지막 프로덕션 릴리스 이후 많은 변경 사항이 있습니다.마지막 프로덕션 릴리스에는 "15.20.1"이라는 태그가 지정되어 있습니다.QA 브랜치에 병합하고 싶은 new_stuff라는 다른 개발 브랜치가 있습니다.QA와 new_stuff 모두 15.20.1 태그를 "따라" 커밋합니다(gitk 보고).
git checkout QA
git pull
git diff 15.20.1 --name-only > QA_files
git checkout new_stuff
git pull
git diff 15.20.1 --name-only > new_stuff_files
comm -12 QA_files new_stuff_files
다음은 이러한 특정 파일을 대상으로 하는 데 관심이 있는 이유에 대한 몇 가지 논의입니다.
https://softwareengineering.stackexchange.com/questions/199780/how-far-do-you-trust-automerge
언급URL : https://stackoverflow.com/questions/5817579/how-can-i-preview-a-merge-in-git
'sourcecode' 카테고리의 다른 글
"ReferenceEquals(myObject, null)"이 "myObject == null"보다 더 나은 방법입니까? (0) | 2023.05.09 |
---|---|
엑셀은 부동소수점 숫자가 부정확함에도 불구하고 어떻게 성공적으로 반올림합니까? (0) | 2023.05.09 |
HEAD GIT은 무엇입니까? (0) | 2023.05.09 |
npm을 통해 트위터 부트스트랩을 설치하는 목적은 무엇입니까? (0) | 2023.05.09 |
CSV 파일에서 Postgre로 복사하는 방법CSV 파일에 헤더가 있는 SQL 테이블? (0) | 2023.05.09 |