[Git] 조금만 더 알아보자(2)

식빵·2022년 3월 3일
0

git

목록 보기
5/5
post-thumbnail

여기서부터는 혼자서 git을 쓰다가 궁금해서 찾아본 것들이나
자주 생기는 문제들을 해결한 것들을 작성하는 게시글이다.
계속해서 글이 누적될 수 있다.


📌 로컬 브랜치의 tracking 정보 조회

로컬 브랜치에서 현재 어떤 원격 브랜치와 매칭이 되는지 보고 싶으면 아래처럼 입력!

$ git status -sb
## chap04...origin/chap04

## 혹시 아무것도 안나오면?
## 현재의 브랜치가 특정 원격 브랜치를 tracking 하지 않는 것이다.
## 바로 아래 목차를 따라하지.



📌 원격 브랜치 tracking 설정

현재 브랜치가 아무것도 tracking 하고 있지 않다면 git push -u origin [원격브랜치명]
하면 되겠지만, 만약에 이미 원격에 있는 브랜치이고, 해당 브랜치를 tracking 하고 싶다면?

# 만약 아직 한 번도 push 해본적 없는 브랜치이면?
git push -u origin chap03

# 이미 원격에 있는 브랜치이고 로컬 브랜치가 tracking 되도록 하고 싶으면?
git branch -u origin/chap03 chap03  



📌 commit amend 주의점

원격에 이미 commit 들을 모두 push 하고 나서,
로컬에서 다시 commit --amend (--no-edit) 를 하고 다시 push 하면 안된다.
왜냐하면 commit --amend 는 원격에 있는 commit다른 commit 이기 때문이다.

그래서 pull을 해서 merge를 해도 되고,
아니면 원격의 branch를 지우고 다시 push 하든가 하면된다.

이런 점을 봐서 여러 사람이 쓰는 브랜치에는 --amend 사용하면 안된다는 것을 알 수 있다.

######### 방법1 #########
git fetch origin # 일단 fetch 해서 상황 확인
git diff --name-only --diff-filter=U # 너무 많고, 부담스러우면 방법2 쓴다.
git pull # 괜찮다 싶으면 git pull

# 괜찮다 싶으면 git pull 하고 충돌난 지점 가서 다 고치고
git add .
git commit -m 'Merged with before amended'
git push # 원격에 반영을 위해서 이어서 push!


######### 방법2 #########
git push origin --delete {브랜치명}
git push (-u) origin {브랜치명}



📌 원격 브랜치를 로컬에 생성

# 이건 공통
git remote update # 일단 브랜치 정보 업데이트

# git checkout (방법1)
git checkout -t origin/remote-branch [로컬 브랜치명(선택)] # 생략시 원격과 같은 이름 

# git switch (방법2)
git switch -t origin/remote-branch



📌 현재 브랜치 변경사항 무시하고 이동하기

git switch -f <branch-name>



📌 삭제된 원격 브랜치 정보를 로컬 저장소에서 삭제

git fetch --all --prune # --prune 이 핵심임
git branch -a # 확인



📌 브랜치 포인터를 다른 커밋으로 옮기기

# 방법1
git branch --force <branch-name> [<new-tip-commit>]

# 방법2
git update-ref -m "reset: Reset <branch> to <new commit>" refs/heads/<branch> <commit>

여기 참고



📌 .gitignore 자동 작성 사이트

gitignore.io 사이트로 이동



📌 .gitignore 에 항목 추가시 git에 반영하는 법

gitignore 에서 무시할 항목을 추가하고 나서 우리가 바라는 git의 동작은 아마도
무시한 파일이 변경이 되든 뭘하든 그냥 git 이 신경 쓰지 않는 것이다.

하지만 그렇지 않다. 한번 commit 이 되버린 파일은 이후에 .gitignore 에 추가해도
변경시 계속해서 git status 에 나오게 된다.

그래서 어쩔 수 없이 이 파일을 한번 지운 커밋을 이력을 생성해야 한다.
아래처럼 하면 된다.

###### 방법 1 ######
git rm  -r --cached . 
# cached option: only remove from the index / r : recursive
# 위처럼 하면 git index에는 deleted 상태가 되고,
# work space 에는 untracked 상태가 된다.
# git이 아예 이 파일의 존재 자체를 까먹게 하려는 것이다.

git add .   # 다시 add
git commit -m 'ignore file update'  # commit하면 끝!
git push # 원격에서는 delete 된다!

다만 조심할게, 다른 개발자가 pull을 하면 ignore 로 했던 파일이 지워질 수 있다는 점!
그러니 해당 ignore 되는 파일은 잠시 복사하고 나서 pull 받는다.
그 이후에 다시 해당 파일들을 workspace 에 넣는다.
이래서 처음부터 ignore를 잘 짜야한다.



📌 git diff : 다른 브랜치와 차이점 알아내기

# remote 브랜치와 내 로컬 브랜치에서 어떤 것들이 차이가 있는 파일 목록 확인
# fetch 후에 사용하면 좋음.
git diff master..origin/master --name-status

# 현재 내가 변경한 것과 최종 커밋한 것과 다른 파일 명 추출
git diff HEAD --name-status

# remote 와 현재 내가 변경한 내용 비교는 아래처럼
git diff origin/master --name-status    

# 특정 파일에 대한 다른 점 표출
git diff HEAD pom.xml

더 자세한 것들은 https://stackoverflow.com/questions/5162800/git-diff-between-cloned-and-original-remote-repository 에서 확인



📌 원격 브랜치로 로컬 브랜치 덮어쓰기

이 글을 참고함

git fetch
git checkout origin/name_of_branch  # correct state but in 'head without a name'
git checkout -B name_of_branch      # overwrite current tree onto name_of_branch



📌 로컬 브랜치로 원격 브랜치 덮어쓰기

당연하지만 팀원끼리 공유하는 브랜치에 이걸 쓰면 구타당할 수도 있다.
그냥 개인 프로젝트에서나 쓰자. 이 글을 참고했다.

# 가장 흔히 쓰는 방법
git push --force origin <branch name>

# 얘는 원격에 새로운 커밋이 있다면 에러 내고 작업을 abort 함
git push --force-with-lease origin <branch name> 



📌 브랜치 포인터 다른 커밋으로 이동

git branch --force <branch-name> [<new-tip-commit>]

If new-tip-commit is omitted, it defaults to the current commit.
new-tip-commit can be a branch name (e.g., master, origin/master).

profile
백엔드를 계속 배우고 있는 개발자입니다 😊

0개의 댓글