그것은 예를 들어, 파일의 제거를 캡처하지 않습니다 :
$ git checkout draft_feature_a $(git diff --name-only master draft_feature_a)
error: pathspec 'ttt.py' did not match any file(s) known to git.
당신은과 같은 일을 할 수있는 실제 REBASE -와 - 스쿼시 - 등 (I 꽤 많이, 아래의 "오류 복구"같은 사용 것은, 정말로, 원래의 커밋은 모두 여전히 볼 수 draft_feature_a
에)있다 : 대부분의 시간에 난 그냥 초안 작업을 "자식이 -i을 리베이스"거야하지만
$ git checkout -b draft_feature_a
[work, commit, etc - I made two commits: add newfile and rm ttt.py]
$ git checkout master
Switched to branch 'master'
$ git checkout -b feature_a
Switched to a new branch 'feature_a'
$ git merge draft_feature_a
Updating 523bacb..3a486fc
Fast-forward
newfile | 0
ttt.py | 14 --------------
2 files changed, 14 deletions(-)
create mode 100644 newfile
delete mode 100644 ttt.py
git rebase -i master
[edit to make everything but the first a "fixup"]
...
2 files changed, 14 deletions(-)
create mode 100644 newfile
delete mode 100644 ttt.py
Successfully rebased and updated refs/heads/feature_a.
$ git commit --amend
[edit commit message]
는 사실이 많은 것 워크 플로우를 사용합니다. 개별 "초안"분기를 만들지 여부에 상관없이 원래의 커밋을 사용할 수 있으며 이름을 잃어 버리고 reflog를 통해 커밋 ID를 찾아야합니다.
$ git checkout master
Switched to branch 'master'
$ git branch -D draft_feature_a
Deleted branch draft_feature_a (was 3a486fc).
$ git branch -D feature_a
Deleted branch feature_a (was 0fc36f0).
(이제 새로운 예() 우선, 앞의 예를 정리하자) 대신 새로운 지점과 "자식 병합"-ing를 만드는 새 이름을 추가 할 수 있습니다
$ git checkout -b feature_a
Switched to a new branch 'feature_a'
[work work work]
[time to clean up, let's stick a label on this version so I can find it easily:]
$ git branch messy_feature_a feature_a
$ git rebase -i master
일단 모든 것을 고치면 모든 "초안"(저품질/지저분한) 메시지가 편집되고, 수정 된 메시지, 수정 된 메시지, 작품은 "지저분한"이름으로 여전히 이름으로 이용 가능합니다. 만족스럽고 오래된 이름을 원하지 않으면 수동으로 삭제합니다 (git branch -D
).
이 속임수를 이해하려면 속임수를 쓸 때마다 에만 새로운 커밋을 추가하십시오.. 오래된 것들은 (결국) "가비지 수집"하기 위해 암시 적이거나 명백한 것을 할 때까지 당신의 저장소에 있습니다. 그들은 3a486fc
스타일 SHA1 이름 이외의 다른 이름으로 커밋을 가능하게하는 지점 레이블 이름 (또는 태그와 같은 다른 "보이는"이름)을 가지고있는 한 "영원히"지속됩니다. 분기를 삭제하면 레이블이 지워집니다. 1 ~ 3 개월 후, 레이블이없는 커밋은 결국 가비지 수집됩니다. 더 정확하게는 reflog에 이름이 있습니다. reflog 항목에 시간 제한이 있습니다. 매개 변수, 특히 --expire=<time>
매개 변수에 대한 설명서를 참조하십시오.
마찬가지로 "rebase"는 새로운 시리즈를 만듭니다 모든 커밋을 거기에 남겨둔다.REBASE은 커밋의 새로운 시리즈의 마지막에 자식 껍질을 커밋 및 페이스트를의 이전 시리즈의 마지막 오프 라벨을 수행하는 경우 :
A -- B -- C [label: master]
\
D -- E [label: feature_a]
[rebase feature_a on master, and squash or fixup to make commit DE which is D+E]
A -- B -- C [label: master]
| \
| D -- E [no label!]
\
DE [label: feature_a]
당신이 REBASE을하기 전에 별도의 레이블을 추가 할 경우, current-branch feature_a
레이블이 벗겨지고 새 커밋으로 이동되지만 다른 레이블 (messy_feature_a
)이 붙어서 커밋 E와 전체 체인 (C에서 D 및 E 분기)에 쉽게 액세스 할 수 있습니다.
torek에서 언급 한 삭제 된 파일을 제외하고이 파일은 실제 파일입니다. – cforbish