IT

git-merge --dry-run 옵션이 있나요?

itgroup 2023. 4. 13. 20:45
반응형

git-merge --dry-run 옵션이 있나요?

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

난 아무것도 안 보여--dry-rungit-merge

바와 같이 「 」에 합니다.--no-commit커밋을 피하기 flag, fast-forward flag, fast-forward flag, fast-forward flag, fast-forward flag--no-ff다음과 같이 합니다.

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

단계적 변경을 검토하려면:

$ git diff --cached

또한 머지가 고속 전송 머지인 경우에도 머지를 취소할 수 있습니다.

$ git merge --abort

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

  1. 이치노를 들면, '먹다'와 같이요.git fetch origin master
  2. merge-base: git merge-base를 합니다.git merge-base FETCH_HEAD master
  3. merge-tree git merge-tree 실행:git merge-tree mergebase master FETCH_HEAD(parambase는 이전 단계에서 merge-base로 출력된16진수 ID입니다).

리모트 마스터를 로컬마스터와 Marge 하는 경우, 임의의 브랜치를 사용할 수 있습니다. git merge-tree는 메모리에서 머지를 실행하고 결과를 표준 출력으로 출력합니다.<< ★★★★★★★★★★★★★★★★★」>>또는 출력을 파일로 인쇄하여 확인할 수 있습니다. '다 시작하는 거예요

합병을 시도하기 전에 얼마나 큰 문제를 겪고 있는지 알고 싶으시겠죠Marge 실패 후 마지막 커밋으로 리셋하는 것은 비교적 간단하기 때문에 의도된 접근법이라고 해도 놀라지 않을 것입니다.

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

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

보시는 바와 같이 패치파일이 작성되고 --check로 테스트하여 오류가 없는지 확인한 후 패치파일을 삭제합니다.

수 있다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. 마스터에서 "Pre-master" 브랜치를 만듭니다.

  2. 원하는 모든 항목을 이 프리마스터에 병합합니다.
    그러면 마스터를 건드리지 않고도 병합이 어떻게 이루어졌는지 볼 수 있습니다.

    • 마스터 OR에 사전 마스터 병합
    • 모든 출시 지사를 마스터로 병합

어쨌든 @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과의 Marge를 취소하는 것은 매우 간단하며, 드라이런에 대해서도 걱정할 필요가 없습니다.

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

작업 스테이징 상기의 전에 그것들을 않은 는, 「」에 ).git reset상기의경우)를 참조)

현재 브랜치를 리모트브런치와 달리하면 풀/머지 실행 시 무엇이 변경되는지 알 수 있습니다.

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

꼭 그렇지는 않아요.그러나 --no-commit 옵션을 사용하면 병합 후 결과가 자동으로 커밋되지 않습니다.이렇게 하면 커밋트리를 건드리지 않고 마지를 실행 취소할 수 있습니다.

아직 아무도 패치 사용을 제안하지 않았다니 놀랍네요.

를 들어 '을 하면요.your_branchmaster이 있다고 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".

저보다 똑똑하거나 git에 경험이 많은 사람에게 주의하세요.제가 틀렸다면 알려주세요.이 방법은 일반 머지와는 다른 동작을 보여줍니다.8년 이상 이 질문이 존재해왔다는 것이 이상하게도 아무도 겉으로 보기에 명백한 해결책을 제안하지 않았다.

그러기 위해서는 request-pull git 명령을 사용합니다.이를 통해 로컬 또는 원격 저장소에서 아무 작업 없이 병합할 때 발생하는 모든 변경 사항을 볼 수 있습니다.

예를 들어, "feature-x"라는 이름의 브런치를 마스터 브런치에 Marge한다고 가정합니다.

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


--ff-only(오프만)

현재 HEAD가 이미 최신 상태이거나 Marge를 Fast Forward로 해결할 수 없는 경우를 제외하고 0이 아닌 상태로 병합 및 종료를 거부합니다.

이렇게 하면 Marge와 Fast Forward가 시도되고, 그렇지 않으면 Fast Forward를 수행할 수 없다는 메시지가 나타나지만 작업 중인 브랜치는 변경되지 않습니다.FastForward가 가능한 경우 동작 중인 브랜치로 Marge가 실행됩니다.이 옵션은 다음 날짜에도 사용할 수 있습니다.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

내 해결책은 거꾸로 병합하는 거야

리모트 「타깃」브런치에 브랜치를 Marge 하는 대신에, 그 브랜치를 자신의 브랜치에 Marge 합니다.

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/501407/is-there-a-git-merge-dry-run-option

반응형