etc./StackOverFlow

로컬 리포지토리 분기를 원격 리포지토리 HEAD와 동일하게 재설정

청렴결백한 만능 재주꾼 2021. 9. 30. 00:19
반응형

질문자 :hap497


원격 저장소의 분기처럼 로컬 분기를 재설정하려면 어떻게 해야 합니까?

나는 했다:

 git reset --hard HEAD

git status 실행하면

 On branch master Changes to be committed: (use "git reset HEAD <file>..." to unstage) modified: java/com/mycompany/TestContacts.java modified: java/com/mycompany/TestParser.java

내가 왜 이것을 '수정'했는지 말해 주시겠습니까? 이 파일을 건드리지 않았습니까? 그렇다면 제거하고 싶습니다.



원격 분기와 정확히 일치하도록 분기를 설정하는 것은 두 단계로 수행할 수 있습니다.

 git fetch origin git reset --hard origin/master

이 작업을 수행하기 전에 현재 분기의 상태를 저장하려면(경우에 따라) 다음을 수행할 수 있습니다.

 git commit -a -m "Saving my work, just in case" git branch my-saved-work

이제 작업이 "my-saved-work" 브랜치에 저장되어 다시 원할 경우(또는 나중에 보거나 업데이트된 브랜치와 비교하려는 경우)에 대비합니다.

첫 번째 예는 원격 repo의 이름이 "origin"이고 원격 repo의 "master"라는 브랜치가 로컬 repo의 현재 체크아웃된 분기와 일치한다고 가정합니다.

BTW, 당신이 처한 이 상황은 non-bare 저장소의 현재 체크 아웃된 분기에 푸시가 수행된 일반적인 경우와 매우 유사합니다. 최근에 로컬 리포지토리에 푸시하셨습니까? 그렇지 않은 경우 걱정할 필요가 없습니다. 다른 원인으로 인해 이러한 파일이 예기치 않게 수정되었을 것입니다. 그렇지 않으면, non-bare 저장소(특히 현재 체크 아웃된 분기가 아님)로 푸시하지 않는 것이 좋습니다.


Dan Moulding

나는해야했습니다 (허용 된 답변의 솔루션) :

 git fetch origin git reset --hard origin/master

뒤이어:

 git clean -f

로컬 파일을 제거하려면

제거할 파일을 확인하려면(실제로 제거하지 않고):

 git clean -n -f

Akavall

먼저 git reset 을 사용하여 해당 업스트림 분기의 이전에 가져온 HEAD

 git reset --hard @{u}

@{u} 또는 자세한 형식 @{upstream} 을 지정하는 이점은 원격 저장소 및 분기의 이름을 명시적으로 지정할 필요가 없다는 것입니다. Windows 또는 PowerShell에서 "@{u}" (큰따옴표 포함)를 지정합니다.

다음으로 필요에 따라 git clean 을 사용하여 추적되지 않은 파일을 제거하고 선택적으로 -x 도 사용합니다.

 git clean -df

마지막으로 필요에 따라 최신 변경 사항을 가져옵니다.

 git pull

Asclepius

git reset --hard HEAD 실제로 마지막 커밋 상태로만 재설정합니다. 이 경우 HEAD는 지점의 HEAD를 나타냅니다.

커밋이 여러 개 있으면 작동하지 않습니다.

아마도 당신이하고 싶은 것은 원점 헤드 또는 원격 저장소가 호출되는 것으로 재설정하는 것입니다. 나는 아마도 다음과 같이 할 것입니다.

 git reset --hard origin/HEAD

그래도 조심하세요. 하드 리셋은 쉽게 취소할 수 없습니다. Dan이 제안한 대로 수행하고 재설정하기 전에 변경 사항의 복사본을 분기하는 것이 좋습니다.


Mikael Ohlson

위의 모든 제안은 옳지만 종종 프로젝트를 실제로 .gitignore 있는 파일도 제거해야 합니다.

프로젝트 디렉토리 를 지우고 원격에서 다시 복제하는 것과 같은 도덕적 가치를 얻으려면 다음을 수행하십시오.

 git fetch git reset --hard git clean -x -d -f

