Unix

jj (jujutsu) - rev 하나만 squash를 멀찍이 떨어진 rev에다가 하는 방법 + 특정 커밋만 계속 끌어올리는 법

ForceCore 2026. 2. 24. 16:32

claude가 알려주었다.

 

rev 하나만 다른 rev에다가 squash하는 방법

rev4

rev3

rev2

rev1

이렇게 커밋들이 있다고 하자. rev4를 rev2에다 squash하고싶다면... git처럼 생각하면 git interactive rebase를 해서 revision들의 순서를 바꾼 다음에 squash를 해야 되었을 것이다. jj는 한큐에 된다.

jj rebase --from rev4 --into rev2

이게 답이다.

 

 

특정 커밋만 계속 끌어올리는 방법 (rebase를 해서 @의 앞에 오게 하는 법)

jj에서는 모든 변경사항이 revision이다. git처럼 추적되지 않는 파일은 존재하지 않는다. .gitignore에 넣지 않는 한. 하지만 작업하다보면 remote와 다른 나만의 변경사항은 보존하고 싶은 경우가 생긴다. 이런건 독립적 rev로 만들지 않으면 나중에 push할 때 섞여 들어가서 곤란하다.

 

rev4

rev3

rev2

rev1=zp (과거로 밀려난 푸시하고 싶지 않은 나만의 rev, 이걸 끌어올리고 싶다.)

...

 

 

● Update(.jj/repo/config.toml)
  ⎿  Added 3 lines
      2
      3  [revset-aliases]
      4  "trunk()" = "master@origin"
      5 +
      6 +[custom]
      7 +float-rev = "zp"

 

[custom] 에다가 float-rev = "xxx" 로 옮기고 싶은 특정 커밋이 무엇인지 지정한다.

 

jj config get custom.float-rev

를 실행하면 zp라고 뜰 것이다. 이를 이용하는 shell alias/function를 만든다. Fish shell 같으면

 

function jjf --description "Float the configured rev to just before @"
    set rev (jj config get custom.float-rev 2>/dev/null)
    if test -z "$rev"
        echo "No custom.float-rev set for this repo"
        return 1
    end
    jj rebase -r $rev -B @
end

 

bash/zsh

  jjf() {
    local rev
    rev=$(jj config get custom.float-rev 2>/dev/null)
    [[ -z "$rev" ]] && echo "No custom.float-rev set for this repo" && return 1
    jj rebase -r "$rev" -B @
  }

이런 function을 만들면 됨. 이제 콘솔에서 jjf를 치면 끌올 rebase가 편하게 될 것이다.