문제

나는 대본을 바꾸고 헌신했다. 그런 다음 몇 가지 다른 변경을 수행하여 원격 저장소 등으로 밀어 넣었습니다.

그런 다음 내가 언급 한 첫 번째 변화가 어리석은 일이라는 것을 깨달았고 그것을 취소하고 싶다. Diff를 수동으로 복사/붙여 넣지 않고 그 커밋을 "적용 할 수 없습니까?

예를 들어 : 두 개의 파일이 있습니다. a.py 그리고 b.py:

Commit 1:
I delete a function in a.py

Commit 2:
I change a few lines in b.py

Commit 3:
I change the docstring in a.py

해당 함수 삭제를 취소하고 "Commit 4"로 보이게 할 수 있습니까 (커밋을 삭제하지 않고 1).

도움이 되었습니까?

해결책

예, 사용할 수 있습니다 git 되돌립니다 이것을 위해. 참조 이것에 대한 git 매뉴얼 섹션 자세한 내용은.

요점은 다음과 같이 말할 수 있다는 것입니다.

git revert 4f4k2a

4F4K2A가 취소하고 싶은 커밋의 ID 인 경우, 취소하려고합니다.

다른 팁

그냥 댓글 :

git revert aCommit

다시 돌아갑니다 모두 커밋 (모든 파일 커밋의 일부 ") :
역 패치를 계산하고 헤드 및 커밋에 적용합니다.

따라서 여기서 두 가지 문제 (첫 번째 문제는 쉽게 해결됩니다) :

  • 항상 커밋되므로 추가하고 싶을 수도 있습니다. -no-commit 옵션: "git revert --no-commit aCommit": 이것은 한 번 이상의 효과를주는 효과가 있습니다.
  • 특정 파일에는 적용되지 않습니다 (A.Py가 되돌리고 싶지 않은 1000 개의 다른 변경 사항이있는 커밋의 일부인 경우 어떻게해야합니까?)?
    이를 위해 특정 파일이 다른 커밋에있는 것처럼 특정 파일을 추출하려면 git-checkout, 특히 git checkout <commit> <filename> 구문 (이 경우 정확히 필요한 것은 아닙니다)

쉬운 git (Elijah Newren)은 더 "완전한 되돌아"를 git 메일 링리스트; 그러나 많은 성공없이 :

사람들은 때때로 "변화를 되돌리기"를 원합니다.

이제 이것은 다음과 같습니다.

  • 32 ~ 29 개 개정 전의 변경,
  • 마지막 커밋 이후 모든 변화 일 수 있습니다.
  • 3 번의 커밋 이후 변화가 될 수 있습니다.
  • 하나의 구체적인 커밋 일 수 있습니다.
  • 그만큼 사용자는 이러한 반전을 특정 파일로만 서브 세트 할 수 있습니다.,

(eg revert ~이다 여기에 문서화되었습니다, 그러나 나는 그것이 현재 EG의 현재 분포의 일부인지 확신하지 못한다)

그러나 그것은 결국 "변화를 되 돌리는"것으로 요약됩니다.

eg revert --since HEAD~3  # Undo all changes since HEAD~3
eg revert --in HEAD~8     # much like git revert HEAD~8, but nocommit by default
eg revert --since HEAD foo.py  # Undo changes to foo.py since last commit
eg revert foo.py               # Same as above
eg revert --in trial~7 bar.c baz.  # Undo changes made in trial~7 to bar.[ch]

이런 종류의 "재발하는 데이터"가 실제로 다른 명령이 있어야하거나 간단한 리버드 명령에 의해 이러한 작업 중 일부를 지원해서는 안되는가?
물론, 대부분의 사용자는 대부분의 시간을 사용할 것입니다.eg revert FILE1 FILE2..."형태이지만 추가 기능을 지원하는 데 피해를 보지 못했습니다.

또한 ... 핵심 GIT가 그러한 행동을 채택하지 못하게하는 근본적인 것이 있습니까?

엘리야

참고 : 기본적으로 커밋은 일반화 된 사람에게는 적합하지 않습니다. revert 명령 및 "git revert REVISION"지침이 오류가 발생합니다 (사용자에게 -깃발을 추가하라고 지시).


50 개 중 50 개 파일 중 20 파일 중 구식 Commit X가 발생하지 말아야 할 변경 사항을 도입했음을 알고 있다고 가정 해 봅시다.
약간의 배관이 순서대로 진행됩니다.
필요한 것은 필요한 모든 특정 파일을 나열하는 방법입니다. 돌아가는 것
(에서와 같이 "Commit X의 변경 사항을 취소하면서 모든 후속 변경 사항을 유지합니다."),
그리고 그들 각각에 대해 :

git-merge-file -p a.py X X^

여기서 문제는 A.Py의 모든 후속 변경 사항을 없애지 않고 잃어버린 기능을 복구하는 것입니다.
이 기술은 언젠가 "네거티브 병합"이라고 불립니다.

부터 git merge-file <current-file> <base-file> <other-file> 수단:
에서 이끄는 모든 변경 사항을 통합합니다 <base-file> 에게 <other-file> ~ 안으로 <current-file>, 당신은 할 수 있습니다 복원하다 모든 변경 사항을 통합하려고한다고 말함으로써 삭제 된 기능.)

  • 에서 : x (함수가 삭제 된 곳)
  • to : x^ (X 이전의 커밋, 함수가 아직 존재하는 곳)