경고 : git clean -x -d -f되돌릴 수 없으며 파일과 데이터를 잃을 수 있습니다(예: .gitignore 사용하여 무시했던 항목).


Christopher Smith

아래 명령어를 사용하세요. 이 명령은 로컬 git에서도 추적되지 않은 모든 파일을 제거합니다.

 git fetch origin git reset --hard origin/master git clean -d -f

Jamsheer

질문은 여기에 두 가지 문제를 혼합합니다.

  1. 원격 지점이 있는 지점으로 로컬 분기를 재설정하는 방법
  2. git status nothing to commit, working directory clean. 없도록 스테이징 영역(및 작업 디렉터리)을 지우는 방법, 작업 디렉터리 정리.

원스톱 답변은 다음과 같습니다.

  1. git fetch --prune (선택 사항) 원격 저장소의 로컬 스냅샷을 업데이트합니다. 추가 명령은 로컬 전용입니다.
    git reset --hard @{upstream} 로컬 분기 포인터를 원격 스냅샷이 있는 위치에 배치하고 인덱스와 작업 디렉토리를 해당 커밋의 파일로 설정합니다.
  2. git clean -d --force git이 "작업 디렉토리 정리"라고 말하는 것을 방해하는 추적되지 않은 파일과 디렉토리를 제거합니다.

Robert Siemer

원격 저장소가 origin branch_name 관심이 있는 경우:

 git fetch origin git reset --hard origin/<branch_name>

origin 분기를 HEAD 로 재설정합니다.

 git fetch origin git reset --hard origin/HEAD

작동 방식:

git fetch origin 은 아무것도 병합하거나 리베이스하지 않고 원격에서 최신 파일을 다운로드합니다.

그런 다음 git reset<branch_name> 분기를 방금 가져온 것으로 재설정합니다. --hard 옵션은 작업 트리의 모든 파일을 origin/branch_name 의 파일과 일치하도록 변경합니다.


eigenharsha

이것은 내가 정기적으로 직면하는 문제이며 위에서 제공한 Wolfgang 스크립트를 모든 분기와 함께 작동하도록 일반화했습니다.

나는 또한 "확실합니까?" 프롬프트 및 일부 피드백 출력을 추가했습니다.

 #!/bin/bash # reset the current repository # WF 2012-10-15 # AT 2012-11-09 # see http://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head timestamp=`date "+%Y-%m-%d-%H_%M_%S"` branchname=`git rev-parse --symbolic-full-name --abbrev-ref HEAD` read -p "Reset branch $branchname to origin (y/n)? " [ "$REPLY" != "y" ] || echo "about to auto-commit any changes" git commit -a -m "auto commit at $timestamp" if [ $? -eq 0 ] then echo "Creating backup auto-save branch: auto-save-$branchname-at-$timestamp" git branch "auto-save-$branchname-at-$timestamp" fi echo "now resetting to origin/$branchname" git fetch origin git reset --hard origin/$branchname

Andrew Tulloch

나는 했다:

 git branch -D master git checkout master

분기를 완전히 재설정하려면


참고, 필요한 브랜치를 삭제할 수 있으려면 다른 브랜치로 체크아웃해야 합니다.


user2846569

다음은 가장 인기 있는 답변이 제안하는 것을 자동화하는 스크립트입니다... 분기를 지원하는 개선된 버전 은 https://stackoverflow.com/a/13308579/1497139를 참조하십시오.

 #!/bin/bash # reset the current repository # WF 2012-10-15 # see https://stackoverflow.com/questions/1628088/how-to-reset-my-local-repository-to-be-just-like-the-remote-repository-head timestamp=`date "+%Y-%m-%d-%H_%M_%S"` git commit -a -m "auto commit at $timestamp" if [ $? -eq 0 ] then git branch "auto-save-at-$timestamp" fi git fetch origin git reset --hard origin/master

Wolfgang Fahl

대답

 git clean -d -f

과소 평가되었습니다(디렉토리를 제거하려면 -d). 감사 해요!


Anael

