Notice
Recent Posts
Recent Comments
Link
«   2025/05   »
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
Archives
Today
Total
관리 메뉴

Jun Station 준스테이션

git 기초 사용법 (repo) 본문

Git (깃)을 사용해보자/git 기초 개념 및 사용법

git 기초 사용법 (repo)

julyjuny 2023. 11. 21. 17:09

 

명령어
git clone git clone [directory] -b dev
(-b dev 꼭 추가하기!!)

(git clone 시, local 에 편집할 파일을 저장,
origin 에 remote 의 data의 포인터를 저장.

origin 만 업뎃을 하려면 : fetch.
origin과 local 편집을 비교하여 어떤 부분이 새로 고쳐졌는지를 보여준다.

origin 과 local 을 모두 업뎃을 하려면 git pull.
git clone 을 할때, 디렉토리 내에 .git 파일이 생긴다.)
origin 서버 위치를 가리킨다
origin/~ working 브랜치, 읽기 영역
서버와 동기화 된 시점의 local 쪽

git pull 파일 가져오기

git pull origin dev
-> remote 에서 dev branch 를 현재의 branch 으로 가져오기
-> 어차피 내쪽으로 가져오니 ":" 앞쪽에는 아무것도 안쓴다.

git pull --rebase: 내가 수정하는 도중 remote 에서 수정된 것을 다 쌓고 난 뒤에 내 수정된 파일이 올려짐
repo sync git pull 과 동일
git status git 추가하거나 변경할 폴더나 파일 확인
git add git으로 추가하거나 변경할 폴더나 파일 추가
-> git 에서 추적되지 않은 파일을 등록하는 것.

버전 관리 시스템에 파일을 관리(staging)하는 것

(해당 파일은 터미널에서 "untracked files:" 문구 하위에 뜰 것)


"untracked file" 은 반드시 add 후 commit을 해야 한다. add 하지 않으면 commit이 되지 않는다.
git commit commit -m "[내용 추가할 것]" 

( []: log 남기기, 커밋할 때 log 을 잘 쓰자)

(add 을 안할 경우, 커밋 하나에 자동으로 add까지 포함되었을 것이다)


--amend : 가장 최근 커밋을 수정
--amend file0, file1 : file0, file1 을 변경사항에 업데이트 
(뒤에 파일을 추가하지 않으면 메세지만 수정된다.)
--amend -a : 모든 파일



git 에서는 시스템 해시코드를 바꾼다. 기존에 쓰는 것을 지우고 새로 쓴다.

gerrit 에서는 기존것을 수정해서 바꾸는 것이라고 알고 있음. 따라서 굳이 abandon 을 할 필요가 없다.
그러나 git 은 아니기 때문에 push 한 것을 amend 해서는 안된다. (git pull 하는 순간 엄청 꼬일 것이다)


commit 한 코드에서 메인 branch 에서는 에러(오류)가 발생하고, 임시 branch 에 올라가져 있는 경우 (서버에서는 merge 되지 않은 상태) amend 을 사용하면 간단하게 해결할 수 있다.
git push origin dev:dev


(git push origin dev)

(git push origin HEAD:dev)

git push origin dev:dev ([local branch name]:[server remote branch name])
- 근데 우리 센터는 gerrit 으로 이러한 다이렉트 push는 막혀 있음.


- 보통 이름이 같으니 축약해서 git push origin dev
-> 보통 local branch 이름과 remote branch 이름을 동일하게 하는 것이 안전하다

[gerrit]

git push origin HEAD:refs/for/dev
remote 의 dev branch 으로 업로드



git log commit 한 내역을 확인하는 방법
scp -p -P [ID] [hostname]@[server]:hooks/commit-msg .git/hooks/ 새로 directory를 만든 뒤에 git에 올릴때, git push 에서 오류가 발생하게 되면
Hints: 문구에서 해당 부분을 찾아서 commit-msg 를 hook 에 설치할 것
git add -u 잘못 올린 파일들 삭제 시, 이와 같이 입력해야 삭제된 파일이 git 에도 반영
삭제 이후에 commit -m 을 해줘야 한다.
gitk git merge, commit push 등을 gui 로 확인할 수 있는 방법
특정 디렉토리 내에서
  gitk .  
이라고 치면 해당 디렉토리 내의 git log 을 확인할 수가 있게 된다.
git revert remote 에 반영돼 버려서 기존 커밋을 수정할 수 없을 때, 취소 커밋을 발행

어떤 특정 커밋에 대해 취소하는 새로운 커밋을 만든다는 뜻.
 이 또한 commit 이기에 새로운 push 을 해야 한다.

"git revert HEAD"
HEAD: 최신 커밋을 가리키는 포인터. (엄밀하게는 HEAD~0 )


git reset --hard (HEAD) [ID]

(HEAD 을 안쓰면 default 로 HEAD가 적용)
현재(working) branch 의 HEAD를 변경하는 명령.
- 특정 커밋으로 HEAD를 이동시키고, 변경사항을 제거
- 커밋을 제거한다.

git reset aaaaa: HEAD 의 포인터를 aaaaa 으로 다시 이동해라


