if 만약에
개발자 A와 개발자 B가 같은 레포지토리를 가지고 다르게 commit을 하였다. 개발자 B가 먼저 리모트 레포지토리 에다가 git push를 하였다.
이런 경우 개발자 A는 자신의 변경한 레포지토리를 리모트 레포지토리에다가 git push를 하지 못한다. 따라서 먼서 git pull(이때 가져온 레포지토리와 자신의 레포지토리가 merge된다)를 하고 conflict가 발생할경우 conflict를 수정하고 다시 git push를 한다.
git fetch 와 git pull
git fetch : 리모트 레포지토리에서 가져온 브랜치의 내용을 머지하기 전에 점검해야 할 필요가 있을 때 사용, 리모트 레포지토리에 있는 브랜치의 내용과 내가 작성한 코드를 비교해서 잘못된 부분이 없는지 검토해야할 때 git fetch로 가져와서 git diff로 검토
즉, 리모트 레포지토리에서 가져와 내용을 확인만 하고 병합은 안함.
해결방법 :
git pull = git fetch + merge
따라서 git pull은 리모트 레포지토리의 브랜치를 검토할 필요없이 바로 합치고 싶을때 사용
이 코드는 누가 작성했을까? 궁금할때 :
git blame -> 어떤 파일의 특정 코드를 누가 작성했는지 찾아내기 위한 코맨드
git show [궁금한 커밋 아이디]
이미 remote repository에 올라간 커밋을 취소해야 한다면? :
git revert [커밋아이디] ->이미 올라간 부분을 삭제한 상태를 local repository에 다시 커밋 -> 이후 git push로 리모트 레포지토리에 올림
Ex) git revert facd eea5 : facd는 포함안되고 그 다음부터 eea5 커밋까지 취소
어떤 브랜치에서 하던 작업을 아직 커밋하지 않았는데 다른 브랜치로 가야하는 상황에서 작업 중이던 내용을 잠깐 저장하고 싶을 때 :
git stash : 최근 커밋 이후로 작업했던 내용은 모두 스택에 옮겨지고 working direcory내부는 다시 최근 커밋의 상태로 초기화
git stash apply : 스택에 있는 내용을 다시 working directory로 가져와서 적용
잘못된 브랜치에서 작업하는 실수를 했을 땐?
git stash pop 커맨드는
[작업 내용의 아이디]를 인자로 주면, 특정 작업 내용을 적용하면서 스택에서 제거합니다.
[작업 내용의 아이디]를 인자로 주지 않으면, 가장 최근에 한 작업 내용을 적용하면서 스택에서 제거합니다.
앞으로 스택에 저장된 작업 내용을 working directory에 적용할 때 그 작업 내용을 나중에 또 쓸 필요가 있다면 git stash apply를 /나중에 또 쓸 필요가 없다면 git stash pop을 쓰면 됩니다.
그외 명령어 :
0) git init : 현재 디렉토리를 Git이 관리하는 working directory로 설정하고 그 안에 레포지토리(.git 디렉토리) 생성
1) git status : 커밋에 반영될 변경사항과 반영되지 않는 변경사항을 알수 있다.
2) git add . : 현재 프로젝트 디렉토리 내에서 변경상항이 생긴 모든 파일들을 staging area에 추가하라.
3) git reset [파일이름] : staging area에 있는 파일 제거 - 변경된 새 모습은 그대로 working directory에 남아있음
4) git help [알고 싶은 커맨드의 이름] or man git-[알고 싶은 커맨드] : 명령어의 의미나 사용법을 자세히 알고 싶다면
5) git log (--pretty=oneline) : 이때까지 한 커밋들(커밋 히스토리) 를 볼수 있다. ( 깔끔하게 보기)
6) git show [커밋 아이디] : 어떤 변경사항이 있었던건지 구체적으로 보기
7) git diff [커밋 A아이디][커밋 B아이디] : 두 커밋 사이의 변화 알아보기
8) git tag[태그 이름][커밋 아이디] : Version_1 Version_2처럼 태그를 달수 있다.
9) git cherry-pick [커밋 아이디] : 원하는 작업이 있는 커밋의 내용만 가져올 수 있는 커맨드( 자신이 원하는 작업이 들어있는 커밋들만 가져와서 현재 브랜치에 추가)
10) git commit --amend : 최신 커밋을 수정해서 다시 새로운 커밋으로 만들기(즉, 파일을 저장(ctrl + s)느낌이다.)
aliasing( 별명 붙이기) ex) git config alias.history 'log --pretty=online' -> git history
복사: ctrl + insert
붙여넣기: shift + insert
working directory에서 버전 관리를 할 필요가 없는 것들이 있다면 이렇게 .gitignore 파일에 그 이름을 추가하고 버전 관리