23.03.22 TIL

최창수·2023년 3월 22일
0

문제 1. git: 한번에 pull하기

여러개의 remote branch가 존재할때, 이 branch들을 한번에 local branch로 가져오고 싶었다.

시도

1. git pull --all

push -all은 모든 local branch를 remote branch에 반영하고 pull에도 해당 옵션이 있으므로 동일하게 모든 branch를 한번에 최신화 할것 이라 생각하였다.이는 사실이 아니며 실제로 git push --all이 하는 것은 다음과 같다:

  1. 모든 remote branch를 fetch 한다.
  2. 현재 브랜치가 tracking중인 remote branch가 있다면 현재 브랜치를 최신화한다.(merge)

여타 옵션이 없는 git pull 실제 동작은 check out 한 branch의 원격 브랜치만 fetch하고 2에서 원격 브랜치를 merge하는 것이다.

merge나 rebase 작업은 충돌이 발생할 수 있으므로 해당 트리의 working tree(directory)가 열려 있어야한다. 따라서 git pull은 checkout하고 있는 branch만 pull을 수행해줄 수 있고 --all 옵션을 붙여도 모든 branch를 fetch하는 것이 전부이다.

시도 2: &&써서 한번에 입력하기

터미널에 명령을 입력할 때 &&를 쓰면 여러개의 명령을 한번에 내릴 수 있다. 단, 이전 명령어가 실패할 경우 그 뒤의 명령어는 실행되지 않는다.

1. local branch가 없을 때: checkout -b 반복

git checkout -b <새브랜치명> <원하는 브랜치 혹은 commit명>은 원하는 위치에 새 브랜치를 만들면서 checkout하는 명령어이다. 또한 자동으로 원격 브랜치를 tracking 하도록 한다.
따라서 먼저 fetch --all을 하여 모든 원격 branch들의 정보를 가져오고 해당 branch들로 반복해서 checkout을 해주면 된다.

git fetch --all
git branch -r #원격 브랜치들 확인

git checkout -b abc origin/abc && git checkout -b def origin/def && ...

2. 이미 local branch가 존재할 때: checkout → merge

먼저 fetch --all을 하여 모든 원격 branch들의 정보를 가져온다. 이후 각 local branch들을 checkout하며 fetch된 remote branch들과 merge, 혹은 rebase 하면된다.

git fetch --all
git branch -r #원격 브랜치들 확인

git checkout abc && git merge origin/abc &&...

해결: 반복문 사용

bash 명령어에서도 반복문의 사용이 가능하다. 따라서 만약 local repo에 원격 branch들을 tracking하는 branch들이 없는 경우에는 다음과같은 명령어를 입력해 해결할 수 있다.

for branch in `git branch -r`; do 
	git checkout -b ${branch#origin/} $branch; 
done

shell script에서 ${branch#origin/}git branch -r의 결과로 출력되는 각 요소인 branch에서 앞부분의origin/을 떼어낸(#origin/)것을 변수(${})로 만든 것이다.
만약 git branch -r의 결과가 다음과 같을 때

origin/HEAD -> origin/main
origin/change
origin/feature/test
origin/main

반복문 실행결과는 다음과 같을 것이다.

git checkout -b HEAD -> origin/main origin/HEAD -> origin/main; # 실패
git checkout -b change origin/change;
git checkout -b feature/test origin/feature/test;
git checkout -b main origin/main; # 이미존재하므로 실패

결론-완전하지 않은 해결

한번에 명령어를 입력하여 문제를 해결할 수는 있었지만, 결국 내 손으로 명령어를 입력해 줘야한다는 한계, 그리고 브랜치 이름에 특수문자가 있거나 git branch -r의 출력결과에 섞여나오는 파일이름 등에 실행결과가 영향을 받을 수 있는지 확인해 보지 못했다. 이는 shell script를 더 자세히 배운 뒤 .sh파일을 만들어 실행시키는 것으로 해결 할 수 있을 것이다. 따라서 shell script 작성법을 숙지한 후 완전한 해결법을 다시 작성하도록한다.

배운점

  • && vs ;: &&는 이전 명렁어가 성공적으로 실행되어야 이후 명령어가 실행된다. ;는 성공 여부와 상관없이 계속 실행한다.
  • git fetch --all가 하는 일: 원격 레포지토리의 branch들을 local repository에 가져오되 local branch들에 합치지는 않는다.
  • git pull: git pull은 실제로는 git-fetchgit merge를 합친 명령어로서 동작한다.
  • git merge가 반드시 checkout이 필요한 이유는 충돌이 발생할 수 있어 직접 파일을 편집할 수 있는 working tree(directory)를 필요로 하기 때문이다.

참고한 내용

stack-over-flow

BASH SHELL에서 FOR 루프 사용하기

문제 2. python: 올바르지 않은 indent


코드를 편집하던 중, 올바르게 들여쓰기가 되어있음에도 계속해서 error가 있음을 나타내었다.

시도

1. 손으로 다시 들여쓰기

가장 확실한 방법이었으나, 실제로 빨간줄이 그어진 부분을 아무리 다시 들여 써도 오류는 계속해서 나왔다.

2. 들여쓰기 변경

들여쓰기 방식을 VSC에서 지정할 수 있다. 이를 pep8에서 권장하는 tab, 4칸공백으로 해 보아도 고쳐지진 않았다.

해결


문제상황은 다음과 같다: tab키로 인한 공백 4칸의 입력이 VSC에서는 실제로는 공백 4칸이 입력되었고, velog등 다른곳에서 편집했던 코드에서는 tab 공백문자 하나가 들어가 있었다. 이로 인해 잘못된 indent라고 판단한 것이다.
이를 해결하기 위해서는 복사 붙여넣기 한코드를 모두 선택하여 shift tab으로 indent를 지운뒤 다시 indent를 알맞게 지정하는 것이다.

배운점

VSC 들여쓰기 관련 설정

VSC 전체 설정과 파일에 맞춰진 들여쓰기 설정을 따로 둘 수 있다.
들여 쓰기에 tab과 spaces를 함께 쓸 수는 없으므로 설정을 잘 해두고 유의하며 일관된 설정을 유지하여 작성 해야한다.

파일의 indent 설정

오른쪽아래의 spaces:4를 클릭하면 현재 파일에서의 들여쓰기 설정을 만질 수 있다. pep8에 따르면 indent using spaces, tab size 4 가 권장된다. tab키를 누르면 4개의 spaces가 입력된다.

VSC 전체 indent 설정


Auto indent: 언어에 따라 어디까지 자동으로 들여 쓰기를 해줄지 정한다.

Guides: Highlight Active Indentation: 아래의 indentation 옵션으로 생긴 indent guide가 현재 내 커서가 위치한 곳의 들여 쓰기 수준에 따라 강조된다. 아래 사진에서 바깥쪽 가이드라인이 좀더 강조된 것을 볼 수 있다.

Guides: Indentation: 붉은 동그라미로 표시한 가이드라인을 표시
Wraping Indent: 리스트, 딕셔너리 등 괄호로 싸인 요소를 줄바꿈 할때 자동 indent를 정해준다.
Insert Spaces: tab키를 눌렀을 때, 탭 크기만큼의 spaces가 입력될지(True) tab공백문자가 입력될지(False) 결정한다.
Sticky Tab Stops: 활성화할 경우 4개의 spaces가 하나의 tab문자처럼 편집(선택, 커서이동, 지우기)할 수 있다.
Tab Size: indent의 크기를 정한다. 4가 기본이자 권장사항이다.

profile
Hallow Word!

0개의 댓글