본문 바로가기

개발/Git

내가 자주 쓰는 Git 명령어 (feat. 우여곡절)

햐 요즘엔 GUI도 잘 되어 있다지만 나는 여전히 터미널에 한 땀 한 땀 명령어 입력하는 것을 선호한다.

(이것도 몇 년간 하다 보니 익숙해지기도 했다)

기왕 쓰는거 한 번 정리해 보자!라는 생각에 포스팅을 하게 되었다.

 

 


기본(add, commit, pull, push, clone, checkout, branch)

Git을 사용하다보면 자주 많이 사용하는 명령어이다.

그 외에는 그때 그때 구글링 해도 문제없다고 생각한다.

하지만 '이 정도 명령어도 구글링을 하면 시간 낭비다'라고 생각되는 명령어를 정리해 보았다!

git init
git remote add {remote name 보통 origin을 쓴다} {url}
git branch -M main
git checkout [-B] {branch name}
git add {파일명 | .} 
git commit -m "{commit message}"
git push {remote name} {branch name}
git pull {remoge name} {branch name}

 

간단한 설명

1. git init: 이 폴더에서 깃을 시작하겠다!라는 의미. git 폴더가 생기고 git 명령어가 사용 가능해진다.

 

2. git remote add: git에 있는 레포를 로컬에 연결하는 명령어. pull, push 등 명령어로 로컬에서 작성한 코드를 원격 저장소로 올리거나 원격 저장소의 코드를 가져오게 되는데 이 '원격 저장소'를 로컬에서 연결하는 명령어다.

*git remote -v 로 확인 가능

 

3. git branch: git의 브랜치를 지정하고 수정하고 설정하는 명령어 --help를 통해 더 많은 옵션을 확인할 수 있다.

내가 주로 쓰는 건 -M(기본 브랜치로 설정), -D(브랜치 삭제)

 

4. git checkout: 브랜치를 변경하는 명령어 -B 속성을 추가하면 브랜치를 새로 만들어서 변경한다.

 

5. git add: 로컬에서 파일들의 상태를 변경하는 명령어. 보통 add -> commit -> push 순서대로 진행되는데, 간단하게 말하면 add는 commit 하기 전에 무엇을 커밋하겠다! 지정해 주는 것이고 commit은 내가 어떤 내용을 어떤 파일을 원격 저장소에 올리겠다! 지정하는 것, push는 commit 한 내역들을 원격 저장소에 올려주는 것이다.

 

6. git commit: "git commit"만 실행하면 vi 편집기를 통해 상세한 commit 메시지를 작성할 수 있다. git commit -m을 사용하면 commit message의 title을 작성할 수 있어서 짧고 간단한 메시지를 작성할 때 편리하다.

 

7. git push, git pull: push는 원격 저장소에 코드를 올리는 것, pull은 원격 저장소에서 로컬로 코드를 가져오는 것이다. remote name과 branch name은 작성하지 않으면 default로 지정된 대로 실행된다 (default가 없으면 에러 발생)

 

 

출처: https://medium.com/sjk5766/git-3%EA%B0%80%EC%A7%80-%EC%83%81%ED%83%9C%EC%99%80-%EA%B0%84%EB%8B%A8-%EB%AA%85%EB%A0%B9%EC%96%B4-%EC%A0%95%EB%A6%AC-a80161aacec1

 

종종 쓰는 명령어 (rebase, status, log, stash, reset)

git push {remote name} {branch name} --rebase
git rebase --continue

git status
git log

git commit --amend -m "{수정할 커밋 메세지}"
git commit --amend --date="{날짜}"
git commit --amend --author="Author Name <email@address.com>"

git stash
git stash list
git stash apply {stash name}

git reset [HEAD^ | HEAD~숫자] [--soft | --hard]

 

간단한 설명

1. rebase: rebase는 나도 최근에 알게 된 속성인데, 원격 저장소의 로그와 로컬 저장소의 로그가 다를 경우 commit이 꼬이지 않도록 정리해 주는 역할을 한다. conflict가 발생하면 해결 후 git rebase --confinue를 실행하면 된다.

