ProGit를 찬찬히 따라 공부하는 것도 좋지만
하다보니 막상 사용해야하는 소스 파일, 브랜치 설정 및 충돌과 그 해결을 내가 임의로 만들어서라도
직접 경험해 봐야 한다는 생각이 들었다 (백문이불여일타'란 말처럼! 재미질 것 같은 사심도 있고:-))
특히, 내가 사용하는 IDE인 Android Studio에서의 Git 사용은 GitPro에 없기에
내가 간단한 예제들이라도 만들어 시험해보고자 한다.
일단 Git Status를 테스타하는 예제부터~
Android Studio에서 프로젝트 파일들의 Git 상태 변경하기
Example Case) 아래와 같은 에러가 발생하며 원인과 대책은 아래와 같다.
아래 대책(ⓐ,ⓑ)을 작업하며 Android Studio에서 Git 상태 변경하고자 한다.
- 원인 : '.gitignore' 파일에서 gradle wrapper 관련 파일 ignore 처리하여 Gradle 버전 충돌 빌드 실패됨
(Wrapper가 없어 프로젝트 해당 버전의 Gradle을 얻어오지 못함)
- 대책 :
ⓐ '.gitignore' 파일에서 gradle wrapper 관련 파일들이 ignore되지 않도록 수정
ⓑ gradle wrapper 관련 파일을 저장소에 추가
+) gradle wrapper 관련 파일(2개) : gradle/wrapper/ 경로 내 gradle-wrapper.jar, gradle-wrapper.properties
1) 현재 상태 Git의 Status는 아래와 같다.
- '.gitignore'파일에 gradle wrapper 관련 파일들이 포함되어 있어 해당 파일들을 ignore 처리된다.
+) '.gitignore'의 ignore 처리 관련 설명 포스팅
- '.gitignore'파일은 아무것도 수정하지 않은 Unmodified상태로 스튜디오에서 검정색 텍스트로 파일명표시된다.
- ignore 처리된 파일들은 아래 이미지처럼 Git이 ignore하고 있어 옅은 황녹색 텍스트로 파일명 표시된다.
ㄴ> 파일 : 'gradle-wrapper.jar', 'gradle-wrapper.properties'
[현 시점에서 $ git status]
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
2) 대책 ⓐ대로 '.gitignore' 파일에서 gradle wrapper 관련 파일들이 ignore되지 않도록 수정
- 로컬의 '.gitignore'파일이 수정되어 Modified상태로 파랑색 텍스트로 파일명표시된다.
- gradle wrapper 관련 파일들도 더 이상 ignore되지 않아 Untracked상태 파일로 황색 텍스트로 파일명표시된다.
[현 시점에서 $ git status]
$git status [-u 옵션] : Untracked 상태 폴더의 하위 파일까지 모두 보여준다.
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
gradle/
no changes added to commit (use "git add" and/or "git commit -a")
$ git status -u
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
gradle/wrapper/gradle-wrapper.jar
gradle/wrapper/gradle-wrapper.properties
no changes added to commit (use "git add" and/or "git commit -a")
Git은 Untracked, Modified 상태인 파일들을 stage가능하므로 아래 3개의 파일이 모두 $git add 가능하다.
- Modified 상태 : 기존에 있던 파일이 수정된 '.gitignore'파일
- Untracked 상태 : ignore처리되지 않도록 수정하여 Git에서 확인가능해진
'gradle/wrapper/gradle-wrapper.jar', 'gradle/wrapper/gradle-wrapper.properties' 파일들
3) 스튜디오에서 파일 stage(=add)하려면
파일 선택 > (우측 마우스 버튼 > Git > Add) 또는 ('alt + ctrl + A'단축키)
4) 스튜디오에서 Modified, Untracked파일 stage(=add)된 경우
- Modified 상태인 '.gitignore'파일 stage한 경우 (Modified -> Staged), 스튜디오에서 텍스트 색상 및 아무 변화없다.
- Untracked 상태인 파일 stage한 경우 (Modified -> Staged) : 스튜디오에서 초록색 텍스트로 파일명표시된다.
(아래 'gradle/wrapper/gradle-wrapper.jar', 'gradle/wrapper/gradle-wrapper.properties' 참조)
[현 시점에서 $ git status]
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes to be committed:
(use "git reset HEAD <file>..." to unstage)
modified: .gitignore
new file: gradle/wrapper/gradle-wrapper.jar
new file: gradle/wrapper/gradle-wrapper.properties
※ ★안드로이드 스튜디오에서 Staged상태와 Modified 상태의 파일이 구분되지 않는다 ※
- (Modified -> Staged)로 변경되도 구분되는 변화가 없다. cf) 다른 상태 변화의 경우 파일 텍스트 색상 변경되어 상태 구분 가능
- Modified, Staged 상태 파일 모두 Commit이 바로 가능하다 cf) Git에서는 Staged 상태만 커밋가능하다.
∴ Modified, Staged 상태 구분되지 않으므로 '파일 A'를 Modified -> Staged -> Another modified 해도
스튜디오는 마지막 수정버전(Modified)를 커밋시킨다
cf) Git에서는 Staged된 '파일 A'와 Another modified된 '파일 A'가 모두 존재
(커밋은 Another modified된 '파일 A'을 $git add했을 때 또는 현 상태의 Staged된 '파일 A'만 가능하다.)
5) 스튜디오에서 Staged 상태 파일 되돌리기 (Added 상태 -> Unstaged)
ㄴ> 'VCS > Git > Reset Head...' 선택 > 'Reset Heand' 팝업 > To Commit 칸에 "HEAD" 기재 확인 > [Reset]버튼 선택 >> ※ 주의) 모든 Added상태 파일이 stage 전 상태로 복구된다.
ㄴ> '$ git reset HEAD <특정파일명>' 명령은 특정파일만 Staged 상태 되돌릴 수 있는데 스튜디오에서 특정파일만 되돌리기 안된다 ㅜㅜ
Resetting HEAD...: Failed to resolve 'HEAD .gitignore' as a valid revision.
[현 시점에서 $ git status]
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
gradle/
no changes added to commit (use "git add" and/or "git commit -a")
5-1) '커밋하지 않은 파일'을 모두 이전 상태(Untracked or Unmodified)로 되돌리기 = 'Rollback'
- 안드로이드 스튜디오에서 제공하는 'Rollback' 기능
#1,2) 수정된 파일 선택 > (crtl+alt+z) 또는 (마우스 우측 버튼 > Git > Rollback)
> 'Rollback Changes'팝업에서 되돌릴 파일 확인 > [Rollback] 버튼 선택
#3) 상단 툴 'Git: '에서 Rollback아이콘 선택 > 'Rollback Changes'팝업에서 되돌릴 파일 확인 > [Rollback] 버튼 선택
6) 스튜디오에서 Modified, Staged 상태 파일 커밋하기 (Modified 상태 -> Commited)
- 상단 'Git:' 툴바 > 커밋아이콘 [✓] 선택 > 'Commit Changes'팝업 창에서 커밋파일 설정 및 확인
> [Commit]버튼 선택
[현 시점에서 $ git status]
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
6-1) 스튜디오에서 커밋과 동시에 Push하기
- 상단 'SVN:' 툴바 > 커밋아이콘 [✓] 선택 > 'Commit Changes'팝업 창에서 커밋파일 설정 및 확인
> [Commit]버튼을 [Commit and Push]버튼으로 변경 후 선택
7) 스튜디오에서 Commited 파일 커밋메시지만 수정하기 [2가지 방법]
#1) 스튜디오 하단 툴에서 'Git' 선택 > 'Git'툴 상단에서 'Log: all' 선택 > 'Local'을 선택
> 로컬 커밋사항 중 수정할 커밋 선택 > 오른쪽 마우스 버튼
> 'Edit Commit Message.. (F2)' 선택 > 커밋메시지 수정
#2) 스튜디오 하단 툴에서 'Terminal' 선택 > $ git commit --amend 명령어 입력
> 마지막 커밋사항이 에디터로 열림 > 커밋메시지 수정 후 저장하고 파일닫기!
E:\mime\git\GitStudy>git commit --amend
[main eaab1d9] [ProjSetting] Gradle 버전 충돌 문제 발생하여 Wrapper 관련 파일 추가 - Wrapper 관련 파일 : 'gradle/wrapper/gradle-wrapper.jar', 'gradle/wrapper/gradle-wrapper.properties'
Date: Tue Aug 3 18:32:34 2021 +0900
3 files changed, 6 insertions(+), 6 deletions(-)
create mode 100644 gradle/wrapper/gradle-wrapper.jar
create mode 100644 gradle/wrapper/gradle-wrapper.properties
8) 스튜디오에서 Commited 상태 파일 되돌리기 (Commited 상태 -> Untracked, Modified 상태)
'VCS > Git > Reset Head...' 선택 > 'Reset Heand' 팝업 > To Commit 칸에 "HEAD^"로 기재 > [Reset]버튼 선택
ㄴ> ※ 주의) 모든 Added상태 파일이 stage 전 상태로 복구된다.
ㄴ> 'Reset Heand' 팝업에서 [Validate]버튼 선택 시 아래화면과 같이 변경했던 사항 확인 가능
ㄴ> 새로 추가된 후 커밋된 파일은 -> Untracked 상태로 되돌려 진다.
ㄴ> Modified 상태 파일은 -> Modified 상태로 되돌려 진다.
[$ git status 전 후 비교]
$ git status
On branch main
Your branch is ahead of 'origin/main' by 1 commit.
(use "git push" to publish your local commits)
nothing to commit, working tree clean
$ git status
On branch main
Your branch is up to date with 'origin/main'.
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git checkout -- <file>..." to discard changes in working directory)
modified: .gitignore
Untracked files:
(use "git add <file>..." to include in what will be committed)
gradle/
no changes added to commit (use "git add" and/or "git commit -a")
9) 스튜디오에서 커밋과 동시에 Push하기
: 상단 'SVN:' 툴바 > Push아이콘 [↗] 선택
> 'Push Commits to <프로젝트명>'팝업 창에서 Push할 커밋사항 설정 및 확인 > [Push]버튼 선택
[현 시점에서 $ git status]
$ git status
On branch main
Your branch is up to date with 'origin/main'.
nothing to commit, working tree clean
추가 공부할 사항들
★ 스튜디오의 'Git'탭을 통한 원격과 로컬 커밋 및 브랜치 설정이 가능하다.
★ 스튜디오의 한정적인 Git 파일의 상태변경 및 복구는 Terminal에 직접 Git명령어를 입력하므로써 디테일하게 상태변경 가능하다.
END!
스터디 도움 참조 블로그 (References)