2016-06-06 21 views
3

병합 명령을 실행하기 전에 특정 병합이 "빨리 감기"를 통해 해결되는지 여부를 알고 싶습니다.빨리 감기를 통해 병합이 해결되는지 확인하십시오.

특히 "fast-forward"(--no-ff 옵션 사용)를 통해 병합을 해결하지 못하도록 요청할 수 있음을 알고 있습니다. 또는 빨리 감기 (--ff 옵션 사용) 만 병합을 해결할 수 있습니다.

가끔은 특정 병합이 실행되기 전에 빨리 감기를 통해 해결할 것인지를 알고 싶습니다. 나는 역사 트리를 파헤쳐서 이론적으로 해결할 수 있음을 깨닫는다. 또한 병합을 실행하고 어떤 일이 발생 하는지를 알 수 있지만, 병합을 취소해야 할 때 병합을 다른 방법으로 해결하기를 원한다고 결정하면 문제가됩니다 (분기 태그를 다시 부름으로써 문제가됩니다). ref-log에서) 그리고 다시해라. 질문 : (Is there a git-merge --dry-run option?) 병합에 병합 충돌이 있는지 살펴 보는 것이 아니라 빨리 감기를 통해 해결할 수있는 병합 문제가 아닌지 확인하는 것입니다.

+0

[가능한 자식이 있습니까? -merge --dry-run option?] (http://stackoverflow.com/questions/501407/is-there-a-git-merge-dry-run-option) – Vishwanath

답변

2

요약 : git merge-base --is-ancestor은 하나의 커밋이 다른 커밋의 조상인지 테스트합니다. 커밋은 그 자체의 조상으로 간주되며 특히 근친상간의 기이 한 형태입니다 (아마도 :-)). 현재 브랜치 (HEAD)가 다른 커밋의 조상 인 커밋을 가리킬 때 브랜치 레이블은 git merge에 의해서만 빨리 감기 될 수 있으므로 이것을 사용하여 git merge이 빨리 감기 작업을 수행 할 수 있는지 여부를 결정할 수 있습니다.

답변으로 게시되기를 원했던 것처럼 보입니다. 따라서 전 세계의 git 구성에 넣을 수있는 작동하는 별칭으로 변환했습니다.별명은 약간 길고 복잡하고 그것은 아마 잘라 내기 및 붙여 넣기하여 자식 설정 별칭 섹션에이를 위해 최선을 다 할 것입니다 : 더에, 여기

canff = "!f() { if [ $# -gt 0 ]; then b=\"$1\"; git rev-parse -q --verify \"$b^{commit}\" >/dev/null || { printf \"%s: not a valid commit specifier\n\" \"$b\"; return 1; } else b=$(git rev-parse --symbolic-full-name --abbrev-ref @{u}) || return $?; fi; if git merge-base --is-ancestor HEAD \"$b\"; then echo \"merge with $b can fast-forward\"; else echo \"merge with $b cannot fast-forward\"; fi; }; f" 

쉘 스크립트로 작성 같은 일이다 읽을 패션, 일부 논평 :

#! /bin/sh 
# 
# canff - test whether it is possible to fast-forward to 
# a given commit (which may be a branch name). If given 
# no arguments, find the upstream of the current (HEAD) branch. 

# First, define a small function to print the upstream name 
# of the current branch. If no upstream is set, this prints a 
# message to stderr and returns with failure (nonzero). 
upstream_name() { 
    git rev-parse --symbolic-full-name --abbrev-ref @{u} 
} 

# Now define a function to detect fast-forward-ability. 
canff() { 
    local b # branch name or commit ID 

    if [ $# -gt 0 ]; then # at least 1 argument given 
     b="$1" 
     # make sure it is or can be converted to a commit ID. 
     git rev-parse -q --verify "$b^{commit}" >/dev/null || { 
      printf "%s: not a valid commit specifier\n" "$b" 
      return 1 
     } 
    else 
     # no arguments: find upstream, or bail out 
     b=$(upstream_name) || return $? 
    fi 
    # now test whether git merge --ff-only could succeed on $b 
    if git merge-base --is-ancestor HEAD "$b"; then 
     echo "merge with $b can fast-forward" 
    else 
     echo "merge with $b cannot fast-forward" 
    fi 
} 

쉘 스크립트는 단지 그것을 구동하기 위해 메인 섹션을 필요로 별칭 후 f에 대한 호출입니다. 별칭 자체는 canffupstream_name의 모든 내용을 한 줄로 간단하게 삽니다. Git의 config 파일 규칙은 전체 별칭을 큰 따옴표로 인용해야하며, 차례로 모든 내부 큰 따옴표를 백 슬래시 - 큰 따옴표로 변환해야합니다.

은 (그것은 쓰기 실제로 가능 (별칭으로,이 쉘의 때마다 새로운 인스턴스를 발사 이후는, 그래서 변수 이름의 위생. 중요하게는 local b 문을했다) 별칭을 여러 줄로 사용합니다. 각 줄 바꿈 앞에 백 슬래시를 붙이기 만하면됩니다. 그러나이 별칭은 너무 복잡하여 그 것처럼 보이지 않으므로 하나의 큰 줄을 남겨 두었습니다.)

0

비슷한 있습니다 만, 꽤 같은, 문제는 여기에 질문 : 당신이 찾고있는 무슨 수 있습니다처럼 Is there a git-merge --dry-run option?

첫 번째 대답은 보인다.

특히 --no-commit 플래그가있는 merge을 사용하고 충분히 보았을 때 --abort을 사용하면 돌아가서 실제 병합을 수행하고 싶을 때 사용하십시오.

1

git merge-base <branch1> <branch2>git rev-parse <branch1>과 같은지 테스트 할 수 있습니다. 동등한 경우 ff 병합 또는 git merge <branch1> <branch2>을 실행할 때 이미 최신 상태입니다. 그렇지 않은 경우, 비 -ff 병합입니다.

function isff(){ 
a=$(git merge-base $1 $2) 
b=$(git rev-parse $1) 
c=$(git rev-parse $2) 
if [[ "$b" == "$c" ]] || [[ "$a" == "$c" ]];then 
    echo merge dry run: already up-to-date 
    return 
fi 
if [ "$a" == "$b" ];then 
    echo merge dry run: a fast forward merge 
else 
    echo merge dry run: a non fast forward merge 
fi 
} 

isff master topic

+1

더 간단합니다 ("제공하지 않겠지 만"이미 최신 "경우,"빨리 감기 "할 수 있음) : 하나의 테스트 수행, 'git merge-base --is-ancestor HEAD 타겟 && echo 빨리 감기 '할 수 있습니다. – torek

+0

저는 이미 최신의 병합 사례에 대해 걱정하지 않습니다. 이것은 이미 일반적으로 나에게 분명합니다. @ 토렉은 내 문제에 대한 최선의 해결책을 가지고있다. 그걸 완전한 답으로 써 주시면 받아 들일 것입니다. – uayebforever

0

는 @ 애쉬 윈 - 나이 르가 참조하는 질문을 보면, 나는 내가 믿는 것은 해답이 발견했다.

git checkout MY_BRANCH 
git merge OTHER_BRANCH 

들어

git branch --contains MY_BRANCH 

의 출력은 OTHER_BRANCH와 병합 빨리 감기를 통해 해결 될 수 OTHER_BRANCH 포함 된 경우.

+0

이 명령은 모든 사용 사례를 다루지는 않습니다. – yorammi