https://git-scm.com/docs/git-rebase

 

2. git status: 위에 첨부 되어 있듯, git에는 상태가 있다. git status 명령어를 통해 각 파일의 상태를 확인할 수 있다. git add . 을 하는 것보다 상태를 보고 파일 단위로 add, commit 하는 것을 권장한다.

 

3. git log: commit 번호(이름), 작성자, 날짜, 메세지를 확인할 수 있다. commit을 삭제 또는 수정할 때 유용하게 쓰인다.

* git commit --amend로 가장 상위에 있는(HEAD) 커밋을 수정할 수 있다.

 

4. git stash: 임시 저장 역할 이라고 볼 수 있다. git stash를 실행하면 변경 중이던 파일들이 임시 저장되고, git stash list를 통해 stash 한 리스트를 확인할 수 있으며 'stash {숫자}'로 표시되어 있는 stash 이름을 통해 applay 할 수 있다. (git stash apply stash{0})

 

5. git reset: 커밋 내역을 삭제할 수 있다! 또는 add 된(staged) 파일들을 modified로 상태를 변경할 때 사용한다. 

- 커밋 삭제: 상단(HEAD)부터 1개만 삭제하고 싶다면 HEAD^, 2개 이상은 HEAD~{숫자}로 작성한다. --soft 속성을 사용하면 커밋 내역만 삭제되지만 --hard 속성은 해당 커밋의 파일 변경 사항까지 싹 날려버린다. (조심!)

- 그냥 git reset만 입력하면 staged 된 파일들이 modified로 상태가 변경된다.

 


 

정말 가끔 필요한 GIT

Commit 작성자 한 번에 변경하기

(서론)

올해가 들어 SSAFY라는 교육 과정을 듣게 되면서 공부를 위한 github 계정을 따로 만들게 됐다.

본 계정에는 이미 많은 repo들이 있었고, 이 당시에 나는 뭔가 지저분하다(정리가 안된?)고 느꼈던 것 같다.

그러나 한 2달이 지났을 때쯤... 이 계정을 없애고 본 계정으로 다시 돌아가야겠다는 생각을 하게 됐다.

이유는 부계(공부를 위해 새로 만든 계정)에 잔디가 심어지는 동안 본계의 잔디가 텅텅 비어 갔기 때문...ㅠ

내 몸은 하나밖에 없기 때문에 매일매일 두 계정에 잔디를 심기란 불가능했다.

그 결과..

본계정의 잔디

 

부계정의 잔디

 

이렇게 나뉘어서 잔디가 심어졌다...ㅋㅋㅋㅋ

 

부계정의 잔디를 본 계정으로 옮겨 오고 싶은데...

"commit 기록 작성자 변경하는 법"을 검색해도 결과가 나오긴 한다

git commit ammend를 활용하거나 git rebase -i로 해결할 수도 있다.

 

실제로 2번의 상황에선 git rebase를 사용하기도 했다.

그러나 로그 하나하나를 변경하기엔 commit이 너무 많았고, 한 번에 촤르륵 작성자를 바꿀 수 있는 방법을 알고 싶었다.

 

(본론)

 

찾아봐도 안 나와서 github support에 문의하였더니, 감사하게도 내가 딱 원하는 방법을 알려주셨다!

https://support.github.com/

 

Sign in for Software Support and Product Help - GitHub 지원

 

support.github.com

내가 문의한 티켓

github support에 문의하는 것을 '티켓을 발행한다'라고 표현한다.

위와 같이 티켓을 생성했더니 생각보다 빠르게 (24시간 이내) 답변이 달렸다.

*영어로 문의하면 좀 더 빠르다! (거의 몇 시간 이내)

 

Github Support의 답변

(support의 답변 기준 2번부터 따라함)

1. 먼저 commit 내역을 변경할 repo를 clone 해준다.

단, --bare이라는 속성을 사용해서 클론 한 뒤, clone 된 폴더 안으로 들어가 준다 (cd 명령어)

git clone --bare https://github.com//.git
cd <reponame>.git

 

--bare 속성으로 clone 한 폴더 안에 들어가면

