개발하는 두더지

[Git] Git Bash로 github 원격저장소에 연동 본문

Git

[Git] Git Bash로 github 원격저장소에 연동

덜지 2017. 5. 30. 23:56

Git을 사용하기 위해서 일단 설치해야합니다. 아래 페이지에 들어가 다운로드 & 설치를 진행합니다.


https://git-scm.com/downloads



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
Comments