git 명령어 [작업 중심으로 본 명령어들의 조합과 그 실행 순서] by 바죠



깃은 프로그램 등의 소스코드 관리를 위한 분산 버전관리 시스템이다.
빠른 수행 속도에 중점을 두고 있는 것이 특징이다. 다수의 개발자가 동시에 프로젝트를 수행할 수 있게 도와준다.
최초에는 리누스 토르발스가 리눅스 커널 개발에 이용하려고 개발하였다.
깃의 작업 폴더는 모두, 전체 기록과 각 기록을 추적할 수 있는 정보를 포함하고 있다.
서류 저장소이다. 네트워크에 접근하거나 중앙서버에만 의존하지 않는 특징이 있다.

--------------------------------------------------------------------
git 사용의 중요성:
많은 공개된 프로젝트들이 소스코드를 관리하기 위해서 git 을 활용하고 있다.
여러 사람들과 공동으로 프로젝트를 수행하기 위해서는 소스코드 자료 저장 체계가 필요하다.
개인적 개발과 개발본에 대한 분산 저장이 가능하다.
물론, 공유없이 개인적인 개발 활동에도 도움이 된다.
유사한 프로그램들이 많이 있어왔지만, 최근 가장 많이 활용되는 것이 git 이다.
자료 백업에 대한 두려움 없이 새로운 시도와 개발을 해 볼 수 있다.
사실상 같은 작업 디렉토리에서 새로운 시도를 별도의 백업 작업없이 진행될 수 있다.
간단한 명령어로서 자동 백업이 이루어진다.
원본과 새로운 시도가 있는 변화본에 대한 명백한 차별을 제시하고 각각의 보관을 허용한다.
물론 언제든지 원하는 버전을 볼 수 있고 작업할 수 있다.
또한, 버전과 버전 사이의 차이점을 뚜렸하게 확인할 수 있다.
bitbucket, github 와 같은 웹 서비스 호스팅 싸이트들이 있어서
git 의 특징을 잘 반영하여 변경된 파일의 내역을 잘 제시해준다.

git 의 특징:
- 2005년 개발
- 빠른 속도
- 단순한 구조
- 비선형적인 개발 지원 (동시 다발적 브랜치 생성 허용)
- 완벽한 분산 지원
- 리눅스 커널 개발같은 대형 프로젝트에 유용

--------------------------------------------------------------------

git 명령어 중에서 가장 기본이 되는 것은 아래의 두 가지이다.
git add .
git commit  -m "20161115" 
이 두 가지 명령어가 파일을 수정한 후에 진행하는 기본적인 명령어들이다.
모든 변화에 대해서 이렇게 중간 중간에 저장을 수행한다.
이것을 가정할 때, 실제 상황에서 일어나는 일들을 명령어 중심으로 살펴 보았다.
git 기본 개념을 가지고 있는 상황에서는 결국 연속적으로 연결되는 명령어 요약이 가능하다.
git 기본 개념은 아래의 URL에서 확인 할 수 있다.
http://incredible.egloos.com/7136780


--------------------------------------------------------------------
처음 등록 사항 및 버전 체크
git --version
git config --global user.name "A Def "
git config --global user.email "
adef@gmail.com"

vi 대신에 emacs를 에디터로 사용할 경우:
git config --global core.editor emacs


git config -- list
git help config
git config --help
git add --help


실질적인 시작 단계 (기존의 파일들이 있는 경우)
git init

기존의 파일들이 있는 경우, git 을 시작함.

rm-rf .git 
을 실행하면 git을 더이상 사용하지 않는 것을 의미한다.

또 다른 형식의 시작
기존의 URL 로부터 시작하기
git clone
완전한 버전 역사를 복제하는 것.

ls -la
git -rf .git     
git 연관 작업을 하지 않고 싶을 때, git status 명령어를 사용한다.
더 이상 파일들을 트랙킹하지 않는다.

