IT

Git-Merge --dry-run 옵션이 있습니까?

itgroup 2023. 6. 22. 21:42
반응형

Git-Merge --dry-run 옵션이 있습니까?

충돌이 많을 수 있는 원격 지점에서 병합합니다.충돌 여부는 어떻게 알 수 있습니까?

나는 아무것도 보지 못합니다.--dry-rungit-merge.

앞서 언급한 바와 같이 다음을 전달합니다.--no-commit플래그, 그러나 빠르게 전달되는 커밋을 피하기 위해 전달하기도 합니다.--no-ff 예:

$ git merge --no-commit --no-ff $BRANCH

스테이징된 변경 사항 검사하기

$ git diff --cached

그리고 빠른 전달 병합인 경우에도 병합을 실행 취소할 수 있습니다.

$ git merge --abort

저장소와 원격 간의 충돌을 자동으로 찾는 방법을 구현해야 했습니다.이 솔루션은 메모리에서 병합되므로 인덱스나 작업 트리에 닿지 않습니다.저는 이것이 당신이 이 문제를 해결할 수 있는 가장 안전한 방법이라고 생각합니다.작동 방식은 다음과 같습니다.

  1. 원격을 저장소로 가져옵니다. 예:git fetch origin master
  2. 런깃병기준:git merge-base FETCH_HEAD master
  3. 룽기트 룽기트:git merge-tree mergebase master FETCH_HEAD(mergebase는 이전 단계에서 merge-base가 인쇄된 16진수 ID입니다.)

이제 원격 마스터를 로컬 마스터와 병합하려고 하지만 모든 분기를 사용할 수 있다고 가정합니다. git merge-tree메모리에서 병합을 실행하고 결과를 표준 출력으로 인쇄합니다. 에한대 턴패 Grep<<또는>>또는 출력물을 파일로 인쇄하여 확인할 수 있습니다.'changed both'로 둘 다 ' in both' 시작발 잖아요.

합병을 시도하기 전에 얼마나 많은 문제를 겪고 있는지 알고 싶으실 거예요그리고 병합 실패 후 마지막 커밋으로 재설정하는 것은 비교적 쉬우므로 의도된 접근 방식이라고 해도 놀라지 않을 것입니다.

즉, 작업 트리의 기존 파일을 건드리지 않으려면 패치를 생성하여 대상 분기에 대해 테스트할 수 있습니다.이 기능은 또한 어떤 파일이 변경되었는지 정확히 보여주는 이점이 있습니다. 즉, 텍스트 편집기에서 패치 파일을 열기만 하면 됩니다.

git checkout -b mycrazybranch
[change some stuff...]
git add .
git commit -m "changed some stuff"
git format-patch master --stdout > crazy.patch
git checkout master
git apply crazy.patch --check
[all good! cleanup...]
rm crazy.patch

이렇게 하면 패치 파일이 생성되고 --로 테스트하여 오류가 있는지 확인한 다음 패치 파일을 제거할 수 있습니다.

할수있습니다git merge --abort충돌이 있는 것을 본 후에.

기존 답변의 요약으로서 병합 충돌 여부를 확인하는 두 가지 방법이 있습니다.

git format-patch $(git merge-base branch1 branch2)..branch2 --stdout | git apply --3way --check -

현재 지점은 다음과 같아야 합니다.branch1의 명령을 과 같습니다.

다른 방법:

git merge --no-commit branch2
# check the return code here
git merge --abort

이에 대한 간단한 브루트 포스 솔루션은 다음과 같습니다.

  1. (물론 마스터에서) "사전 마스터" 분기 작성

  2. 이 사전 마스터에 원하는 모든 항목을 병합합니다.
    그러면 마스터를 누르지 않고 병합이 어떻게 이루어졌는지 알 수 있습니다.

    • 사전 마스터를 마스터 또는 마스터에 대한 병합
    • 릴리스할 모든 분기를 마스터로 병합

어쨌든, 저는 @orange80의 조언을 따를 것입니다.

