이동 - git set upstream




Git의 브랜치에서 커밋을 삭제한다. (18)

커밋을 삭제하는 방법을 알고 싶습니다.

delete 한다는 것은 마치 내가 커밋을하지 않은 것과 같은 의미이며, 앞으로 밀어 넣을 때 변경 사항이 원격 지사로 전달되지는 않습니다.

나는 git 도움을 읽고, 나는 사용해야하는 명령은 git reset --hard HEAD 라고 생각한다. 이 올바른지?



repo에서 커밋 2와 4를 제거하려고한다고 가정 해보십시오.

commit 0 : b3d92c5
commit 1 : 2c6a45b
commit 2 : <any_hash>
commit 3 : 77b9b82
commit 4 : <any_hash>

참고 : --hard-f 사용 하고 있으므로 repo에 대한 관리자 권한이 있어야합니다 .

  • git checkout b3d92c5 마지막으로 사용 가능한 커밋을 체크 아웃합니다.
  • git checkout -b repair 작업 할 새 분기를 만듭니다.
  • git cherry-pick 77b9b82 커밋을 통해 실행 3.
  • git cherry-pick 2c6a45b 커밋을 통해 실행 1.
  • git checkout master 체크 아웃 마스터.
  • git reset --hard b3d92c5 마스터를 마지막으로 사용 가능한 커밋으로 재설정합니다.
  • git merge repair 새 분기를 마스터에 병합합니다.
  • git push -f origin master 마스터를 원격 저장소로 푸시합니다.

내가 커밋하고 푸시 할 때 보통하는 일 (누군가 커밋하면 커밋으로 문제가 해결됨) :

git reset --hard HEAD~1

git push -f origin

도움이되기를 바랍니다.


또 다른 가능성은 개인적으로 좋아하는 명령 중 하나입니다.

git rebase -i <commit>~1

이 명령은 대화식 모드 -i 에서 rebase를 시작할 것입니다. 편집기는 그 이후로 모든 커밋을 나열하는 작업을 시작합니다. 삭제하려는 커밋을 포함하는 행을 삭제하고 파일을 저장하십시오. Rebase는 나머지 작업을 수행하고, 커밋 만 삭제하고, 나머지는 모두 로그에 다시 재생합니다.


로컬 분기에서 삭제하려면 다음을 사용하십시오.

git reset --hard HEAD~1

원격 지점에서 삭제하려면 다음을 사용하십시오.

git push origin HEAD --force

마지막 커밋 (잘못된 메시지, 변경 사항을 추가하는 것을 잊어 버린 것)을 엉망으로 만든 다음이를 공용 repo에 넣기 전에 수정하고 싶지 않은 이유는 무엇입니까?

git commit --amend -m "New message here"

새로 변경된 변경 사항은 마지막 커밋 (제거하려고하는 커밋)과 결합되어 해당 커밋을 대체합니다.

물론 그것을 밀어 넣은 후에 커밋을 수정한다면, 역사를 다시 쓰는 것입니다. 그렇게한다면, 그 의미를 확실히 이해하십시오.

이전 커밋의 메시지를 사용하고 싶다면 '-m'대신 '--no-edit'옵션을 전달할 수도 있습니다.

문서 도구 : http://git-scm.com/docs/git-commit.html


아직 어디에도 커밋을 푸시하지 않은 경우 git rebase -i 를 사용하여 커밋을 제거 할 수 있습니다. 먼저, 그 커밋이 얼마나 뒤로 (대략) 있는지 찾아보십시오. 그럼 :

git rebase -i HEAD~N

~N 은 마지막 N 커밋을 리베이스 (rebuase)합니다 ( N 은 숫자 여야합니다, 예를 들어 HEAD~10 ). 그런 다음 Git이 제시 한 파일을 편집하여 위반 커밋을 삭제할 수 있습니다. 그 파일을 저장하면 Git은 삭제 한 파일이없는 것처럼 다음 커밋을 모두 다시 작성합니다.

Git Book은 사진과 예제로 리베이스 하기에 좋은 섹션을 가지고있다.

비록 당신 다른 곳으로 밀어 넣은 것을 바꾸면, 당신이 강제 추궁을 할 계획이 아니라면 또 다른 접근법이 필요할 것이기 때문에 이것을주의하십시오.


원격 저장소로 푸시되지 않았다고 가정하면 저장소를 다시 복제 할 수 있습니다. 이것은 몇 번 선택의 나의 방법이었습니다.


이렇게하는 또 다른 방법은 다음과 같습니다.

되 돌리는 지점을 체크 아웃 한 다음 로컬 작업 복사본을 원격 서버의 최신 복사본으로 다시 커밋 (모든 작업이 끝난 후 모든 작업)으로 다시 설정합니다. 이렇게하려면 SourceTree에서를 마우스 오른쪽 버튼으로 클릭하고 "BRANCHNAME을이 커밋으로 재설정"을 선택하십시오. 명령 줄은 다음과 같습니다.

git reset --hard COMMIT_ID