이런 폴더들이 있다.

 

 

2. sh 파일을 만들고 아래의 스크립트를 복사 붙여 넣기 해준다.

vi script.sh
#!/bin/sh

git filter-branch --env-filter '

OLD_EMAIL="your-old-email@example.com"
CORRECT_NAME="Your Correct Name"
CORRECT_EMAIL="your-correct-email@example.com"
 
if [ "$GIT_COMMITTER_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_COMMITTER_NAME="$CORRECT_NAME"
export GIT_COMMITTER_EMAIL="$CORRECT_EMAIL"
fi
if [ "$GIT_AUTHOR_EMAIL" = "$OLD_EMAIL" ]
then
export GIT_AUTHOR_NAME="$CORRECT_NAME"
export GIT_AUTHOR_EMAIL="$CORRECT_EMAIL"
fi
' --tag-name-filter cat -- --branches --tags

저장하고, 스크립트를 실행하면 된다

 

* 명령어를 찾을 수 없다거나 권한이 없다고 하면 chmod 777 script.sh로 권한을 설정해 줘야 한다.

* 여러 번 실행했을 경우 기존의 백업을 지우기 위해 --force 옵션을 넣어줄 수 있다.

git filter-branch --env-filter => git filter-branch --force --env-filter 

 

실행하면 터미널에 이런 식으로 블라 블라 뜬다!

 

마지막에 "Ref 'refs/heads/main' was rewritten"라고 뜬다.

3.  "Review the new Git history for errors" 하라고 하는데 그냥 안 했다.

 

 

4. push 하고,

git push --force --tags origin 'refs/heads/*'

 

5. clone 했던 폴더를 삭제하면 끝!

cd ..
rm -rf <reponame>.git

 

결과 -

채워진 잔디

 

 

Commit 작성자 몇 개만 변경하기

(서론)

여느 날처럼 개발을 하면서 commit을 쌓아갔고, 퇴근 직전 push를 했는데..! 권한이 없다면서 push가 되지 않았다.

무슨 일인가 의아해서 다음 날 로그를 찍어보니 자리가 바뀌면서 다른 사람의 git 설정이 남아 있었고,

그 사람의 이름으로 commit이 되어 있는 것을 발견했다,,^^

뜻 밖의 contributor

 

(본론)

이런 경우에 git rebase -i를 사용해서 commit 내역을 변경할 수 있다.

 

- git rebase -i {수정할 커밋의 직전 커밋의 해시값}

- git rebase HEAD~{숫자}

 

이런 식으로 commit 해시값 또는 HEAD 기준 몇 개를 변경할 것인지 개수로 사용 할 수 있다.

명령어를 입력하면 vi 편집창이 뜨고, 하단 사진처럼 선택한 커밋 기록이 "pick {commit number} {commit message}" 형식으로 나열되어 있다.

여기서 변경할 커밋을 pick 부분을 e로 변경한 뒤 :wq(vi 편집기 저장 명령어)를 입력한다.

* 하단 사진에는 커밋 내역이 몇 개 없지만 여러 개도 변경 가능 하다.

 

e로  바꾼 커밋 내역에 대해 git commit --amend 명령어로 commit을 변경하면 된다.

변경이 끝나면 git rebase --continue을 입력하면 다음 변경 커밋으로 넘어가고, 

갑자기 변경하고 싶지 않으면(?) git rebase --skip을 입력하면 변경 없이 넘어간다.

모든 선택한 커밋에 대한 변경이 끝나면 

rebase 끝!

성공했다고 알려준다!

 


모든 명령어가 처음에는 낯설고 헷갈릴 수 있겠지만 뭐든 쓰다 보면 익숙해지는 것 같다.

그리고 익숙해지고 나면 프로젝트를 할 때 훨씬 빠르고 쉽게 git으로 협업을 할 수 있다

나 역시 우여곡절을 겪으면서 익숙해졌다! (이 포스팅의 부제가 우여곡절인 이유)

 

그러니까 멋지게 Git 명령어 쓰면서 같이 행복한 개발 해요🌱 (급 마무리)