(gitk 에서) [ID] 위치까지 git reset
(이때, 로컬에서 수정된 부분은 전부 git으로 덮여쓰여져서 날라감)


(status가 STAGED -> MODIFIED -> COMMITED 상태로 한번에 돌아감)
(STAGED: commit 준비 상태)


"--hard" 없으면 가장 최근 commit 내용까지 되돌려놓음.
(HEAD: 가장 최신 commit 시점을 가리키는 포인터)

>> git reset HEAD~1
- HEAD 하나 이전 커밋으로 돌아가게 된다.

git reset --hard origin/dev (working branch 에서)

origin/dev: 읽기 영역의 dev 의 최신으로 reset
-> 근데 해당 시점은 서버에서 git clone 한 시점이기에, 항상 서버와는 동기화되어 있다고 볼 수는 없다.

branch 이동은 하지 않는다!!

git reset --soft [ID] (git reset 의 default 버전)

로컬 수정부분은 안 덮여쓰여짐 (staging 영역에 유지)

git reset --mixed [ID] 커밋을 취소하고, staging에서만 제거 (modified 된 상태에서만 둔다)
git checkout file, commit, branch 을 이동하는 명령. (주기능)
파일 또는 디렉토리의 상태 복구.

변경사항 내용을 되돌림 (버림).
COMMITED 상태의 깨끗한 상태로 돌아옴.

(working하고 있는 HEAD의 branch 를 바꿀 수 있음,
예) git checkout dev: 다른 branch 에 있는 HEAD을
dev branch으로 바꿀 수 있음) 

dev 에서 작업을 하다가 trunk 으로 넘어가면 commit을 하지는 않았기에
작업내용이 같이 넘어가게 된다. 조심!

예) git checkout dev -- a.v : dev branch 에만 존재하는 a.v 파일을 현재의 branch 로 가져오는 것. 그리고 MODIFIED 상태로 된다.


git checkout --file0: 특정 file0 에서만 수정한 내용이 전부 지워진다.

>> git checkout -b [local branch] [remote branch]
[local branch] 을 만들면서 거기 branch 으로 이동하는데, 이때 [local branch]는 [remote branch] 에서 복사해온다.


git stash 수정한 내용을 commit 하지 않고 다른 데로 잠시 넘어갈 수 있음

나중에 다시 불러오려면 git stash pop 으로 꺼내면 된다.
git branch git branch [branch_name] : [branch_name] 이라는 branch 생성
(-b 을 붙여줄 경우, 로컬의 working HEAD를 생성된 branch 로 바로 이동함,
checkout 을 할 필요가 없음)

활성 branch는 별표(*)로 표시

git branch : 현재 working HEAD 가 어디인지를 보여줌

git branch -D [branch_name] : [branch_name] 을 삭제

해당 branch는 서버의 branch가 아니라 로컬의 branch.

(HEAD detached at   aaaaaaaa)
명시적인 branch가 없는 경우 임시적으로만 가지고 있는다. 따라서 branch 을 dl이동하게 되면 사라진다.
 

비슷한 개발 방식). 어떠한 파일을 수정하다가, 기존의 수정한 파일을 ctrl+CV 한 뒤, 기존 파일을 파일명을 바꿔서 추가작업을 할 경우에 대한 명령어를 사용.

- branch : cp
- checkout: mv 
와 유사하다고 보면 된다. 

-vv : 해당 로컬 branch 가 서버의 어떠한 branch 에서 가져와졌는지를 확인
git branch -r remote tracking branch 가 무엇이 있는지를 보여줌
git diff HEAD origin/dev HEAD와 origin/dev 의 git 을 비교
git difftool -t meld -d [branch] 더 예쁘게 잘 비교
git fetch remote 의 내용을 가져오되, local 의 수정 내용은 지우지 않는 방법

git fetch origin dev: remote 의 내용을 local 의 dev 쪽으로 가져오는 것. (이때 origin 은 remote 서버의 내용)

>> 내가 작업을 하다가 (이미 git 이 새롭게 push된) 서버와 sync 를 맞추고 싶으면
git fetch 이후 git reset


git merge working branch에 지정하는 브랜치를 병합

- git merge [병합할 브랜치 이름]
예). trunk branch 에서 git merge dev

커밋 하나하나마다 jenkins 에 다 올라가게 된다.
merge 커밋이 하나 생기가 된다.

방식:
-> 3-way merge: 히스토리 명확하게 추적, 긴 히스토리로 내용 파악이 어려울 수 있다.

-> fast-foward: 가독성이 높을 수 있다. 변경사항 추적이 어렵다.
근데 ff 방식은 변경이력을 그대로 가져온다. 심지어는 commit ID과 Change-ID 까지도 그대로 가져온다. (따라서 --no--ff 을 사용해야 할 때가 필요. 아래쪽에 후술)

예). Common lib 에서 수정이 생기면, 수정 이후 Enc, Dec 으로 merge
각 Enc, Dec top 은 자체적인 branch