방금 원격 지점에서 지점을 체크 아웃 했으므로 잃는 것에 대해 걱정할 로컬 변경 사항이 없습니다. 하지만 그렇게했다면 잃을 것입니다.

그런 다음 저장소의 로컬 디렉토리로 이동하여 다음 명령을 실행하십시오.

git -c diff.mnemonicprefix=false -c core.quotepath=false \
push -v -f --tags REPOSITORY_NAME BRANCHNAME:BRANCHNAME

이렇게하면 로컬 저장소의 현재 커밋 이후의 모든 커밋이 지워지지만 그 하나의 분기 만 커밋됩니다.


이미 푸시했다면, 먼저 HEAD에있는 커밋을 찾고 ($ GIT_COMMIT_HASH_HERE) 다음을 실행하십시오 :

git reset --hard $GIT_COMMIT_HASH_HERE
git push origin HEAD --force

그런 다음 repo가 ​​복제 된 각 장소에서 다음을 실행합니다.

git reset --hard origin/master

최신 커밋을 수정하려면 다음을 수행하여 커밋을 실행 취소하고 그 안에있는 파일을 제거 할 수 있습니다.

git reset HEAD~1

그러면 파일을 준비한 git add 명령이 실행되기 전에 저장소가 상태로 돌아갑니다. 변경 사항은 작업 디렉토리에 있습니다. HEAD ~ 1은 브랜치의 현재 팁 아래 커밋을 참조합니다.

N 개의 커밋을 언 커밋하고 작업 디렉토리에 코드 변경 사항을 유지하려면 다음을 수행하십시오.

git reset HEAD~N

최신 커밋을 없애고 코드 변경 사항을 유지하고 싶지 않으면 "하드"재설정을 수행 할 수 있습니다.

git reset --hard HEAD~1

마찬가지로 마지막 N 개의 커밋을 삭제하고 코드를 변경하지 않으려면 다음을 수행하십시오.

git reset --hard HEAD~N

최신 커밋을 제거하기 위해 변경 사항을 게시하지 않은 경우 수행 할 수 있습니다.

$ git reset --hard HEAD^

(이것은 커밋되지 않은 모든 변경 사항을 제거하므로주의해서 사용해야 함).

이미 삭제 될 커밋을 게시했다면 git revert를 사용하십시오.

$ git revert HEAD

코드를 임시 폴더에 백업하십시오. 다음 명령은 서버와 동일하게 재설정됩니다.

git reset --hard HEAD
git clean -f
git pull

변경 사항을 유지하고 최근 커밋을 제거하려는 경우

git reset --soft HEAD^
git pull

히스토리를 유지하고 커밋 및 되돌리기를 표시하려면 다음을 사용해야합니다.

git revert GIT_COMMIT_HASH

왜 되돌릴 것인지 설명하는 메시지를 입력 한 다음 :

git push  

git log 를 실행하면 "잘못된"커밋과 되돌리기 로그 메시지가 보일 것입니다.


강제 변경 기록

마지막 커밋을 삭제하기를 원할뿐만 아니라 마지막 n 커밋의 특정 커밋을 삭제하려면 다음과 같이 진행하십시오.

git rebase -i HEAD~<number of commits to go back> 이므로 마지막 5 개의 커밋을 보려면 git rebase -i HEAD~5 를 입력하십시오.

그런 다음 텍스트 편집기에서 제거하려는 모든 커밋 옆에있는 단어 pick 을 변경하십시오. 편집기를 저장하고 종료하십시오. 빌라!

추가 기록 변경

git revert <commit hash> 시도하십시오. Revert 는 지정된 커밋을 취소하는 새로운 커밋을 만듭니다.


나는 왜이 일을 저지르려고 노력한 누군가가 힘내 사용하는 실수로 인해 그 모든 작업을 삭제하고 싶지 않은 이유 때문에이 대답을 추가하고있다.

작업을 유지하고 커밋 명령을 '실행 취소'하려는 경우 (repo로 푸시하기 전에 걸렸습니다) :

git reset --soft HEAD~1

마지막 커밋 이후 진행중인 작업을 파기하지 않으려면 --hard 플래그를 사용하지 마십시오 .



git rebase -i HEAD~2

여기서 '2'는 리베이스하려는 커밋 수입니다.

'git rebase -i HEAD`

모든 커밋을 리베이스해야하는 경우.

그런 다음이 옵션 중 하나를 선택할 수 있습니다.

p, pick = use commit

r, reword = use commit, but edit the commit message

e, edit = use commit, but stop for amending

s, squash = use commit, but meld into previous commit

f, fixup = like "squash", but discard this commit's log message

x, exec = run command (the rest of the line) using shell

d, drop = remove commit

이 줄은 다시 정렬 할 수 있습니다. 그들은 위에서 아래로 실행됩니다. 여기서 라인을 제거하면 커밋이 손실됩니다. 그러나 모든 것을 제거하면 rebase가 중단됩니다. 빈 커밋은 주석으로 처리됩니다.

옵션 "d"또는 커밋이있는 행 제거를 사용하여 간단히 커밋을 제거 할 수 있습니다.





git-reset