오늘 TIL은 다른 초보 개발자 분과 Git Workflow를 연습하면서 학습한 내용을 바탕으로 작성하였습니다. 처음 Git으로 협업을 하다보니, 여러 에러들이 발생했는데, 이 부분도 함께 정리해보았습니다.
혹시 틀린 내용이 있다면, 선배/동료 개발자님들의 댓글 부탁드립니다.

Github(Remote Repo)에서 소스를 처음으로 내려받을 때 사용
$ git clone <URL> . // Github <URL> 혹은 <SSH Key>
** 참고로 "$ git clone"에서 달러 표시는 그냥 무시하셔도 됩니다... 그냥 "git clone " 형식으로 작성하면 됩니다.
Working Directory(작업 공간)에서 수정된 내용을 Staging Area로 올릴 때 사용
$ git add . // modified된 모든 파일들을 staging area로 올림
$ git add <fileName> // <fileName>을 staging area로 올림
$ git reset HEAD <file> // git add를 취소(<file>이 없으면 전체가 취소됨)
Staging Area에 있는 파일들을 전부 Local Repo(Git Directory)로 Commit
$ git commit -m "My first Commit" . // Commit Msg는 50 Character이내로 작성
// git commit 취소 방법
$ git reset --soft HEAD^ // 파일들은 staged 상태
$ git reset HEAD^ // 파일들은 unstaged 상태 > working directory에는 보존
** Git Commit 메세지 작성법 관련 링크
https://chris.beams.io/posts/git-commit/
$ git push [remote] [branch]
$ git push //그냥 git push도 가능함
일반적으로 $ Git Push Origin Master를 많이 쓰게 되는데, "Origin"은 원격 저장소의 주소이고, branch는 현재의 브랜치가 "Master"로 설정이 되어 있어서 그렇다네요...
// Upstream에서 Fork한 후 git clone
$ git clone <URL> //Github Repo의 URL(HTTP or SSH)
// 페어 레포 연결 git remote add [별칭] [저장소 주소]
$ git remote add [별칭] <URL> // [별칭]은 Pair로 URL은 페어 URL로 설정
$ git remote -v // 현재 원격 저장소 확인
// 내가 변경한 내역 Commit/Push
$ git add .
$ git commit -m 'change'
$ git push origin master // master branch일 경우
// 페어 레포를 Pull
$ git pull pair master // master branch일 경우
origin https://github.com/scy0334/[repo name].git (fetch)
origin https://github.com/scy0334/[repo name].git (push)
pair https://github.com/[pairId]/[pair repo name].git (fetch)
pair https://github.com/[pairId]/[pair repo name].git (push)
일단 위와 같이 Pair의 별칭과 pair의 github Id가 포함된 URL이 있으면 성공적이게 remote add가 된 것임.
그러면 도대체 Git Merge(Pull) Conflict는 언제 발생하는 걸까요...?
Merge conflicts happen when you merge branches that have competing commits, and Git needs your help to decide which changes to incorporate in the final merge.... Often, merge conflicts happen when people make different changes to the same line of the same file, or when one person edits a file and another person deletes the same file.
(출처 : git documentation)
Merge(Pull) Conflict는 두 개의 Branch나 Repo를 병합할 때 두 Commit간의 충돌이 발생할 때 발생하며, 일반적으로는 같은 라인에 두 사람이 다르게 수정을 한 경우나, 한 사람이 파일을 수정했는데 다른 사람이 파일을 삭제 했을 때 발생한다고 하네요.
그렇다면, Merge Conflict가 발생했을 때 주의해야 할 사항들은 뭐가 있을까요..?
저하고 페어분을 많이 괴롭혔던 에러... Working Directory, Staging Area에 Commit이 안 된 파일이 있는 경우입니다.
즐겁게 페어를 하고 페어분이 본인이 수정한 내용을 git push origin master를 실행한 후 , 제가 git pull pair master를 했는데, VSCode에서 Incoming Changes와 Current Changes를 안 보여주는 경우, Please, commit your changes or stash them before you can merge 메세지가 뜨면서 그냥 Pull 자체가 Aborting이 되었는데요.
/*Git Pull Pair Master를 했는데
Working Directory나 Staging Area가UptoDate이 아닌 경우 */
error: Your local changes to the following files would be overwritten by merge:
file.txt
Please, commit your changes or stash them before you can merge.
Aborting
/*Merge를 시도했는데, Working Directory나 Staging Area가
UptoDate이 아닌 경우 */
error: Entry '<fileName>' not uptodate. Cannot merge. (Changes in working directory)
저하고 페어분은 이것 때문에 하루 종일 패닉을 했었는데, 알고보니 제가 Working Directory에서 특정 라인을 수정을 해놓고, git commit을 안 해서 발생한 문제였습니다 ㅠㅠ.... (패닉하지 않고 에러 메세지를 읽어서 commit을 했더라면 좋았을텐데...).
이런 에러를 보시면 일단 git status, git commit -a(혹은 add 후 commit) 후 시도하면 문제없이 git pull이 됐었습니다..
페어분하고 같이 번갈아 가면서 작업을 하다가 보면, 서로가 git pull pair master를 하면서, 협업을 할 수 있었는데요.
같이 작업을 해보면서 git log를 할 때마다, 제가 성공적이게 페어분의 작업을 git pull을 하면, 저의 최근 로그 기록에 페어분의 Commit Id(SHA1)가 기록되는 것을 확인할 수 있었고, 그 밑에는 제가 이전에 Commit했던 내용들의 Commit ID가 존재하는 걸 볼 수 있었습니다.
** 참고로 Commit 옆에 있는 40자의 값은 SHA1 Hash라고도 부르며, 이중 첫 7 character들은 저희가 git commit 내용을 볼 때 나오는 commit ID라고 하네요..
/// 제가 Git Pull을 해온 페어님의 Commit ID
commit 0ec01eb0b1fd9b2fc0becb8abbe4cd592ee89489
Author: [Pair Name] [Pair Gmail]
Date: Mon Aug 31 19:03:28 2020 +0900
0
/// Git Pull Pair Master 전의 저의 Commit ID
commit 39473a8cff1eb78e7a4374f9fe986b07262f0e9f
Author: Si Choi <sichoi@Siui-MacBook-Pro.local>
Date: Mon Aug 31 19:01:56 2020 +0900
no regret
그런데 제가 git pull pair master를 한 후, 페어분의 commit 내용과 제 코드가 충돌하면서, 제가 실수로 페어분의 코드 값으로 수정하지 않고 제가 기존에 수정한 값을 그대로 저장해서 커밋을 해버렸는데요...
그 경우에 git log를 해보니, 다음과 같이 떴었습니다.
commit 9270fe0b8be682a3e4bf49c30817a5cfec88685b
Merge: 0ec01eb 39473a8
Author: [Pair Name] [Pair Gmail]
Date: Mon Aug 31 19:04:34 2020 +0900
0
이전 Log 기록과는 달리 Merge라는 내용과 두 개의 Commit ID(7자의 해시값)가 새로 추가된 부분을 보실 수 있는데요.
저 내용을 자세히 살펴보니, 0ec01eb는 제가 git pull을 해온 페어 분의 Commit ID였고, 39473a8은 제가 페어분의 코드를 git pull 하기 전에 마지막으로 제가 Commit 했던 내용의 Commit ID였습니다(바로 위 예시를 살펴보면 이해하실 수 있을 거에요).
저렇게 될 경우, 페어분의 코드와 저의 코드가 다르다고 하더라도, 이미 한 차례 Merge를 한 기록이 남게 되기 때문에 제가 다시 페어분의 코드를 git pull을 하려고 시도하더라도, Everything up to date이 뜨게됩니다.
이 경우에는 페어분께서 다시 Commit을 하시고, 저 또한 새로 Commit을 해서 다시 git pull을 시도하면 문제가 해결됐던 것 같습니다.
혹은 git revert를 통해서 git merge 혹은 git pull 하기 이전의 commit 기록으로 돌아갈 수 있는 방법이 있는 것으로 보이는데요.... 이 경우를 시도해보고자 하신다면 아래 링크 참조를 해보면 될 것 같네요.
http://ohyecloudy.com/pnotes/archives/git-revert-merge-commit/
원래는 한 시간 안에 끝날 Git Workflow 연습이었지만, 어쩌다보니 페어분하고 3시간을 더 공부하게 되었고, Git에 대해서 모르던 내용들도 많이 학습을 하게 되었던 것 같습니다.
좀더 구체적이고 정확하게 설명을 하고 싶었지만, 일단은 이 정도로 정리를 해보고, 다음 번에 좀 더 학습을 하게 되면 Git 실전편으로 다시 한번 블로그를 작성해보도록 하겠습니다 ㅠㅠ