git status
새로운 것, 변화된 것
파일들이 tracked 인지, untracked 인지 현재 상황을 알려준다.
vi .gitignore
해당 파일들 리스트를 파일 속에 작성해 준다.
git 프로그램으로 관리하고 싶지 않은 파일들 정리해 준다.

git status
파일들의 변화를 체크하기 위한 명령어
git diff
트랙되고 있는 파일들에 대한 변화를 체크함.
파일 수정후, 기존의 스테이징 된 파일과 비교함.
git add filename
git diff --cached
 
이미 커미트한 상태에서 비교 사항을 보고 싶을 경우.

git log
변화의 역사, 커미트 역사 (현재의 브랜치에 제한 된 것)

git log -p
각 커미트의 diff를 보여준다. 즉, 적용된 패치를 보여준다.
git log -p -1
git log -p -2

git log --stat
git log --shortstat
git log --name-only
git log --name-status




git add -A   [git add *.html 또는  특정 파일 이름, git add filename]
git status
git add .gitignore
git status

--------------------------------------------------------------------
git reset filename
git status
git reset
git reset --hard
전체를 되돌리고 싶을 때, staging area에서 빼고 싶을 때
git reset filename
언스테이징, 파일 보존
git status

git revert HEAD
git revert $id


git commit -m "Initial"
working directory, staging area 를 넘어서 최종적으로 저장되는 상태를 얻어냄.  .git  디렉토리에 저장
git status
git log

외부 URL로 부터 프로그램과 깃 작업 사항들을 가져오기.
git  clone  URL   where_to_clone
또는 cp 명령어 처럼 사용될 수도 있다. 디렉토리, 디렉토리 복사와 같은 양식으로도 사용 가능함.
git clone ~/existing/repo  ~/new/repo

ls -la

git remote -v
git branch -a
복제하여 온 것이 아니고, 새로 만든것이라면, 보관할 장소를 git에게 알려줄 수 있다.
$ git remote
$ git remote add pb
https://github.com/paulboone/ticgit
$ git remove -v

git diff
git status
git add -A
git status
git commit -m "abc"

git push origin master
외부 장치에 보관하기, 업로드
git push origin branch_name
master 대신에 새로 만든 branch_name을 업로드하고자 할 떄.

--------------------------------------------------------------------
git branch divide
git checkout divide
작업 준비 완료, 새로운 브랜치 생성 그리고 새로운 일 작업 준비 완료
git branch   로컬 브랜치 상황
git status
로컬 디렉토리, 파일들의 변화
작업 수행
git add -A
git commit -m "divide"
브랜치에서 작업 완료 상황
git push -u origin divide
브랜치 완료 작업, 원격 저장
git branch -a

git checkout master
git pull origin master

가져오기
git merge divide
합치기, master 본에 합치기
git push origin master
master 본 원격 저장
git branch -- merged
git branch -d divide
브랜치 지우기, 로컬
git branch -a
git push origin --delete divide
브랜치 지우기, 원격
git branch -a


아래의 명령어들로 머지 상태를 체크할 수 있다.
git branch --merged
git branch --no-merged


합칠 때, 문제가 발생할 수 있다. 이러할 경우 문제를 해결하고 난 후
git add file_name
이후 병합을 시도한다.
git diff branch1 branch2

git tag 1.0.0 1b2e1d63ff

--------------------------------------------------------------------
git branch subs
git checkout subs
새로운 브랜치, 작업 준비 완료
git status
git add -A
git commit -m "subs"
작업 완료
git push -u origin subs
원격 저장
git checkout master
git pull origin master
git merge subs
합치기
git push origin master
working directory
staging area
.git directory

git add -A
git status
git add .gitignore
git add -A
git status

git reset fname
git status
git reset

git commit -m "initial"
git status
git log

git clone URL where_to_clone
git remote -v
git branch -a
git diff
git status
git add -A
git status
git commit -m "mul"
git push origin master

git branch divide
git branch
로컬 브랜치 목록
git checkout divide
git status
git add -A
git commit -m "div"
git push -u origin divide
git branch -a
git checkout master
git pull origin master
git branch --merged
git merge divide
git push origin master
git branch --merged
git branch -d divide
git branch -a
git push origin --delete divide
git branch -a
    