저와 같은 문제가 있었다면 이미 일부 변경 사항을 커밋했지만 이제 어떤 이유로든 제거하고 싶은 경우 가장 빠른 방법은 다음과 같이 git reset

 git reset --hard HEAD~2

필요하지 않은 커밋이 2개 있으므로 숫자 2입니다. 재설정할 커밋 수로 변경할 수 있습니다.

따라서 귀하의 질문에 답하십시오 - 원격 저장소 HEAD보다 5번 더 앞서 있는 경우 다음 명령을 실행해야 합니다.

 git reset --hard HEAD~5

변경 사항을 잃게 되므로 주의하십시오!


Karol

이전 답변에서는 재설정할 분기가 현재 분기(체크아웃됨)라고 가정합니다. 의견에서 OP hap497 은 분기가 실제로 체크 아웃되었다고 명시했지만 이것은 원래 질문에서 명시적으로 요구하지 않습니다. 적어도 하나의 "중복" 질문이 있으므로 분기가 체크아웃되었다고 가정하지 않는 완전히 저장소 상태로 분기 재설정, 여기에 대안이 있습니다.

"mybranch" 분기가 현재 체크아웃되지 않은 경우 원격 분기 "myremote/mybranch"의 헤드로 재설정하려면 다음 저수준 명령을 사용할 수 있습니다.

 git update-ref refs/heads/mybranch myremote/mybranch

이 방법은 체크 아웃된 분기를 그대로 두고 작업 트리를 건드리지 않습니다. 그것은 단순히 mybranch의 머리를 다른 커밋으로 이동합니다. 이는 여러 분기를 새 원격 헤드로 업데이트해야 하는 경우에 특히 유용합니다.

그러나 이 작업을 수행할 때 주의하고 gitk 또는 유사한 도구를 사용하여 소스와 대상을 다시 확인하십시오. 현재 브랜치에서 실수로 이 작업을 수행하면(git이 이를 방지하지 않음), 새 브랜치 내용이 변경되지 않은 작업 트리와 일치하지 않기 때문에 혼동될 수 있습니다(수정하려면 브랜치를 다시 업데이트하고, 이전에 있던 곳으로).


Rainer Blome

이것은 내가 자주 사용하는 것입니다.

 git fetch upstream develop; git reset --hard upstream/develop; git clean -d --force;

로컬 master/develop 브랜치를 변경하지 않고 변경 유형이 앞에 붙은 브랜치 이름을 사용하여 변경 사항에 대해 대신 다른 브랜치에 체크아웃하는 것이 좋습니다(예: feat/ , chore/ , fix/ 등). 따라서 마스터에서 변경 사항을 푸시하지 않고 변경 사항을 가져오기만 하면 됩니다. 다른 사람들이 기여하는 다른 지점도 마찬가지입니다. 따라서 위의 내용은 다른 사람이 커밋한 분기에 변경 사항을 커밋하고 재설정해야 하는 경우에만 사용해야 합니다. 그렇지 않으면 앞으로 다른 사람들이 푸시하는 분기로 푸시하는 것을 피하고 대신 체크아웃한 분기를 통해 체크아웃하고 해당 분기로 푸시하십시오.

로컬 분기를 업스트림 분기의 최신 커밋으로 재설정하려는 경우 지금까지 저에게 효과가 있는 것은 다음과 같습니다.

