두 개의 커밋을 하나의 커밋으로 결합하려면 어떻게해야합니까?


102

2 커밋이있는 'firstproject'지점이 있습니다. 이 커밋을 제거하고 단일 커밋으로 표시하고 싶습니다.

명령이 git merge --squash유망하게 들리지만 git merge --squash터미널을 실행 하면 명령에 대한 옵션이 표시됩니다. 올바른 명령은 무엇입니까?

Commit 1:
Added 'homepage.html'
Added 'contacts.html'

Commit 2:
Added 'homepage.php'
Added 'homepage.php'
Deleted 'homepage.html'
Deleted 'contacts.html'

나는 그것이 올바른 명령이라고 생각하지 않습니다. 또한 그렇게 커밋을 변경할 수 있을지 의심됩니다.
BSull

아니, 여러 커밋을 하나의 커밋으로 변경할 수 있습니다. git-scm.com/book/en/Git-Tools-Rewriting-History 내 질문은 특정 명령에 관한 것입니다.
Don P

@BSull 원하는 방식으로 커밋을 변경할 수 있습니다. 문자 그대로 언제든지 완전히 편집 할 수 있습니다. 다른 사람들과 코드를 공유하는 경우, 그렇게하면 기록이 다시 작성되고 다른 사람들과 다른 지점에서 효과적으로 작업 할 수 있습니다.
meagar

이것은 속지 말았어야했다. 사실, 다른 하나는 너무 광범위하게 닫혔어야합니다. 이것이 속임수로 표시된 또 다른 질문은 이전 리베이스를 포기하는 것과 관련이 있으므로 불필요하게 복잡합니다.
Evan Carroll

답변:


145

대화식 리베이스git rebase -i 를 수행 하려고합니다 .

현재 경우 당신의 "커밋 1"과는 병합 할 커밋 이전이 커밋, 당신은 실행할 수있다 "2 커밋" git rebase -i HEAD~2모두가 REBASE이 통과 할 커밋 목록 편집기를 생성 것이다. "pick"으로 시작하는 두 줄이 표시되어야합니다. 스 쿼싱을 계속하려면 두 번째 줄의 첫 번째 단어를 "pick"에서 "squash"로 변경합니다. 그런 다음 파일을 저장하고 종료하십시오. Git은 첫 번째 커밋을 두 번째 마지막 커밋으로 스쿼시합니다.

이 프로세스는 브랜치의 기록을 다시 작성합니다. 코드를 어딘가에 밀어 넣는 경우 코드를 git push -f공유하는 사람은 변경 사항을 가져 오기 위해 몇 가지 수고를 거쳐야합니다.

문제의 두 커밋 이 브랜치의 마지막 두 커밋 이 아니면 프로세스가 약간 다릅니다.


2
어떻게하나요 Then write your file, and quit? Android Studio Terminal, git 콘솔 자체를 사용하거나 SourceTree 소프트웨어로 git 콘솔을 열었습니다. 그러나 저장하고 종료하는 방법은 무엇입니까?
Dr.jacky

1
브랜치의 마지막 두 커밋이 아닌 두 커밋을 결합하는 방법은 무엇입니까?
Weishi Zeng

1
@meagar 나는 그것이 의미가 있다고 생각합니다 ...이 문제 (이 사본)를 확인하면 '방향'을 스쿼시하는 것이 큰 차이를 만들었고 전체 문제의 뿌리였습니다 ( '에 대한 약 200 개의 업보가있는 첫 번째 댓글 참조 길을 잘못 ') 부수 - stackoverflow.com/a/2568581/43453
PandaWood

1
@PandaWood 당신은 대답을 잘못 읽고 있습니다. 첫 번째 방법은 다르지 않은 단순한 잘못 이었습니다 . 당신은 할 수 있습니다 , 스쿼시 뒤로, 그것은 아무 의미가 이전 한 새에 커밋 부수 생각하지 할 수 있습니다,하지만 당신은 경우 는 동일한 작업이 될 것입니다.
meagar

1
"두 번째 줄의 첫 번째 단어 변경"-두 번째 줄의 내용을 이해했습니다.
Andrew Torr

75

나 같은 건망증을위한 게으른 간단한 버전 :

git rebase -i HEAD~3 또는 3 대신 많은 커밋.

이것을 돌려

pick YourCommitMessageWhatever
pick YouGetThePoint
pick IdkManItsACommitMessage

이것으로

pick YourCommitMessageWhatever
s YouGetThePoint
s IdkManItsACommitMessage

그리고 변경 사항을 저장하기 위해 esc누른 위치에서 몇 가지 작업을 수행 enter하십시오. [1]

다음 화면이 나타나면 쓰레기 # 줄 [2]을 제거하고 새로운 커밋 메시지 또는 무언가를 생성하고 동일한 escape enter작업을 수행하십시오. [1]

커밋이 적습니다. 아니면 당신은 모든 것을 깨뜨 렸습니다.


[1]-또는 git 구성에서 작동하는 모든 것. 이것은 내 설정을 고려할 때 효율적인 시퀀스입니다.

[2]- # this is your n'th commit이 메시지 바로 아래에 원래 커밋과 함께 몇 번 과 같은 내용 이 표시됩니다. 이 줄을 제거하고 1로 결합하는 n 개의 커밋의 의도를 반영하는 커밋 메시지를 만들고 싶습니다.


1
매우 간결한 솔루션-감사합니다. s여기서 사용되는 개요는 스쿼시를 의미합니다. 커밋을 사용하지만 이전 커밋과 결합하려면
UrbanConor

2커밋 만 있고 동일한 2커밋 을 결합하려는 경우 git reset --soft HEAD~git commit --amend.
scrutari

@Stachu이 후에 push를 명령하면 pull 및 merge를 요청합니다. 그것을 피하기 위해 무엇을 할 수 있습니까?
Abhay Koradiya 20.12.15

끌어오고 병합하지 않는 이유는 무엇입니까?
Stachu

23
  1. 브랜치를 확인하고 모든 커밋의 수량을 계산하십시오.
  2. git bash를 열고 다음과 같이 작성하십시오. git rebase -i HEAD~<quantity of your commits>(ie git rebase -i HEAD~5)
  3. 열린 txt파일에서 첫 번째 커밋 (맨 위에있는)을 제외한 모든 커밋 picksquash대한 변경 키워드 입니다. 맨 위를 변경하고 reword(다음 단계에서이 커밋에 대한 새 주석을 제공함을 의미 함) 저장을 클릭합니다! vim의 경우를 누른 esc다음 Enter 를 눌러 저장 wq!하고 Enter를 누르십시오.
  4. 의견을 제공하십시오.
  5. Git을 열고 "모두 가져 오기"를 수행하여 새 변경 사항을 확인하십시오.

끝난


첫 번째는 vim에서 사용하는 방법을 알려줍니다. 고마워
호 루옹
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.