Git, CocoaPods, Xcode, Shell/Git

[Git - terminal] git 특정 부분만 stage로 올리는 방법 (git status, git diff, git add -p)

jake-kim 2023. 5. 8. 01:25

특정 부분만 stage로 올리기

  • 먼저 git diff로 변경된 부분을 확인
  • git add -p를 사용하여 특정 부분만 stage로 올리기

 

git status

  • 현재의 git 상태를 확인하고, 변경된 파일도 같이 확인
ExGit% git status
On branch main
Changes not staged for commit:
  (use "git add <file>..." to update what will be committed)
  (use "git restore <file>..." to discard changes in working directory)
	modified:   ExGit.xcodeproj/project.xcworkspace/xcuserdata/gimjong-gwon.xcuserdatad/UserInterfaceState.xcuserstate
	modified:   ExGit/Base.lproj/Main.storyboard
	modified:   ExGit/ViewController.swift

git diff

  • 변경된 내용 확인 명령어
  • git diff: 현재 수정상태 확인
    • 명령어 실행 시 vim모드에 진입하고, enter를 치거나 d(down)을 눌러서 아래로 보기 위로갈려면 u(up) 눌러서 이동
    • 확인 후 q를 눌러서 빠져나오기
% gif diff

  • git diff {파일이름}: 특정파일만 diff 보고 싶은 경우 사용
    • 특정파일 파악은 git status를 활용하여 확인
ExGit% git diff ExGit/Base.lproj/Main.storyboard

  • 기타 옵션
    • git diff --staged: commit된 파일 vs add된 파일
    • git diff {해쉬1} {해쉬2}: commit간 비교 
    • git diff {브랜치1} {브랜치2}: 브랜치간 비교

git add -p

  • git add -p를 실행할 경우, git은 파일의 변경 내용을 chunk단위로 분리
  • interactive (대화식으로 적용) 형태로 반영할 수 있고 chunk에서 원하는 부분을 선택이 가능하며 이때 stage로 올리기가 가능
  • (git add -p 설명은 git add --help에서 참고)
% git add --help

       -p, --patch
           Interactively choose hunks of patch between the index and the work
           tree and add them to the index. This gives the user a chance to
           review the difference before adding modified contents to the index.

           This effectively runs add --interactive, but bypasses the initial
           command menu and directly jumps to the patch subcommand. See
           “Interactive mode” for details.

ex) print("test")라는 코드와 다른 부분들을 추가했는데, print("test")만 stage에 올리고 싶은 경우?

  • git add -p 실행하여 patch모드 시작

  • interactive가 시작되면 특정 옵션 수행 가능
[1/2] Stage this hunk [y,n,q,a,d,j,J,g,/,e,?]?
  • 옵션의 종류
    • y: (yes) 해당 청크를 stage에 추가 o
    • n: (no) 해당 청크를 statge에 추가 x, 다음 청크로 이동
    • q: (quit) 종료
    • a: (all) 현재 파일의 모든 변경 내용을 stage에 추가 o
    • d: (delete) 현재 청크를 stage와 같이 삭제
    • j: (jump) 해당 청크를 stage에 올리고 다음 청크로 이동
    • J: (Jump)해당 청크와 아래 청크를 stage에 올리고 다음 청크로 이동
    • g: ()청크를 찾을 때까지 파일의 맨 위로 이동
    • /: 검색 수행 
    • e: (edit) 현재 청크를 편집
    • ?: 헬프

(이 정보는 옵션에 없는 아무런 알파벳을 입력하면 설명이 나옴)

  • 유용한 옵션
    • y: (yes) 해당 청크를 stage에 추가 o
    • n: (no) 해당 청크를 statge에 추가 x, 다음 청크로 이동
    • e: (edit) 현재 청크를 편집
    • q: (quit) 종료

git add -p로 특정 chunk만 올리기

ex) print("test")라는 코드와 다른 부분들을 추가했는데, print("test")만 stage에 올리기

  • git add -p로 patch모드 실행
  • n을 입력해가며 print("test") 청크 확인
  • print("test")가 보이면 a를 입력하여 stage에 추가
  • 완료한 경우 q로 vim모드 빠져나오기

  • git status로 stage로 올라간 파일 확인
    • 만약 파일을 잘못 올려서 unstage하려면, git restore --staged {파일이름} 또는 git restore --staged .로 복구

print("test") 파일 부분이 잘 stage로 올라감

git add -p로 특정 라인만 stage로 올리기

ex) swift에서 .storyboard파일에서 특정 옵션만 수정해도 여러가지의 변경사항이 생기는데, 특정 라인 변경사항만 올리고 싶을때 반영방법

- UILabel의 텍스트의 내용을 변경한 부분의 라인만 stage로 올리기

  • git add -p로 patch모드 실행
  • n을 입력해가며 변경사항이 있는 청크 확인
  • e를 입력하여 편집모드에 들어간 후 변경하고 싶은 라인만 살리고 다른부분은 기존 내용과 동일하게 설정
  • a를 입력하여 stage에 추가
  • 완료한 경우 q로 vim모드 빠져나오기

(e를 입력하여 편집모드에 들어가서 필요한 라인만 살리는 화면)

 

* 수정했을때 포멧이 틀리면 아래처럼 에러가 발생하고 y를 눌러 e모드를 다시 실행가능

error: 'git apply --cached' failed
Your edited hunk does not apply. Edit again (saying "no" discards!) [y/n]?

  • git diff --staged로 변경된 부분 확인

* vim 모드 팁 

  • 방향키: h, j, k, l
  • 한줄 삭제: dd
  • 해당 커서부터 마지막위치까지 삭제: shift + d
  • 되돌리기: u
  • 해당 커서에 있는 문자 삭제: x

* 참고

https://git-scm.com/book/ko/v2/Git-%EB%8F%84%EA%B5%AC-Reset-%EB%AA%85%ED%99%95%ED%9E%88-%EC%95%8C%EA%B3%A0-%EA%B0%80%EA%B8%B0

https://velog.io/@byeol4001/git-diff-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0