text changes
version 1, version 2, version 3

distributed version control
open source
github 2008


git rebase -i --root
git rebase -i --root
pick --> r

git rebase -i HEAD~2
pick --> s
commit message 를 수정함.
두 개의 commit를 하나의 commit으로 병합

git rebase -i HEAD~
git reset HEAD~

git branch
상태 체크
git branch dev1
git branch

rebase, merge
git checkout dev1

git checkout master
git merge dev1

git checkout dev1
git checkout master
3way merge
git merge dev1
충돌발생

git reset --soft HEAD^

git --version
git init

ls -a
git status
git add .
git status
git commit -m "ad"


git branch abc
git status
git checkout abc
git status
git add .
git commit -m 'abc'
git status

git remote add origin https://github.com/abcc.git
git pull origin master
git status

git push origin master
git push --force origin master


master
test
develop
feature1, feature2

              
 

git checkout -b newfeature
git branch -a
git commit -am "newfeature"
git push origin newfeature
git branch -a

git checkout master

git branch
git merge newfeature
git branch

git branch -d newfeature
git branch -a
git status
git push origin :newfeature
git branch -a

              

gti branch br1
git checkout br1
.....

git checkout master
git status
git merge br1

http://incredible.egloos.com/7136780
https://www.youtube.com/watch?v=HVsySz-h9r4


--------------------------------------------------------------------
3 가지 종류의 취소들:

git reset --soft HEAD~
커미트 상태만 변경하고자 함. 즉, 언커미트 상태로 변경

git reset --mixed HEAD~
언커미트 수행 그리고 언스테이지 수행

git reset --hard HEAD~
완전히 취소


Modified 상태의 파일을 staging하지 않고 다시 Unmodified로 되될릴 수 있다.
수정을 잘못해서 파일을 원상태로 되돌리고 싶을 때 사용합니다.
git checkout filel하면 원래대로 되돌아옵니다.

Staged 상태라면
git reset file
modified 상태로 전환된다.

commit을 한 후에 되돌릴 때도 git reset이 사용된다.
옵션이 세 가지가 있다. --soft, --mixed, --hard
--soft는 파일들을 commit 후의 Unmodifed에서 commit 직전의 Staged 상태로 만든다.
--mixed는 Unmodified에서 commit 전의 Modified 상태로 만든다.
--hard는 Unmodified에서 commit 전의 Unmodified로 만든다.

reset은 이전 commit으로 직접 되돌아갔다면 revert는 현재 commit 위에 이전 commit을 덮어 씌웠기 때문에 새로운 commit이 하나 추가된다.

--------------------------------------------------------------------
git branch
git branch develop
git branch

git checkout develop
작업, add, commit
이 변경된 부분만 다른 경우, master 와 merge 시킨다. fast-forward 방법
git checkout master   
git merge develop

이러한 머지 방법을 fast forward merge 방법

또 다른 merge 방법이 하나 더 있다.
3-way merge 방법 (공통, 하나, 또 다른 하나, 이렇게 3가지가 가능하다.)

git checkout develop
파일을 수정함. add, 커미트 함
git checkout master
동일한 파일을 수정함, add, 커미트 함
이렇게 변경사항들이 독립적으로 이루어진 변경이 분리된 상태에서 합칠 때,
충돌 발생함.

git merge develop
이러한 시도에서, 충돌이 발생함, 충돌 내용을 알려줌.
해당 파일을 vi 로 수정함. 사용자가 직접 차이점을 확인하고 파일을 수정함. add, commit 수행함.
git add  filename
git commit -m "solve the confliction"
머지가 이루어짐.

git checkout develop
헤드를 옮김
git merge master
이것까지 하게 되면, master, develop 이 모두 다 같은 해쉬를 가지게 된다.
git log

커밋 역사를 한 줄로 바꿀 때, 관리하고 자 할 때,  rebase 한다.
git checkout master
파일 수정
git checkout develop
파일 수정
git rebase master
리베이스 완성 후, 다시 fast-forward 머지를 아래와 같이 시도함.
git checkout master
git merge
develop

