Visual Studio Code로 git 관리하기(3) - add, gitignore, reset, merge

hello0U0·2022년 10월 18일
0

git

목록 보기
3/7

Tracked/Untracked 와 add

Reset으로 병합을 취소하면 Uncommitted Changes가 생긴다. Source Control을 누르고 Staged Changes의 파일들을 Changes로 옮겨보자.

git status를 보면 Changes not staged for commitmodified: work1이 있고 Untracked files:에 work3가 있다.
파일은 새로 생성되었을 때 Untracked상태가 된다. 그 후 한번이라고 commit이 된 파일들은 Tracked 상태가 된다.
아래에서 보면 exp에서 생성한 work3파일은 master에서는 commit된 적 없는 파일이므로 Untracked 상태이다. work1의 경우 master에서 commit한 적 있는 파일이기 때문에 Tracted상태(Changes not staged for commit부분)가 된다.

이 둘의 차이는 commit에서 볼 수 있다. git commit -a -m 커밋명을 누르면 add를 자동으로 해주고 commit을 한다.
아래를 보면 commit을 했지만 work3는 그대로 남아있는 것을 볼 수 있다.
add를 auto로 하면 tracked 상태인 file만 자동으로 add되기 때문이다.

work3를 commit하고 싶으면 git add work3를 한 뒤 커밋해야한다.

add를 auto로 할 때 왜 untrackted 파일은 add되지 않을까?

그 이유는 id와 password와 같은 다른 사람들과 공유되면 안되는 파일이 있기 때문이다. auto로 사람이 직접 커밋하지 않았다가 개인정보가 담긴 정보가 커밋되면 다른 사람들도 그 내용을 볼 수 있게 된다. 이를 방지하기 위해 untrackted 파일은 add 하지 않는다.

git add .은 changes의 모든 파일을 staged changes 상태로 만든다. 하지만 이 명령어는 untrackted된 파일마저 add하기 때문에 사용하지 않는 것이 좋다.

.gitignore

개인정보가 담긴 파일과 같이 절대 커밋하고 싶지 않은 파일은 .ignore을 이용하여 커밋되지 않도록 만들 수 있다.
.gitignore파일을 만들고 work3내용을 넣어보자. 그 뒤 .gitignore파일을 커밋하자.

그러면 work3를 커밋한 적 없음에도 uncommited changes가 사라진 것을 볼 수 있다. 이것은 work3를 .gitignore에 의해 무시되도록 설정했기 때문이다.

브런치 옮기기

git reset --hard 커밋id : reset은 head가 가리키는 branch를 옮긴다.

이를 이용해서 commit한 파일을 취소할 수 있다.
work5 파일을 생성하여 working5 커밋을 만들고 work6 파일을 생성하여 working6파일을 만들자.

여기서 working6를 취소하고 working5로 돌아가고 싶다면 git reset --hard 커밋id를 입력하거나 working5에서 우클릭 reset current branch into this commit을 누르자.(hard로 옵션을 바꿔줘야한다.)
그럼 아래와 같이 working6가 사라진다.

reset은 삭제랑 다르다. git은 절대로 파일을 삭제하지 않기 때문에 파일은 남아있다.
그저 branch가 이전으로 복원되면서 그 이후의 파일들이 보이지 않을 뿐이다.
git reflog를 보면 working6에 대한 commitid가 보인다. git reset --hard 커밋id로 다시 working6로 돌아갈 수 있다.

checkout으로 head를 exp브런치로 옮긴다음 git reset --hard 커밋 id or master로 브런치를 working5로 옮길 수 있다.
이러면 새로운 브런치를 만들지 않고 exp 브런치를 재사용할 수 있다.

checkout과 reset 차이점?

checkout은 head를 옮기고 reset은 head branch를 옮긴다.
head가 branch를 가리키지 않을 때, reset을 사용한다면 checkout과 마찬가지로 head만 움직인다.

같은 파일을 수정하고 merge하기

master에서 work5를 아래와 같이 수정해보자.

exp에서 work5를 아래와 같이 수정해보자.

이 둘을 exp에 병합해보자.
head를 exp에 두고 master에서 우클릭 Merge into current Branch 또는 git merge 로 병합할 수 있다.
그러면 충돌했다는 메세지와 함께 아래 사진과 같이 뜬다.

하나의 파일을 양쪽에서 수정하면 어떤 파일을 따라가야 할지 git이 알 수 없으므로 유저에게 어떤 브런치를 따라 병합할지 묻는 것이다.
<<<Head부분은 head가 가리키는 exp 브런치의 부분이고
>>>master는 master 브런치의 부분이다.

빨간 밑줄이 옵션이다.

  • Accept Current Change : head의 부분을 채택한다.
  • Accept Incumming Change : master의 부분을 채택한다.
  • Accept Both changes : 양쪽다 채택한다. HEAD의 내용을 쓰고 master의 내용을 쓴다.
  • Compare Changes : head와 master의 파일 비교

Accept Both changes를 선택해보자. 그럼 아래와 같이 뜬다.

저장하고 git add work5 git commit -m "woking merge exp and master"를 입력하자.
그럼 다음과 같이 수정된다.

add의 의미

  • commit 대기상태로 만든다.
  • untracked를 trackted로 만든다.
  • 충돌해결을 깃에게 알려준다.

merge와 삼자대면

merge는 merege하는 파일의 공통조상과 각 브런치의 파일을 비교하며 merge한다.

master의 work5를 아래와 같이 바꾼다.

exp의 work5를 아래와 같이 바꾼다.

그 다음 master로 exp를 merge시켜보자. 그럼 아래와 같이 충돌이 일어난다.

exp1, exp2, master1에서는 충돌이 일어나지 않은 것을 볼 수 있다.
이것은 merge를 할 때 git은 master work5와 exp work5의 공통조상인 work5를 base로 비교하기 때문이다.
exp3, exp4, master3은 베이스에서 각각 수정됐기 때문에 base에서 수정된 것으로 보고 충돌을 일을키지 않는다.

하지만 master2의 경우 master에서는 master4로, exp의 경우 exp5로 바꿨기 때문에, 동시에 수정이 일어났다 보고 충돌을 일으킨다.

  • git log --oneline --all --graph : 깃 그래프를 터미널에서 보여준다. q를 입력하여 끝낼 수 있다.

  • git config --global alias.l "--oneline --all --graph" : 별칭을 사용하는 것만으로 명령어를 사용 가능하다.(git은 제외한다.)

profile
hello world

0개의 댓글