>> git merge --no --ff
dev 에서 파생된 working branch 이랑 dev 와 다시 merge 하려고 할때, 만일 기존 dev branch 에서 변경사항이 없을 경우 사용, 사실상 항상 쓰는 게 좋을지도 (gerrit 으로 인해 발생하는 문제) 

git log git log -2: 마지막 2개의 git log 볼 수 있다.
git log --graph: merge 같은 그래프를 시각적으로 볼 수가 있게 된다.



vim ~/.config git 정보 확인 가능
git rebase comit 한 것을 다시 갖고 와서 무엇인가를 바꿀 때 쓴다.

1. $git checkout dev
2. $git rebase trunk
-> trunk 을 기준으로 dev 브랜치를 재배치

그렇게 되면 HASH 가 변경된다. 그래서 바로 merge가 되는 것이 아니라, no fast foward 방식으로 재배치가 된다.

해당 문제는 HASH 가 바뀌는 데에서 발생하게 된다.

1. $git rebase trunk
2. $git checkout origin/dev

깨끗한 상태의 origin/dev 를 서버에서 가져온 다음, 그것을 기준으로 trunk 내용을 뒤에 붙인다. 


--abort: git rebse 를 나가는 방법

-i HEAD~3 : git 에서 3번째 전까지 나온다.
여기에서 pick 을 골라서 고를 수 있게 된다.


--continue : 넘긴다.


-- 이전 커밋과 합치려면 rebase i HEAD~2
이후 두번째 pick 에서 s 로 교체

 

git conflict 두 브랜치가 같은 파일의 같은 위치를 다르게 수정하여 발생하는 에러

일반적으로 merge 를 시도할 때 발생

로컬의 수정사항 HEAD 과 다른 브랜치의 수정사항을 개발자가 직접 보고 수정해야 한다.


<<<<<<<<<<< HEAD
현재 브랜치에서 수정된 내용
===========
병합하려는 브랜치에서 수정된 내용
>>>>>>>>>>>> feature branch


conflict 이전 상태로 원복하고자 할때:
$git merge --abort
$git rebase --abort


   
   
   
   

 

명령어
repo sync git pull 같은 개념
repo start [branch명] --all  

 

  • git push vs commit vs add

https://thenicesj.tistory.com/506

 

[git] commit 과 push 의 차이점

git 의 repository 에서 받아오는걸 pull 로 당겨온다라고 하고 로컬에 있는 코드를 원격으로 올리는 작업을 push라고 한다. 여기서 push를 하기 위해서는 add와 commit의 작업이 필요한데 이작업들의 차이

thenicesj.tistory.com

 

  • 서버에 수정한 코드 올리는 법
[Gerrit] 을 사용하는 경우

1.git pull 로 최신화


2. git status 로 상태 확인

3. git add <files> 으로 코드 (디렉토리) 추가

4. git commit -m "[project name]"

5. git push origin HEAD:refs/for/dev


 

 

참고 사이트:

https://xamadas.tistory.com/entry/Gerrit-%EC%97%90%EC%84%9C-HEADrefsforbranch-%EC%9D%98%EB%AF%B8

 

Gerrit 에서 HEAD:refs/for/branch 의미

Push : Local -> Remote# git push origin HEAD:refs/for/branch 통상 위와 같은 명령어로 수정된 commit을 push 한다. (gerrit을 사용하는 경우)명령어를 하나하나 뜯어보자 명령어 의미 git push origin 리모트 저장소의 UR

xamadas.tistory.com

 

https://hungc.tistory.com/98

 

repo 명령어 정리

repo repo란 여러 git repository 전체에 걸친 작업을 단순화하여 git을 보완하기 위해 만든 툴이다. 보통 manifest.xml 파일에 각 git repository를 명시하여 한번에 원하는 작업을 실시할 수 있다. Repo 명령어

hungc.tistory.com

 

 

https://baby-daramg.tistory.com/5

 

Gerrit - Commit Message에 Change-Id 입력하도록 설정

보통 Commit Message에 Change-id 가 없어도 Gerrit 에 커밋을 업로드시 자동으로 생성해주지만, 커밋 메세지에 Change-id 가 없으면 Gerrit 에 올리지 못하도록 설정할 수도 있다. Change-Id 는 Gerrit 이 변경사항

baby-daramg.tistory.com

https://baby-daramg.tistory.com/6

 

Gerrit 에러 - Missing Change-Id in message footer

에러 ERROR: missing Change-Id in message footer [remote rejected] HEAD -> refs/for/master (commit : missing Change-Id in message footer) 원인 Gerrit 에서 커밋 메세지에 Change-Id 작성을 강제화하도록 설정되어 있음. 해결 방법 Me

baby-daramg.tistory.com

 

 

https://velog.io/@jollyn/Git-%ED%8C%8C%EC%9D%BC%EC%82%AD%EC%A0%9C%ED%95%98%EA%B8%B0

 

[Git] 파일삭제하기 : git rm

파일을 삭제하고 싶지 않니?

velog.io

 

https://lsjsj92.tistory.com/524

 

'Git (깃)을 사용해보자 > git 기초 개념 및 사용법' 카테고리의 다른 글

Branch 이란?  (1) 2023.12.05
Comments