자동 커밋없이 Git 병합


402

할 수 있습니까 git merge커밋없이을 있습니까?

"man git merge"는 다음과 같이 말합니다.

With --no-commit perform the merge but pretend the merge failed and do not autocommit,
to give the user a chance to inspect and further tweak the merge result before
committing.

하지만 사용하려고하면 git merge--no-commit그것을 여전히 자동 커밋. 내가 한 일은 다음과 같습니다.

$> ~/git/testrepo$ git checkout master
Switched to branch 'master'

$> ~/git/testrepo$ git branch
* master
  v1.0

$> ~/git/testrepo$ git merge --no-commit v1.0
Updating c0c9fd2..18fa02c
Fast-forward
 file1 |    1 +
 1 files changed, 1 insertions(+), 0 deletions(-)

$> ~/git/testrepo$ git status
# On branch master
# Your branch is ahead of 'origin/master' by 1 commit.
#
nothing to commit (working directory clean)

이후 git log에는 v1.0 브랜치의 모든 커밋이 마스터로 병합 된 것으로 나타납니다.

답변:


616

병합하는 동안 출력을 기록하십시오. Fast Forward

이러한 상황에서는 다음을 수행하려고합니다.

git merge v1.0 --no-commit --no-ff

7
모순이 있다면 어떨까요?
Jürgen Paul

20
@PineappleUndertheSea 빨리 감기는 충돌을 일으키지 않습니다. 빨리 감기없이 "실제"병합의 --no-commit경우 충돌이 발생하지 않는 경우에만 스위치가 적용됩니다. 충돌이 발생하는 경우 git은 자동 커밋하지 않습니다.
gronostaj

38
참고 : 변경 사항을 병합 한 다음 병합 한 모든 변경 사항을 수동으로 입력 한 것처럼 (전통적인 병합과 달리) 커밋 하려면 rm .git/MERGE_HEAD나중에 실행해야 하므로 git은 병합이 발생했음을 잊게됩니다.
Jonn

7
참고 : 성공적인 병합을위한 샘플 출력은 다음과 같습니다.Automatic merge went well; stopped before committing as requested
kevinarpe

6
분명히 git merge BRANCHENAME --no-commit --no-ff내 작업 공간을 자식 "MERGING"상태로 두었습니다. 이것이 정확히 무엇을하는지 확실하지는 않지만 단순 git stash save하고 git stash pop주기는 모든 것을 정상으로 되 돌리는 것처럼 보였습니다. 대상 브랜치에서 수정 된 파일 만 의도 한대로 제 위치에 있으며 더 이상 MERGING 상태가 아닙니다.
MoonLite

49

여기서 병합의 의미를 오해하고 있습니다.

이는 --no-commitMERGE COMMIT가 발생 하는 것을 방지하며 두 분기 분기 히스토리를 병합 할 때만 발생합니다. Git이 "fast-forward"병합임을 표시 한 후 Git은 분기에 이미 존재하는 커밋 만 순차적으로 적용하기 때문에 귀하의 예에서는 그렇지 않습니다.


12
그렇다고해서 혼란을 완전히 없애지는 못할 것입니다. 나는 이것이 문서가 실제로 분명한 하나의 (상대적으로 드문) 시간이라고 생각합니다. git help merge=> " --no-commit병합을 수행하지만 병합이 실패한 척하고 자동 커밋하지 마십시오. 커밋하기 전에 사용자에게 병합 결과를 검사하고 추가로 조정할 수있는 기회를 제공합니다. " 물론 핵심은 다음과 함께 사용하는 것입니다--no-ff
마이클

6
... 엄격한 용어에서 벗어나 다음과 같이 설명하는 것이 더 혼란스럽지 않을 수 있습니다. 실제로 병합이 없기 때문에 빨리 감기를 수행하는 "git merge"에는 병합 커밋이 없습니다. 사실 이것은 이상적인 상황입니다. 빨리 감기는 좋은 일이며이 "병합 커밋"을하지 않아도됩니다. 이것은 좋은 기본 동작이며 비활성화해서는 안됩니다. (올바로 말하면 빨리 감기는 병합의 한 유형이지만 "진정한 병합"이 아닙니다.)
michael

4
프로젝트의 정책과 관련이 있으며, 경우에 따라 주 분기에 기능 포함을 표시해야하기 때문에 추가 "병합 커밋"을 포함 / 강제하는 것이 유용합니다.
Samus_ 2016 년

7
...뭐. 좋아, 나는 자식이 거의 구할 수 없다고 생각한다. 이 답변 은 특히 Mercurial을 사용해 보라고 확신했습니다.
브라이언 고든

24

직접 입력 한 것처럼 한 번의 커밋에서 모든 변경 사항 만 커밋하려면 --squash도 수행합니다.

$ git merge --squash v1.0
$ git commit

1
이 효과는 다음과 같습니다git merge v1.0 --no-commit --no-ff
jpierson

2
아니요, 다른 효과. 스쿼시는 새로운 해시로 새로운 커밋을 만듭니다. 분기의 모든 커밋을 병합에 대한 하나의 커밋으로 결합합니다.
Kavi Siegel

23

나는이 방법을 선호하므로 희귀 한 매개 변수를 기억할 필요가 없습니다.

git merge branch_name

그런 다음 " #"커밋을 통해 브랜치가 앞서 있다고 말하면 이제 커밋을 해제하고 다음과 같이 변경 사항을 적용 할 수 있습니다.

git reset @~#

예를 들어, 병합 후 1 커밋보다 앞서면 다음을 사용하십시오.

git reset @~1

참고 : Windows에서는 따옴표가 필요합니다. ( 조쉬 가 의견에서 언급 한 바와 같이 ) 예 :

git reset "@~1"

4
창문에는 따옴표가 필요합니다.git reset "@~1"
Josh

1

지점에 커밋이 하나만 있으면 보통

git merge branch_name --ff
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.