저는 이것을 하기 위해 가명을 만들었고 매력적으로 일했습니다. 저는 이렇게 합니다.

 git config --global alias.mergetest '!f(){ git merge --no-commit --no-ff "$1"; git merge --abort; echo "Merge aborted"; };f '

이제 전화할게요

git mergetest <branchname>

충돌 여부를 확인하기 위해섭니다.

git와의 병합을 취소하는 것은 너무 쉬워서 모의 실행에 대해 걱정할 필요도 없습니다.

$ git pull $REMOTE $BRANCH
# uh oh, that wasn't right
$ git reset --hard ORIG_HEAD
# all is right with the world

EDIT알 수 , 사항이 위입니다. 에 삭제됩니다.git reset아래)

현재 분기를 원격 분기와 비교하면 풀/병합을 수행할 때 변경되는 내용을 알 수 있습니다.

#see diff between current master and remote branch
git diff master origin/master

아직 아무도 패치 사용을 제안하지 않았다는 것이 놀랍습니다.

병을테고싶합니다다고에서 을 테스트하고 your_branch안으로master(당신이 가지고 있다고 생각합니다.master체크아웃됨):

$ git diff master your_branch > your_branch.patch
$ git apply --check your_branch.patch
$ rm your_branch.patch

그것이 효과가 있어야 해요.

다음과 같은 오류가 발생하는 경우

error: patch failed: test.txt:1
error: test.txt: patch does not apply

즉, 패치가 성공하지 못했으며 병합하면 충돌이 발생합니다.출력이 없음은 패치가 깨끗하며 분기를 쉽게 병합할 수 있음을 의미합니다.


이렇게 해도 실제로 작업 트리가 변경되지는 않습니다(물론 패치 파일을 만드는 것 외에 나중에 안전하게 삭제할 수도 있습니다).git-apply 설명서에서 다음을 수행합니다.

--check
    Instead of applying the patch, see if the patch is applicable to the
    current working tree and/or the index file and detects errors. Turns
    off "apply".

나보다 더 똑똑하거나 기트에 경험이 많은 사람에게 주의하십시오. 만약 내가 여기서 틀리고 이 방법이 일반적인 합병과는 다른 행동을 보인다면 알려주십시오.이 질문이 존재했던 8년 이상 동안 아무도 이 명백한 해결책을 제안하지 않는 것은 이상해 보입니다.

정확히는 그렇지 않습니다.그러나 병합 후 결과가 자동으로 커밋되지 않도록 --no-commit 옵션을 사용할 수 있습니다.이러한 방식으로 커밋 트리를 조작하지 않고 병합을 검사하고 필요한 경우 실행 취소할 수 있습니다.

를 위해 request-pull git 명령을 사용합니다.로컬 또는 원격 리포지토리에서 아무것도 수행하지 않고 병합 시 발생하는 모든 변경 사항을 확인할 수 있습니다.

예를 들어 "feature-x"라는 분기를 마스터 분기로 병합하려고 합니다.

git request-pull master origin feature-x

에서는 (아무 작업도 하지 않고) 어떤 일이 발생하는지 요약하여 보여 줍니다.

The following changes since commit fc01dde318:
    Layout updates (2015-06-25 11:00:47 +0200)
are available in the git repository at:
    http://fakeurl.com/myrepo.git/ feature-x
for you to fetch changes up to 841d3b41ad:
----------------------------------------------------------------
john (2):
    Adding some layout
    Refactoring
ioserver.js            |   8 +++---
package.json           |   7 +++++-
server.js              |   4 +--
layout/ldkdsd.js       | 277 +++++++++++++++++++++++++++++++++++++
4 files changed, 289 insertions(+), 7 deletions(-)
create mode 100644 layout/ldkdsd.js

추가할 경우-p매개 변수, 모든 변경된 파일에 대해 Git diff를 수행한 경우와 마찬가지로 전체 패치 텍스트도 얻을 수 있습니다.

Git는 병합할 때 --ff-only 옵션을 도입했습니다.

