특정 브랜치에서 작업은하였으나, commit은 안한상태에서
다른 브랜치로 switch 할때 필요한 command
veritas@veritas:~/git/gittest$ git status
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git switch master
error: Your local changes to the following files would be overwritten by checkout:
main.py
Please commit your changes or stash them before you switch branches.
Aborting
veritas@veritas:
b1->master 로 switch시 main.py 에서 conflict 가 일어남
conflict 될 요소가없다면 switch 되는 경우도 있음. (FastFoward)
stash 는 아래와 같은 상황에 쓰일수 있다.
b1 브랜치에서 내가 작업중이고 b2 브랜치에서 동료가 작업중인데
동료가 b2 브랜치에서 도움을 요청해서 b1->b2로 switch 하려고 하는데 나는 아직 변경사항을 commit할 상태가 아님.
이때 stash를 활용.
변경사항을 일종의 stack에 저장 및 불러올 수 있는 기능
git stash(git stash save) 를 하면 현재 작업을 일시적으로 저장할수 있다. (일종의 stack에 저장)
이때 status 에는 변경사항이 존재하지않음.
이상태에서 다른 branch로 switch 하여 작업후 다시 원 branch 로 복귀 git stash pop
으로 작업 내용을 복구
veritas@veritas:~/git/gittest$ git stash save
Saved working directory and index state WIP on b1: 6e28fc9 b1 commit
veritas@veritas:~/git/gittest$ git status
On branch b1
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git stash pop
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
Dropped refs/stash@{0} (ce4e38e4d5dfc88ea22ab10f21089dbc658bd7db)
veritas@veritas:~/git/gittest$ git status
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
stash된 사항들을 보여준다.
pop은 list에서 stash 사항을 꺼내옴. (stack의 pop을 생각)
반면 apply 는 stash된 사항을 적용하나 stack에서 삭제하지는 않음.
git apply 사용처 : 해당 브랜치의 변경사항을 다른 여러 branch에 적용하고 싶을때 사용.
veritas@veritas:~/git/gittest$ git status
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
veritas@veritas:~/git/gittest$ git stash
Saved working directory and index state WIP on b1: 6e28fc9 b1 commit
veritas@veritas:~/git/gittest$ git switch master
Switched to branch 'master'
veritas@veritas:~/git/gittest$ git stash apply
Auto-merging main.py
CONFLICT (content): Merge conflict in main.py
veritas@veritas:~/git/gittest$ git status
On branch master
Unmerged paths:
(use "git restore --staged <file>..." to unstage)
(use "git add <file>..." to mark resolution)
both modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
##### conflit를 해결한다.
veritas@veritas:~/git/gittest$ git add .
veritas@veritas:~/git/gittest$ git commit -m "apply stahsed changes"
[master 66bb542] apply stahsed changes
1 file changed, 1 insertion(+), 1 deletion(-)
veritas@veritas:~/git/gittest$ git status
On branch master
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git stash list
stash@{0}: WIP on b1: 6e28fc9 b1 commit
veritas@veritas:~/git/gittest$ git switch b1
Switched to branch 'b1'
veritas@veritas:~/git/gittest$ git status
On branch b1
nothing to commit, working tree clean
veritas@veritas:~/git/gittest$ git stash apply
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
stash 사항이 여러개인 상태에서 apply 혹은 pop을 하면 가장 최신 stash 가 반영.
아래의 경우 2번.
veritas@veritas:~/git/gittest$ git stash list
stash@{0}: WIP on b1: 6e28fc9 b1 commit
stash@{1}: WIP on b1: 6e28fc9 b1 commit
stash@{2}: WIP on b1: 6e28fc9 b1 commit
단 git stash apply stash@{1}
과 같이 특정 stash 를 지정하여 apply 가능.
veritas@veritas:~/git/gittest$ git stash list
stash@{0}: WIP on b1: 6e28fc9 b1 commit
stash@{1}: WIP on b1: 6e28fc9 b1 commit
stash@{2}: WIP on b1: 6e28fc9 b1 commit
veritas@veritas:~/git/gittest$ git stash apply stash@{1}
On branch b1
Changes not staged for commit:
(use "git add <file>..." to update what will be committed)
(use "git restore <file>..." to discard changes in working directory)
modified: main.py
no changes added to commit (use "git add" and/or "git commit -a")
stash list 를 완전히 비움
최신 stash 혹은 특정 stash 를 삭제함