일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- Android
- dart
- Android P
- Flutter TextField
- Kotlin
- flutter firestore
- Python
- C/C++
- android push
- 프로그래머스
- RxAndroid
- kodility
- Django REST Android
- RxJava
- UWP
- Django REST
- C++
- Django REST framework
- livedata
- 안드로이드
- C
- 코틀린
- Java
- mfc
- Rxjava2
- FLUTTER
- android architecture component
- 안드로이드 구글맵
- NDK
- 알고리즘
- Today
- Total
개발하는 두더지
[Git] Git Bash로 github 원격저장소에 연동 본문
Git을 사용하기 위해서 일단 설치해야합니다. 아래 페이지에 들어가 다운로드 & 설치를 진행합니다.
Git Bash 실행
git --version 으로 git 설치 및 버전확인
환경설정할때 이름과 이메일을 등록해야한다
git config --global user.name "KIM"
git config --global user.email "rlawlgns077@naver.com"
잘 설정됐는지 확인하는 방법
git config --list
폴더 이동할때
cd /d/git/xxx/xx 등으로 이동해야 사용한다. ( d:\\git\xxx\xx )
현재 폴더를 git 로컬 저장소로 등록한다
git init
그러면 폴더 옆에 <master> 라고 표시된다
로컬저장소는 git이 관리하는 3그루의 나무로 구성되있습니다.
첫번째 나무인 작업 디렉토리는 실제 파일들로 이루어져 있고,
두번째 나무인 인덱스는 준비영역의 역할을 하며,
세번째 나무인 헤드는 최종 확정본(커밋) 을 나타냅니다.
즉,
add를 하면 인덱스에 추가하는 것이며
commit을 하면 헤드에 추가해서 실제로 변경 내용을 확정합니다.
마지막으로
push를해서 원격 저장소에 반영을 합니다.
로컬 저장소에 먼저 등록을 해야 원격 저장소에 저장할 수 있다.
git add [폴더이름] or [파일명] 또는 git add . ( 현재 폴더의 모든 파일을 인덱싱한다)
커밋을 해보자
git commit -m 'initial commit'
원격 저장소를 추가해보자
git remote
위를 입력하면 처음에는 원격저장소에 연결된적이 없어서 아무것도 안나온다
github 사이트에서 new repository를 해서 새로운 프로젝트를 생성한다
git remote [단축이름] [url]
git remote add origin https://github.com/pennya/TServer.git
이제 github 사이트의 repository에 연결됐다.
git push [리모트 저장소이름 ] [브랜치 이름]
git push origin master
그러면 데이터 전송창이 뜨면서 github에 잘 올라감을 확인할 수 있다.
폴더를 삭제해보자
git rm -r blog 또는 git rm myfile.txt
그리고 커밋한다
git commit -m 'delete blog'
그리고 원격저장소에 다시 커밋한다
git push origin master
파일이 추가없이 수정된 경우
git add .
해서 변경된것을 로컬저장소에 알리고
git commit -m 'modify file'
라고 입력하면 로컬저장소에 커밋됐다.
git push origin master
하면 다시 원격저장소에 커밋된다.
.idea 제외하기
git rm --cached -r TServer/.idea or git rm -r --cached .
하면 삭제되었고 unTracked 한 폴더로 구분된다.
echo '.idea' >> .gitignore
echo '__pycache__' >> .gitignore
echo '.pyc' >> .gitignore
ignore 리스트
*.egg-info
*.pot
*.py[co]
.tox/
__pycache__
MANIFEST
dist/
docs/_build/
docs/locale/
node_modules/
tests/coverage_html/
tests/.coverage
build/
tests/report/
하면 .git 아래 gitignore 파일이 생성되고 안에 .idea 라고 써있다.
git add .gitignore
을 하면 제외목록이 저장된다.
다른 PC에서 github 원격저장소의 TServer checkout 하기
다른 PC에서 git을 설치한다.
git bash를 실행하여
git init으로 폴더를 지정하고
git remote TServer https://github.com/pennya/TServer.git 을 통해 원격지와 연결한다.
git pull TS master 를 하면
다운로드가 받아진다.
git clone 은 3개의 커맨드 명령과 같다.
git init
git remote origin url
git pull origin master
이와같이 작업을 하는 도중 새로운 업데이트 건이 있어서 먼저 pull를 하려면 이와 같은 에러메시지가 출력된다.
이럴때 현재 작업하고 있는 소스코드를 잠시 다른 저장소에 저장했다가 pull을 하면된다
그때 쓰는 명령어가 stash 명령어이다.
즉, 워킹 디렉토리에 unstaged 파일들을 백업하고 워킹 디렉토리를 클린한 상태 즉 HEAD의 상태로 만들어 준다.
워킹 디렉토리가 클린해졌으므로 pull 같은 작업을 할 수 있다.
git stash 로 저장한 내역은
//워킹디렉토리 클린
git stash
//stash 내역보기
git stash list
stash를 하고 pull을 하면 작업하고있던 내용은 다른 저장소에 저장되고 업데이트된 소스코드를 먼저 받을수 있다.
만약 먼저 작업하고 있던 내용을 다시 적용하려면 pop 명령어를 쓰면된다.
즉, stash에 저장한 내용을 워킹디렉토리에 적용하고 stash 내역에서 이를 제거한다.
// stash 마지막 작업을 워킹디렉토리에 적용하고 stash 내역에서 제거
git stash pop
// stash 마지막 작업을 워킹디렉토리에 적용하고 stash 내역에서 제거하지 않음
git stash apply
// 필요없는 stash 를 삭제
git stash drop
// 전체 stash를 삭제
git stash clear
branch 만들기
master로만 작업을 할수는 없다. 브런치를 만드는 명령어는 아래와 같다.
git branch develop
git branch 를 하면 생성된 브런치가 출력된다.
이제 새로만든 브런치를 사용해보자
git checkout develop
그리고 현재 만든 브런치를 원격 저장소에 반영하려면 아래 명령어를 쓰면 된다.
git push TS develop
원격 저장소에 새로운 브런치가 생성되었고 거기서 계속 작업을 수행한후에
나중에 마스터로 merge 하면 된다.
원격 저장소의 특정 branch clone하기 ( git remote branch clone )
git clone -b "branch name" "git url"
ex)
git clone -b develop-ui https://github.com/pennya/CompanyNearFood.git
개발 branch (develop)가 있고 또 다른 branch (develop-a)를 따서 작업을하다가 merge 하는 방법
우선 develop-a 에서 develop 으로 branch를 이동해야한다.
바로 이동할 수는 없다 왜냐하면 develop-a에서 커밋하지 않은 파일이 checkout할 branch와 충돌나면 변경할수가 없기때문이다.
이동하기전에 기존 내용을 commit 하거나 stash로 잠시 보관하여 워킹 디렉토리를 정리하는 것이 좋다.
commit 또는 stash를 했다고 가정합니다.
// 이미 develop-a는 clean한 상태 ( git status로 확인)
// 그 상태에서 develop branch로 이동한다
git checkout develop
// develop-a 와 merge 한다
git merge develop-a
// 원격저장소에 develop을 commit 한다.
git push origin develop
remote branch delete
협업하기위해 remote branch를 만들었다가 작업을 마치고 master로 merge를 했다면 협업할때 사용한 remote branch는 더이상 필요하지 않다.
// 원격 저장소의 branch 리스트보기
git ls-remote
// 원격 저장소의 특정 branch 삭제하기
git push origin --delete develop-a
위를 실행하면 원격저장소에서 branch(커밋을 가리키는 포인터)가 사라진다.
워킹 디렉토리가 claen한 상태에서 브랜치간 이동하면 소스코드도 전부 변경된다.
예를들어 원본 repository의 branch ori-A를 fork해서 내 repository에 가져왔고 ( my-A)
my-A를 새로운 브런치로 하나 만들었다. (my-B) my-B 브런치에서 작업을 하고 커밋이 완료되어서 현재 작업중인 내용이 없다고 할때
// my-A 브런치의 마지막 커밋 소스코드로 전환된다. 폴더, 파일 전부 삭제되거나 추가됨
git checkout my-A
// my-B 브런치의 마지막 커밋 소스코드로 전환된다. 폴더, 파일 전부 삭제되거나 추가됨
git checkout my-B
fork 한 repository 최신버전으로 동기화하기
아마 이런 과정을 거쳤을 것이다.
1. 관심있는 원본 repository를 들어와서 fork를 했다.
2. 내 repository에 와서 clone 또는 pull 로 local 저장소로 옮겼다.
3. local 저장소에서 새로 branch A를 따서 작업을 했다.
4. 작업한 뒤에 원본 repository에 branch A를 pull request를 했다.
5. 원본 repository의 작성자가 내 request를 merge 헀다.
자 이제 현재 내 로컬과 원격 저장소에는 원본 repository의 최신 업데이트 버전이 없다.
원본 repository의 업데이트된 branch를 내 repository branch로 옮기는 방법은 아래와 같다.
// 어떤 이름의 원격 브런치가 있는지 확인
git ls-remote
// 일단 원본 repository에서 최신 업데이트를 받아야하므로 추가한다.
git remote add upstream "원본 repository.git"
git remote -v 로 origin(fork한 my repository)과 upstream(원본 repository)가 있음을 확인
// 원본 repository에서 branch 포인터들을 받아오자
git fetch upstream
// 로컬, 원격 branch 리스트 보기
git branch -a
// 원본 repository에서 최신 업데이트를 받을 branch로 이동한다.
git checkout develop
// 최신 업데이트를 받는다.
git merge upstream/develop-A
원본브런치는 git ls-remote를 다시 해보면 추가됨을 확인할 수 있다.
// 지금까지 로컬 저장소에 최신 업데이트를 받았으므로 원격 저장소에도 최신 업데이트를 적용해야한다.
git push origin develop
pull request 할때 conflicts 가 발생한다면 어떻게 해결해야할까?
만약 원본 repository의 branch는 master이고
내 repository의 branch는 master , develop, develop-a 이렇게 3개가 있다고 하자.
맨 처음에 원본 master를 develop에 다가 pull 해놓고 develop-a branch를 만들어서 작업을 했을 것이다.
그리고 나는 열심히 develop-a를 수정하면서 작업을 했다
그런데 원본 master의 변경사항이 생겼다. 그리고나서 내 develop-a를 원본 master에 pull request를 하려고 하면 아래와 같은 문구가 나올 것이다.
1. develop-a가 충돌이 나기때문에 우선 충돌이 나지 않는 branch로 바꿔준다. ( develop-a는 마지막 commit을 하여 clean한 상태로 만들어주고 시작한다.)
git checkout develop
2. branch를 새로 따서 원본 repository에서 최신 버전(upstream)을 받는다.
내 develop branch는 원본 master와 충돌이 나지 않는 버전이기때문에 아래 작업을 수행한다면 정상적으로 될것이다.
// branch를 새로 만든다
git branch develop-b
// branch를 변경한다.
git checkout develop-b
// 원본 repository의 최신 버전을 가져온다.
git fetch upstream ( upstream 을 모른다면 조금 위쪽에 설명이 있다.)
// 원본 repository의 master 최신 버전을 merge한다.
git merge upstream/master
// 원격 저장소에 업데이트한다
git push origin develop-b
3. 여기서부터 중요한데 ,2번까지 진행했다면 현재 branch는 branch-b 일것이다.
이제 branch-b 에다가 branch -a의 데이터를 merge하든 branch-a에다가 branch-b의 데이터를 merge하든 똑같을 것 같다.
최종적으로 목표는 원본 master의 내 branch를 merge 할수 있냐 없냐가 관건이니까..
이제 merge를 시작한다
branch-b에다가 branch-a 를 merge 할것이다.
git merge branch-a
그러면 분명히 많은 부분들이 충돌이 발생했다고 출력될 것이다.
이때 git bash 자체만으로 어디가 충돌나는지 확인하고 수정하는게 쉽지 않을 것이다.
visual diff and merge editor가 여러가지 있는데 ( tortoise merge , meld 등등)
도구가 설치가 되어있다는 가정하에 진행하겠다.
git mergetool
명령어를 실행하면 위와 같이 충돌난 항목이 나오고 하나하나씩 mergetool 로 비교하여 수정하겠냐는 문구가 나온다.
엔터를 누르면 자동으로 mergetool이 실행되고 그 안에서 충돌작업을 처리하면 된다.
충돌을 전부 수정해도 아직 branch옆에 MERGING이 써져있다.
이것은 git commit을 통해 해결할 수 있다.
// 수정사항 commit
git commit -m "수정사항"
// 원격 저장소에 update
git push origin branch-b
이제 원본 repository에 다시 최신 업데이트된 branch-b를 pull request를 할수있게된다.
git bash에서 android studio 를 difftool, mergetool default로 하기
1. C:\Program Files\Android\Android Studio\bin 를 내컴퓨터 -> 고급 설정 -> Path 환경변수에 등록
2. %USERPROFILE%\.gitconfig 사용자폴더의 .gitconfig 파일을 열고
[merge] tool = studio64 [mergetool "studio64"] cmd = studio64.exe merge $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") $(cd $(dirname "$BASE") && pwd)/$(basename "$BASE") $(cd $(dirname "$MERGED") && pwd)/$(basename "$MERGED") trustExitCode = true keepbackup = false [diff] tool = studio64 [difftool "studio64"] cmd = studio64.exe diff $(cd $(dirname "$LOCAL") && pwd)/$(basename "$LOCAL") $(cd $(dirname "$REMOTE") && pwd)/$(basename "$REMOTE") trustExitCode = true keepbackup = false
위의 내용을 복사한다.
git bash에서
git difftool 또는 git mergetool 을 누르면
studio64 로 open 할것이냐고 물어봄.
잘못 push된 디렉토리 및 파일 삭제하기
android 프로젝트에서 실수로 idea 폴더가 올라가서 작업자가 프로젝트 로드 시 충돌이 발생함
// 디렉토리 및 파일 삭제
git rm -r --cached .idea
// add 및 commit
git add .
git commit -m "remove idea"
// 원격저장소 push
git push origin master
delete 됨을 확인할 수 있다. 원격 저장소에서도 삭제가 되었다.
원격저장소에 최신 Commit 내용 업데이트하기
git fetch origin
'Git' 카테고리의 다른 글
Sourcetree + Git Flow를 이용한 브랜치 전략 (0) | 2019.01.05 |
---|