리던던시가 히스토리를 재 작성하거나 커밋을 이동하지 않는다는 사실을 깨닫게되면 힘내에서 커밋을 변경할 수 없습니다. 대신, 그것은 새로운 역사를 창조하고 그것이 그 길을 따라 갔다고 말합니다. 예를 들어, 시작 때
4-5-6(feature)
|
1-2-3(master)
|
7(bugfix)
그리고 git rebase bugfix feature
정말로 일이 이것이다 :
4-5-6
|
1-2-3(master)
|
7(bugfix)-4A-5A-6A(feature)
세 가지 새로운 커밋, 4A, 5A 및 6A를 만들어집니다. 원래의 커밋은 여전히 존재하지만 아무것도 가리 키지 않습니다. 그들은 결국 정리 될 것이지만, 그들은 며칠 동안 거기 머무를 것입니다.
즉, 사용자가하려는 작업 인 rebase를 실행 취소 할 수 있습니다. rebase 바로 앞에 feature
이 어디에 있는지 찾아야합니다. 그것은 HEAD
이 움직일 때마다 추적하는 git reflog
으로 수행 할 수 있습니다. 이는 checkout
, commit
, reset
및 rebase
으로 발생합니다. git reflog
일 수 있습니다 뭔가 같은 : a9fd2f1 그것이으로 업데이트되기 전에 마지막으로이 기능을 저지했다 알려줍니다
65e93ca (HEAD -> feature) [email protected]{0}: rebase finished: returning to refs/heads/feature
65e93ca (HEAD -> feature) [email protected]{1}: rebase: 3 feature
6d539a3 [email protected]{2}: rebase: 2 feature
3cd634f [email protected]{3}: rebase: 1 feature
b84924b (bugfix) [email protected]{4}: rebase: checkout bugfix
a9fd2f1 [email protected]{5}: commit: 3 feature
29136bc [email protected]{6}: commit: 2 feature
60543b0 [email protected]{7}: commit: 1 feature
c487530 (master) [email protected]{8}: checkout: moving from master to feature
. 리베이스를 재실행하는 대신, 필자는 단지 기능을 되돌릴 수 있습니다. 당신이 REBASE을하기 전에 기능의 원래 위치를 git tag
경우 향후
git checkout feature
git reset --hard a9fd2f1
는 이런 종류의 물건이 훨씬 쉬워졌다. 그런 다음 reflog를 검색 할 필요없이
git reset
을 해당 태그로 되돌릴 수 있습니다. 당신이
git rebase master feature
을 물어 보면
6A [feature]
|
5A
|
4A
|
7 [bugfix]
|
3 [master]
|
2
|
1
이 망할 놈의 마스터가 이미 기능의 조상이며 않는다는 것을 노트 : 특정 문제에 관해서는
는 문제는 REBASE 후 저장소가 지금과 같은 것입니다 아무것도. bugfix가 중간에있는 것은 중요하지 않습니다.
대신, 당신은 단지 4A, 5A, 6A를 rebase하고 7을 무시하고 싶다는 것을 Git에게 알려줘야합니다. 이것은 --onto
구문을 사용하여 이루어졌습니다.
git rebase --onto master bugfix feature
마스터에 기능을 버그 수정하지 않고 포함시키지 않는 것이 있습니다.
rebase를 다시 시도하는 대신 git reset
을 사용하는 것이 좋습니다. 특히 충돌이있는 경우 두 번째 rebase가 동일하게 나올 것이라는 보장은 없습니다. git reset
을 사용하는 경우 명시 적으로 저장소의 이전 상태로 다시 이동합니다.
감사합니다! git rebase --onto는 내가 필요한 것입니다. bugfix에 rebase 한 후에 변경하지 않은 경우 git reflog가 작동합니다. – chohocvo