우리 회사에서 새로운 일을하고 Subversion의 git에 들어갔다. 주말에는 우리가하지 않은 지점의 공개 버전에 대한 커밋이있는 저장소의 상황에 처하게되었다. 거기있어.git에서 "닫힌"브랜치를 오염시키는 커밋을 더 잘 처리하려면 어떻게해야합니까?
A -> B
을 그리고있는 지점을 넣어 나쁜 커밋을 가지고 : 우리는 있었다
A -> B -> C -> D
C와 D는 해당 분기에 없었을 것이다. 문제는이 지점이 "닫혔다"는 것입니다. 이것은 우리 소프트웨어의 출시 된 버전이었으며이 지점에 대한 새로운 커밋이 없어야했습니다. ! 서브 버전에서
상황이 이런 종류의 밖으로 유일한 방법은 커밋 D이었고, 그래서 당신은 끝낼 C : B에 날 다시 얻을 수 있지만, 타임 라인에 전진 나를 계속A -> B -> C -> D -> !D -> !C
!을 브랜치의 경우 마스터 저장소와 동기화되는 지점의 원격 사용자는 C와 D를 가져 와서 논리적으로 비슷한 버전의 B (B가 아닌 B -)로 끝내도록 실행 취소해야합니다.
this solution for reverting commits in git이 이상적으로 보였습니다. 공개 저장소를 다시 A -> B
에 넣었습니다. 그러나 그것은 누군가의 작업 컴퓨터에서이 분기의 복제본이 매우 부정확하고 모든 사람이 다시 복제해야한다는 것을 의미했습니다. 내 수정에 달했다 :
git checkout thebranch
git reset --hard <<commit # associated with commit B>>
git push --force
내가 위의 링크의 길을가는 결국
그것은 꽤 파문을 일으킨 :
가) 당신은 멀리 던져이 같은 자식과 대중 저장소에서 역사를 커밋 할 수 , 문자 그대로 현실을 다시 쓰라.
b) 모두를 다시 복제해야 분기 (또는 우리가 만들고자하는 지점의 새 분기)에 C -> D
을 다시 주입 할 위험이 없습니다.
git revert HEAD~2
git commit
git push
을하지만이 A -> B -> C -> D -> E
로 분기를 떠난 것과는 폐쇄해야하는데 있기 때문에 정말에 C -> D -> E
을하지 말았어야 :
나는 내가 해야 완료했다 생각합니다.
나는 세 가지 질문을 가지고 :
-
?
- 되돌리기 지점 의
push --force
이 실제로 공개 저장소에서 기록을 삭제 했습니까? 아니면 git를 B로 되 돌렸지 만C -> D
이라는 기록을 유지하고 나에 의해 어느 시점에서 되돌리기가 B로 돌아 갔는가? 커밋 로그에서 되돌리기를 확실히 표시하지는 않지만 어쩌면 내 작업의 기록을 다른 곳에서 보관할 수 있습니까? - git에서 "닫힌"브랜치를 어떻게 다룰 것인가?우리는 커밋 B에서 저장소에 태그를 적용했고 사람들은 분기 + 태그를 사용하여 릴리스의 소스를 가져야한다고 생각했지만, 이것은 가지지 않아야하는 가지 줄에 변경 사항을 표시하는 것은 여전히 무서운 일입니다 패치를 릴리스하기 위해 지점에서 분기 한 사람이 쉽게 태그를 놓칠 수 있었고
C -> D
을 새로운 지점으로 가져올 수있었습니다.
reset
대신
revert
을 사용 하시겠습니까? 가지 오염에 대한 가장 좋은 방법은 무엇입니까?
, 당신은 자식 태그에 대해 이야기하고, 맞죠? – idbrii
@pydave : 죄송합니다. 예, 태그를 의미했습니다. 내 말의 기술 교차 오염. :) –