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 .로 복구
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://velog.io/@byeol4001/git-diff-%EC%82%AC%EC%9A%A9%ED%95%98%EA%B8%B0