합치는 것은 rebase, merge 두 가지가 있다.
merge 는 다시 fast-forward 그리고 3-way 두 가지로 나눌 수 있다.  

git branch --merged
머지된 브랜치 리스트
이 리스트에 나타난 브랜치 중에 필요 없으면 지울 수 있다.
git branch -a
명령어로 브랜치를 체크할 수 있다.
git branch -d dele
git push origin --delete dele
git branch -a
명령어로 브랜치 리스트를 중간에 체크할 수 있다.

--------------------------------------------------------------------
한 브랜치에서 작업을 중단하고 (예를 들어, add, commit 하지 않은 상태),
더 급한 일을 하려고 다른 브랜치로 갈아 탈 때,
git stash
명령어를 사용한다.
git stash list

시간이 지난후에 그 때의 일을 하려고 할 때,
git stash apply
명령어를 사용할 수 있다.
stash 하지 않고, 다른 브랜치로 checkout을 실행하면, 변경된 내용이 checkout하는 브랜치로 따라서 오게 됨.
이러한 불편함을 제거하기 위해서는 stash 를 사용한다.

--------------------------------------------------------------------
rebase the current branch onto <base>,
<base> : branch, commit id, tag,  relative HEAD

/md.egloos.com/img/eg/icon_file.gif") no-repeat left; list-style: none; padding: 0px 0px 0px 15px;' href="http://pds21.egloos.com/pds/201611/26/11/atlassian_git_cheatsheet.pdf" player="0">atlassian_git_cheatsheet.pdf
커미트 역사, 커미트 메시지 조작:

git rebase -i  HEAD~3
마지막 3개를 인터렉티브로 리베이스

git rebase -i  --root
리베이스 할 수 있는 상황이 된다.
커미트 순서를 변경할 수 있다.

메시지도 변경할 수도 있다.
git  rebase -i  --root
pick --> r
로 변경
저장 종료
각각 메시지를 에디터로 수정할 수 있다.

--------------------------------------------------------------------
두 개의 커미트를 합치는 방법

git rebase -i HEAD~2
두 번째만 pick --> s
변경해줌.
저장 종료.
해당 메시지를 새롭게 저장해줌. 하나의 메시지로 저장해 줌.

--------------------------------------------------------------------
한 줄의 커미트를 두개로 만들기
리베이스는 기본적으로 커미트 역사 바꾸기이다.

c1 --  c2  --  c4
         
         c2  --  c5


c1 -- c2 -- c4 -- c3 -- c5
새로운 역사
브랜치 없는 것처럼 하는 것이 리베이스

커미트 역사를 바꾸기 때문에 리베이스는 퍼브릭 브랜치에서는 사용자제해야함.
국소적으로 사용할 때는 유용한 것임.

git rebase -i HEAD~
pick --> e

저장 종료.
git reset HEAD~
git add file
git commit -m "add"
git rebase --continue



--------------------------------------------------------------------
mkdir abc
cd abc
git init

git branch 라는 명령어를 사용하지 전에 만들어진 브랜치를 mater 브랜치라고 명한다.
여러 개의 브랜치를 만들어서 여러 가지 일을 시도 해 볼 수 있다.

물론, 다른 디렉토리를 만들고 다른 프로젝트를 독립으로 실행할 수 있다.
git init 를 그곳에서 실행한다.

git mergetool

----------------------------------------------------------------------
자신의 프로젝트를 만들었거나,  새로 만들경우 아래와 같이 깃을 이용한 작업을 진행하게 된다.github, bitbucket 과 같은 곳에 계정을 하나 만들어 둔다.
git config --global user.name "사용자 이름 <최초사용, 한 번 사용>"
git config --global user.email "사용자 메일주소 <최초 사용, 한 번 사용>"

mkdir ~/MyProject                     작업 디렉토리 (로컬 디렉토리) 만들고
cd ~/myproject                         디렉토리로 들어가서 열심히 개발한다.

