여기서부터는 혼자서 git을 쓰다가 궁금해서 찾아본 것들이나
자주 생기는 문제들을 해결한 것들을 작성하는 게시글이다.
계속해서 글이 누적될 수 있다.
로컬 브랜치에서 현재 어떤 원격 브랜치와 매칭이 되는지 보고 싶으면 아래처럼 입력!
$ git status -sb
## chap04...origin/chap04
## 혹시 아무것도 안나오면?
## 현재의 브랜치가 특정 원격 브랜치를 tracking 하지 않는 것이다.
## 바로 아래 목차를 따라하지.
현재 브랜치가 아무것도 tracking 하고 있지 않다면 git push -u origin [원격브랜치명]
을
하면 되겠지만, 만약에 이미 원격에 있는 브랜치이고, 해당 브랜치를 tracking 하고 싶다면?
# 만약 아직 한 번도 push 해본적 없는 브랜치이면?
git push -u origin chap03
# 이미 원격에 있는 브랜치이고 로컬 브랜치가 tracking 되도록 하고 싶으면?
git branch -u origin/chap03 chap03
원격에 이미 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 에서 무시할 항목을 추가하고 나서 우리가 바라는 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를 잘 짜야한다.
# 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).