참고 : '-p' 현재 파일에서 아무것도하지 않고 변경 사항을 먼저 검토 할 수있는 인수. 확실하면 해당 옵션을 제거하십시오.

메모: git merge-file ~이다 그렇게 간단하지 않습니다: 당신은 그와 같은 이전 버전의 파일을 참조 할 수 없습니다.
(당신은 실망스러운 메시지를 반복해서 할 것입니다. error: Could not stat X)
당신은 다음을해야합니다 :

git cat-file blob a.py > tmp/ori # current file before any modification
git cat-file blob HEAD~2:a.py > tmp/X # file with the function deleted
git cat-file blob HEAD~3:a.py > tmp/F # file with the function which was still there

git merge-file a.py tmp/X tmp/F # basically a RCS-style merge
                                 # note the inversed commit order: X as based, then F
                                 # that is why is is a "negative merge"
diff -u a.py tmp/ori # eyeball the merge result
git add a.py 
git commit -m "function restored" # and any other changes made from X are preserved!

이전 커밋 내의 많은 파일에 대해 이것이 완료되면 ... 일부 스크립팅이 순서대로 진행됩니다;)

다음과 같이 커밋 내에서 하나의 파일 만 변경을 되돌립니다. 지적했다 checkout 지점 (마스터 또는 트렁크 등) 그리고 그런 다음 checkout 내가 반복하고 새로운 커밋으로 취급하고 싶었던 파일의 버전.

$ git checkout trunk
$ git checkout 4f4k2a^ a.py
$ git add a.py
$ git diff              #verify I'm only changing what I want; edit as needed
$ git commit -m 'recover function deleted from a.py in 4f4k2a'

직접 수행 할 배관 명령이있을 수 있지만, 알고 있다면 사용하지 않을 것입니다. 나는 git을 신뢰하지 않는다는 것이 아니라 나 자신을 믿지 않는다. 나는 그 커밋에서 그 파일에서 바뀌는 것을 보지 않고는 그때와 그 이후로 내가 알지 못한다는 것을 믿지 않을 것이다. 그리고 내가 보이면 편집하여 새로운 커밋을 구축하는 것이 더 쉽습니다. diff. 아마도 그것은 단지 개인 작업 스타일 일뿐입니다.

살펴보십시오 이 git은 질문을 되돌립니다. 가장 최근의 커밋을 포함하여 연속적인 순서가 아닌 경우 오래된 커밋을 되 찾는 문제가있는 것 같습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top