git init                                      깃 명령어를 사용할 수 있는 디렉토리로 만든다. <최초 사용, 한 번 사용>
git status                                  현재 상태를 훑어보고
git add 화일명.확장자                 깃 주목 리스트에 파일을 추가하고 (staging 시킴, 필요한 것만 추가함.)
git add .                                   이 명령은 현재 디렉토리의 모든 파일 추가함을 의미
                                                계속해서 개발한다.  변경된 내용 add하고 commit 한다.

git commit -m “커밋 내용 설명”     커밋해서 스냅샷을 찍는다.

git remote add origin https://github.com/username/myproject.git          로컬과 원격 저장소를 연결한다.
git remote -v                                                                                  연결상태를 확인한다.
git push origin master                                                                     깃허브로 푸시한다. origin에 master를 보낸다.

위의 부분들을 잘 사용할 수 있다면, 다음으로 branch를 만들고 병합하는 것을 연습한다. 브랜치를 원격으로 보낼 수도 있다. 브랜치를 여러 개 순서적으로 만들 수 있다. 개발 완료, 테스트 완료된 것이라면 master 브랜치에 병합할 수 있다.

------------------------------------------------------------------------


https://www.youtube.com/watch?v=HVsySz-h9r4




git branch brnch1
git checkout brnch1
git branch
........................
git status
git add -A
git commit -m 'brnch1-change-made'
git push -u origin brnch1
git branch -a
git checkout master
git pull origin master
git branch --merged
git merge brnch1
git push origin master
git branch --merged
git branch -d brnch1
git branch -a
git push origin --delete brnch1
git branch -a


git branch add
git checkout add
.........
git diff
git stash save "worked on add function"
git diff
git status
git stash list
......
git stash apply stash@{0}
git stash list
git checkout -- .

apply 나 pop 둘 중 하나를 사용함.

git stash pop
git stash list

git stash drop stash@{0}

git stash clear
git stash list

ls -la
git status
git branch
git checkout cal.py
git status
git diff
---
git add -A
git commit -m 'bad message'
git log
git commit --amend -m 'correct message'
git log

touch .gitignore
git commit --amend
git log
git log --stat
git log
git branch

git log
git checkout branch1
git log
복사
git cherry-pick b383eff
git log
git checkout master
git reset 2f44fds
git reset --hard 2f44dfs
git log
git status

git clean -df
git status

git reflog
git checkout 3f4488s
git log
git revert 4dffde333

git log
git diff 3eff444 4ffee448

git log


------------------------------------------------------------------------

cheat sheet

협업의 시대:

------------------------------------------------------------------------
bitbucket 에서 github로 이동하는 하나의 방법
[http://commandliners.com/2015/02/moving-a-repository-from-bitbucket-to-github/ 참조]

$ git clone https://bitbucket.org/rafacas/test.git

$ cd test
$ git remote
origin

$ git remote -v
origin https://bitbucket.org/rafacas/test.git (fetch)
origin https://bitbucket.org/rafacas/test.git (push)

$ git remote rename origin bitbucket

$ git remote
bitbucket

$ git remote add origin https://github.com/rafacas/test.git

$ git remote
bitbucket
origin

$ git remote -v
bitbucket https://bitbucket.org/rafacas/test.git (fetch)
bitbucket https://bitbucket.org/rafacas/test.git (push)
origin https://github.com/rafacas/test.git (fetch)
origin https://github.com/rafacas/test.git (push)

$ git push origin master


$ git remote rm bitbucket
$ git remote -v
origin https://github.com/rafacas/test.git (fetch)
origin https://github.com/rafacas/test.git (push)
------------------------------------------------------------------------

------------------------------------------------------------------------

------------------------------------------------------------------------




핑백

덧글

  • 바죠 2018/07/08 14:59 # 답글

    https://www.youtube.com/watch?v=SWYqp7iY_Tc
  • 바죠 2018/08/11 19:30 # 답글

    use "git rm --cached <file>..." to unstage

댓글 입력 영역

최근 포토로그



MathJax