리모컨을 확인하고, 업스트림과 오리진이 예상한 것인지 확인하고, 예상과 다른 경우 git remote add upstream <insert URL> 을 사용합니다(예: 포크한 원래 GitHub 리포지토리 및/또는 git remote add origin <insert URL of the forked GitHub repo> .

 git remote --verbose git checkout develop; git commit -m "Saving work."; git branch saved-work; git fetch upstream develop; git reset --hard upstream/develop; git clean -d --force

GitHub에서 작업을 저장하기 위해 로컬과 동일한 이름의 분기를 체크아웃할 수도 있습니다. 하지만 origin development가 로컬 저장 작업 분기와 동일한 변경 사항을 가지고 있는 경우에는 필요하지 않습니다. 저는 개발 분기를 예로 사용하고 있지만 기존 분기 이름이 될 수 있습니다.

 git add . git commit -m "Reset to upstream/develop" git push --force origin develop

그런 다음 충돌이 있는 동안 이러한 변경 사항을 다른 분기와 병합해야 하는 경우 개발 시 변경 사항을 유지하려면 다음을 사용하십시오.

 git merge -s recursive -X theirs develop

사용하는 동안

 git merge -s recursive -X ours develop

branch_name의 충돌하는 변경 사항을 보존합니다. git mergetool 과 함께 mergetool을 사용하십시오.

모든 변경 사항과 함께:

 git commit -m "Saving work."; git branch saved-work; git checkout develop; git fetch upstream develop; git reset --hard upstream/develop; git clean -d --force; git add .; git commit -m "Reset to upstream/develop"; git push --force origin develop; git checkout branch_name; git merge develop;

업스트림/개발 대신 커밋 해시, 다른 브랜치 이름 등을 사용할 수 있습니다. Oh My Zsh와 같은 CLI 도구를 사용하여 브랜치가 커밋할 것이 없고 작업 디렉토리가 깨끗함을 나타내는 녹색인지 확인합니다( git status 의해 확인되거나 확인할 수 있음). 이 사실 때문에이 경우에, 당신은 다음에 변경 당겨 수, 자동 커밋, 예를 들어, UML 다이어그램, 라이센스 헤더 등 추가 만약 거기에 아무것도 개발 상류에 비해 커밋을 추가 할 수 있습니다 origin develop 위해 upstream develop 경우, 필요.


James Ray

3 명령만 작동합니다.

 git fetch origin git reset --hard origin/HEAD git clean -f

Deep Nirmal

작업 디렉토리와 인덱스 모두에 대해 HEAD 상태로 돌아가려면 HEAD^ git reset --hard HEAD 를 실행해야 합니다. --hard 의 단일 대시 대 이중 대시와 같이 오타일 수 있습니다.)

해당 파일이 수정된 상태로 나타나는 이유에 대한 구체적인 질문은 하드 리셋 대신 소프트 리셋을 한 것 같습니다. HEAD 커밋에서 변경된 파일이 마치 마치 준비된 것처럼 나타나게 됩니다.


Emil Sit

재설정 및 정리의 양은 로컬 git repo에서 추적되지 않고 수정된 파일에 영향을 주지 않는 것 같습니다(위의 모든 옵션을 시도했습니다). 이에 대한 나의 유일한 해결책은 로컬 리포지토리를 RM하고 원격에서 다시 복제하는 것이었습니다.

다행히 내가 신경 쓰는 다른 지점은 없었습니다.

xkcd: 힘내


Martin

내가 본 모든 경우에 작동하는 유일한 솔루션은 삭제하고 다시 복제하는 것입니다. 다른 방법이 있을 수도 있지만 분명히 이 방법은 이전 상태가 남아 있을 가능성이 없으므로 선호합니다. git에서 자주 엉망이 되는 경우 Bash one-liner를 매크로로 설정할 수 있습니다.

 REPO_PATH=$(pwd) && GIT_URL=$(git config --get remote.origin.url) && cd .. && rm -rf $REPO_PATH && git clone --recursive $GIT_URL $REPO_PATH && cd $REPO_PATH

* .git 파일이 손상되지 않았다고 가정


sudo

기능 분기를 만드는 것을 잊어버리고 실수로 마스터에 직접 커밋했습니까?

당신은 빌드 파일 자물쇠와 시험과 문제를 유발 방지하기 위해 현재 기능 지점과 worktree (로컬 파일 시스템)에 영향을주지 않고 세트 마스터 다시 만들 수 있습니다 :

 git checkout -b feature-branch git branch -f master origin/master

Grastveit

로컬 변경 사항을 저장하는 데 신경 쓰지 않고 원본/HEAD와 일치하도록 리포지토리를 업데이트하려는 경우 로컬 변경 사항을 숨기고 다음을 가져올 수 있습니다.

 git stash git pull

Micah Walter

출처 : 여기를 클릭하세요


출처 : http:www.stackoverflow.com/questions/1628088/reset-local-repository-branch-to-be-just-like-remote-repository-head

반응형