보낸 사람: http://git-scm.com/docs/git-merge


--off-only

현재 HEAD가 이미 최신 상태이거나 병합을 빠른 전달로 확인할 수 없는 경우 0이 아닌 상태로 병합 및 종료를 거부합니다.

이렇게 하면 병합 및 빨리 감기가 시도되고, 병합할 수 없는 경우에는 중단되고 빨리 감기를 수행할 수 없다는 메시지가 표시되지만 작업 분기는 그대로 유지됩니다.빠르게 전달할 수 있는 경우 작업 분기에서 병합을 수행합니다.이 옵션은 다음에서 사용할 수도 있습니다.git pull따라서 다음을 수행할 수 있습니다.

git pull --ff-only origin branchA #See if you can pull down and merge branchA

git merge --ff-only branchA branchB #See if you can merge branchA into branchB

이것은 흥미로울 수 있습니다.설명서에서 다음을 참조하십시오.

병합을 시도하여 복잡한 충돌이 발생한 경우 다시 시작하려면 git merge --abort를 사용하여 복구할 수 있습니다.

하지만 순진한(하지만 느린) 방식으로 할 수도 있습니다.

rm -Rf /tmp/repository
cp -r repository /tmp/
cd /tmp/repository
git merge ...
...if successful, do the real merge. :)

(참고: /tmp로 복제하는 것만으로는 작동하지 않습니다. 커밋되지 않은 변경 사항이 충돌하지 않도록 하려면 복사본이 필요합니다.)

Git 로그를 사용하여 마스터 분기에서 피쳐 분기의 변경 내용을 확인

git log does_this_branch..contain_this_branch_changes

예: 마스터에 병합되었거나 병합되지 않은 피쳐 분기에 있는 커밋을 확인합니다.

git log master..feature_branch

제 해결책은 거꾸로 합쳐지는 것입니다.

분기를 원격 "대상" 분기로 병합하는 대신 해당 분기를 사용자의 분기로 병합합니다.

git checkout my-branch
git merge origin/target-branch

충돌이 있는지 확인하고 해결 방법을 계획할 수 있습니다.

그런 다음 git를 통해 병합을 중단할 수 있습니다.merge --abort또는 (충돌이 없고 병합이 발생한 경우) 이전 커밋으로 롤백합니다.git reset --hard HEAD~1

충돌만 보고 싶습니다. (으로 볼 수 없습니다.)diff3아직 GitHub에 있음).위의 답변을 크게 활용하여 다음과 같이 생각해 냈습니다.

git merge --no-commit --no-ff @{upstream}
git grep -l '<<<<<<< HEAD' | xargs -I % sh -c "echo -e '\n\e[93m%\n---\e[0m' && cat %"
git merge --abort

저는 PR을 확인하기 위한 것입니다.대체할 수 있습니다.@{upstream}어떤 가지든 간에

그게 누군가에게 도움이 되길 바랍니다.

B에서 A로 빠르게 전달하려면 Git 로그 B를 확인해야 합니다.A은(는) 아무것도 보여주지 않습니다.A는 B가 가지고 있지 않은 것이 없습니다.하지만 B가..A에는 여전히 충돌 없이 병합할 수 있는 것이 있습니다. 따라서 위의 두 가지 사항이 표시됩니다. 즉, 빨리 감기가 발생하므로 충돌이 발생하지 않습니다.

이것이 이론적으로는 주제에서 벗어난다는 것을 알지만, 실제로 구글 검색에서 여기에 도착하는 사람들에게는 매우 주제가 있습니다.

의심스러운 경우 Github 인터페이스를 사용하여 항상 풀 요청을 생성하고 정리 병합이 가능한지 여부를 확인할 수 있습니다.

작업 복사본의 임시 복사본을 만든 다음 이 복사본에 병합하여 둘을 구분합니다.

언급URL : https://stackoverflow.com/questions/6335717/can-git-tell-me-if-a-merge-will-conflict-without-actually-merging

반응형