로컬 저장소 분기를 원격 저장소 HEAD와 동일하게 재설정


3851

로컬 저장소를 원격 저장소의 분기와 동일하게 재설정하려면 어떻게합니까?

나는했다 :

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

내가 왜 '수정 된'이유를 말씀해 주시겠습니까? 이 파일들을 건드리지 않았습니까? 내가 그랬다면, 그것들을 제거하고 싶다.


8
git status두 번째 명령 의 출력에 따르면 git reset --hard HEAD실패했습니다. 그러나 출력을 붙여 넣지 않았습니다. → 불완전한 질문.
Robert Siemer

2
그 때문에, 어떻게 원격이고이 곳 지점에 현지 지사를 재설정하는) 당신의 준비 영역 (그리고 아마도 작업 디렉토리)를 삭제하는 방법 1) : 당신은 여기에 두 가지 문제를 믹싱 git status말한다 nothing to commit, working directory clean. - 명시 해주세요!
Robert Siemer

답변:


6687

원격 지사와 정확히 일치하도록 지사를 설정하려면 다음 두 단계를 수행하십시오.

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"분기에 작업이 저장됩니다.

첫 번째 예에서는 원격 리포지토리 이름이 "origin"이고 원격 리포지토리에서 "master"라는 분기가 로컬 리포지토리에서 현재 체크 아웃 된 분기와 일치한다고 가정합니다.

BTW, 당신이 처한 상황은 현재 비 베어 리포지토리의 체크 아웃 된 분기로 푸시가 수행되는 일반적인 경우와 끔찍한 것처럼 보입니다. 최근에 지역 리포지토리에 참여 했습니까? 그렇지 않은 경우 걱정할 필요가 없습니다. 다른 원인으로 인해 이러한 파일이 예기치 않게 수정되었습니다. 그렇지 않으면, 비베 어리 저장소 (특히 현재 체크 아웃 된 분기가 아닌)로 푸시하지 않는 것이 좋습니다.


4
답변 주셔서 감사합니다. '첫 번째 예에서는 원격 저장소의 이름이 "origin"이고 원격 저장소의 "master"라는 분기가 로컬 저장소의 분기와 일치한다고 가정합니다.' 'git reset --hard'를 실행하기 전에 어떻게 원격 저장소의 이름과 지점 이름을 다시 확인할 수 있습니까? 다시 감사합니다.
hap497

21
리모컨의 이름을 명시 적으로 지정하지 않은 경우 이름은 "origin"(기본값) 일 수 있습니다. "git remote"를 사용하여 모든 원격 이름 목록을 얻을 수 있습니다. 그런 다음 "git remote <name>"을 사용하여 어떤 브랜치가 서로 푸시 / 풀되는지 확인할 수 있습니다 (예 : "master"브랜치가 "origin"이라는 원격의 "master"에서 복제 된 경우 라인이 표시됨) "마스터가 원격 마스터와 병합됩니다").
Dan Molding

6
"
베어링

27
가져 오기 직후에, 당신도 git reset FETCH_HEAD --hard대신 할 수 있다고 생각합니다 . 그것은 같은 의미입니다.
Jean

6
추가 한 파일은 제거되지 않았습니다.
Trismegistos

416

나는해야했다 (허용 된 답변의 해결책) :

git fetch origin
git reset --hard origin/master

뒤에 :

git clean -f

로컬 파일을 제거하려면

실제로 제거하지 않고 제거 할 파일을 보려면 :

git clean -n -f

89
또한 git clean -d -f추적되지 않은 디렉토리가있는 경우.
garg

54
또한git clean -fdx
Swapnil Kotwal

14
원격 브랜치의 정확한 사본을 원한다면 git clean -ffdx를 따라야합니다. thare는 두 개의 f입니다.
Trismegistos

6
git clean -f내가 필요한 필수적인 부분이었다. 감사!
dgo

17
clean 명령을 사용하여주의하십시오. 다른 브랜치에서 무시 된 파일을 삭제할 수 있습니다.
mikoop

307

먼저, 이전에 가져온 HEAD해당 업스트림 브랜치로 재설정하십시오 .

git reset --hard @{u}

명시 적 @{u}또는 자세한 형태 의 장점@{upstream} 원격 저장소 및 지점의 이름을 명시 적으로 지정할 필요가 없다는 것입니다.

다음으로 필요에 따라 추적되지 않은 파일을 제거하십시오 (선택 사항 -x:

git clean -df

마지막으로 필요에 따라 최신 변경 사항을 가져 오십시오.

git pull

54
이것은 항상 정적 인 것이 아니라 현재의 업스트림 브랜치로 동적으로 재설정되기 때문에 허용 된 것보다 더 나은 대답처럼 보입니다.origin/master
Jon z

@Jonz 자리에, @{upstream}매우 편리하고 별칭에 사용할 수 있습니다 :alias resetthisbranch="git reset --hard @{upstream}"
Siddhartha

1
@GangadharJannu git reset --hard 는 커밋이 필요합니다. 그렇지 않으면 무엇을 재설정 해야할지 알 수 없습니다. @{u}는 마지막 커밋 시점부터 추적 된 지점의 헤드 인 특정 커밋을 가리 킵니다 git fetch.
Kristoffer Bakkejord

1
@KristofferBakkejord 설명해 주셔서 감사하지만 커밋 해시가 없어도 할 수 있습니다. git reset --hard 는 원격 지점으로 재설정하지 않지만
강가 다르 잔누

3
여기에서 거의 새로운 질문을 한 사람이라면 Powershell을 사용한다면 따옴표 ( git reset --hard "@{u}")를 사용하십시오. 알아내는 데 시간이 걸렸습니다.
MPStoering

112

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

커밋이 여러 개인 경우 작동하지 않습니다.

아마도 원한다면 헤드 오브 원산지 또는 원격 저장소가 무엇이든 재설정됩니다. 아마 그냥 뭔가를 할 것입니다

git reset --hard origin/HEAD

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


2
Dan이 일찍 붙 잡았다는 잘못된 제안이있었습니다. 다른 사람을 길로 이끌고 싶지 않기 때문에 편집했습니다. 원산지 / 마스터 또는 원산지 / 헤드 물건에 관해서는 실제로 가져 오기를 먼저 수행하는지 여부에 따라 다릅니다. 원점을 방금 복제했는데 다른 가지가 없었으므로 꽤 일반적으로 발견되면 재설정해야합니다. 그러나 물론 Dan은 옳습니다.
Mikael Ohlson

73

위의 모든 제안이 옳지 만 종종 프로젝트 를 실제로 재설정하려면에있는 파일도 제거해야합니다 .gitignore.

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

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

경고 : git clean -x -d -f이다 돌이킬 수없는 당신은 파일과 데이터 (사용 무시했다 예를 들어 물건을 잃을 수 있습니다 .gitignore).


12
경고 : "git clean -x -d -f"는 되돌릴 수 없으며 .gitignore
Akarsh Satija의

조금 더 짧 git clean -xdf습니다 git clean -x -d -f.
Kiryl

git clean -ffxd는 repo에없는 모든 것을 제거합니다
Trismegistos

44

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

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

6
이것이 없으면 git clean -d -f로컬 디렉토리에 이전 브랜치의 일부가 여전히 있기 때문에 더 완전한 응답 입니다. 고마워요
Flavio

3
이것이 실제로 리모콘과 동일하게 만드는 것입니다. 청소가 중요합니다.
David S.

1
git clean -ffxd로 모든 것을 진정으로 제거
Trismegistos

1
이것이 바로 내가 필요한 것입니다. 감사합니다
AllJs

38

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

  1. 원격 지점이있는 지점으로 로컬 지점을 재설정하는 방법
  2. 즉 있도록하는 방법, (그리고 아마도 작업 디렉토리) 스테이징 영역을 지우려면 git status말한다nothing to commit, working directory clean.

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

  1. git fetch --prune (선택 사항) 원격 저장소의 로컬 스냅 샷을 업데이트합니다. 추가 명령은 로컬 전용입니다.
    git reset --hard @{upstream}로컬 브랜치 포인터를 리모트의 스냅 샷이있는 위치에두고 인덱스 및 작업 디렉토리를 해당 커밋의 파일로 설정하십시오.
  2. git clean -d --force 추적 할 수없는 파일과 디렉토리를 제거하여 git이“working directory clean”이라고 말하지 못하게합니다.

1
@{upstream}구문을 사용하면 기본적으로 어떻게 설정 될 상류가 필요합니다 git checkout <branchname>. – 그렇지 않으면로 교체하십시오 origin/<branchname>.
Robert Siemer

커밋에없는 모든 것을 제거 -x하려면 추가하십시오 git clean(예 : .gitignore 메커니즘으로 무시 된 파일조차도).
Robert Siemer

22

이것은 내가 정기적으로 직면하는 것입니다. 그리고 모든 지점에서 작동하도록 위에 제공된 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

3
"git remote"를 사용하여 원격의 이름을 얻을 수 있습니다. 어떤 경우에는 "원산지"가되지 않습니다
Yurik

17

원격 저장소가 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.


14

나는했다 :

git branch -D master
git checkout master

지점을 완전히 재설정


필요한 지점을 삭제할 수 있으려면 다른 지점으로 체크 아웃해야합니다.


5
다시 한 번 질문을 읽으십시오. 원격에는 영향을 미치지 않지만 리모컨과 동일하게 설정하면 리모컨으로 아무것도하지 않아야하며, 이것은 내 경우에 도움이됩니다.
user2846569

원격과 동일하게 설정하려면 적어도 어느 시점에서 가져 오기를 수행해야합니까?
Tim

2
적어도이 시도하거나 문서를 읽어야 kernel.org/pub/software/scm/git/docs/git-checkout.html
user2846569

갈 길, 지점에 손상된 .pck 파일이 있었고 나머지 옵션이 작동하지 않았습니다.
LuckyBrain

14

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

#!/bin/bash
# reset the current repository
# WF 2012-10-15
# see /programming/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

10

나와 같은 문제가 있었지만 이미 일부 변경 사항을 커밋했지만 지금은 어떤 이유로 든 제거하려는 경우 가장 빠른 방법은 git reset다음과 같습니다.

git reset --hard HEAD~2

나는 커밋이 필요하지 않았으므로 숫자 2를 설정했습니다. 재설정하기 위해 커밋을 원하는 수로 변경할 수 있습니다.

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

git reset --hard HEAD~5

변경 한 내용이 손실되므로주의하십시오!


7

이전 답변에서는 재설정 할 분기가 현재 분기 (체크 아웃 됨)라고 가정합니다. 의견에서 OP hap497 은 브랜치가 실제로 체크 아웃되어 있지만 명확하게 요구하지는 않습니다. 하나 이상의 "중복"질문이 있으므로 분기를 저장소 상태로 완전히 재설정 합니다. 분기는 체크 아웃되었다고 가정하지 않습니다. 다음은 대안입니다.

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

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

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

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


7

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

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

이 변화의 또 다른 지점에 대신 체크 아웃 / 지역 마스터를 변경 지점을 개발,하지만하지 않는 좋은 방법은 예를 들어, 변경 유형, 앞에 붙은 지점 이름이라고 주 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에서 작업을 저장하기 위해 로컬 이름과 동일한 이름으로 지점을 체크 아웃 할 수도 있습니다.하지만 원산지 개발이 로컬 저장된 작업 브랜치와 동일한 변경 사항이있는 경우 필요하지 않지만. 개발 브랜치를 예로 사용하고 있지만 기존 브랜치 이름이 될 수 있습니다.

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 .

모든 변경 사항이 함께 :

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있습니다.


6

대답

git clean -d -f

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


추가 파일이없는 100 % 깨끗한 전체 repo 폴더에 대해을 실행하십시오 git clean -xdf. 이것은 git이 알지 못하는 모든 파일을 삭제하고 폴더가 git의 객체 목록에있는 것과 정확하게 일치하게합니다. "가정 (what-if)"을 수행하기 위해 -n(예 :) 를 추가 할 수 있으며 git clean -nxdf실제로 아무 것도 수행하지 않고 삭제할 내용을 알려줍니다. ( git clean )
qJake

5

HEAD작업 디렉토리와 색인 둘 다 의 상태 로 돌아가려면을 수행 해야 git reset --hard HEAD합니다 HEAD^. (이것은 단일 대 이중 대시와 마찬가지로 오타 일 수 있습니다.--hard .)

해당 파일이 수정 된 상태로 나타나는 이유에 대한 특정 질문에 대해서는 하드 재설정 대신 소프트 재설정을 수행 한 것으로 보입니다. 이로 인해 변경된 파일이HEAD커밋 마치 마치 마치 마치 마치 마치 보이는 것처럼 보일 것입니다.


4

로컬 git repo의 추적되지 않은 파일과 수정 된 파일에는 많은 양의 재설정 및 정리가 영향을 미치지 않는 것 같습니다 (위의 모든 옵션을 시도했습니다). 이것에 대한 유일한 해결책은 로컬 저장소를 rm하고 원격에서 복제하는 것입니다.

다행스럽게도 제가 관심을 갖고있는 다른 지점은 없었습니다.

xkcd : 힘내


1

내가 본 모든 경우에 작동하는 유일한 솔루션은 삭제하고 복제하는 것입니다. 어쩌면 다른 방법이있을 수도 있지만 분명히이 방법은 오래된 상태가 남아있을 가능성을 남기지 않으므로 선호합니다. git에서 일을 망치면 매크로로 설정할 수 있습니다.

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 파일이 손상되지 않은 것으로 가정


4
확실하게 운영 체제를 다시 설치할 수도 있습니다!
Sebastian Scholle

1

기능 분기를 작성하지 않고 실수로 마스터에 직접 커미트 한 적이 있습니까?

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

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

1

3 개의 명령 만 작동합니다

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

-3

로컬 변경 사항을 저장하지 않아도 원본 / HEAD와 일치하도록 리포지토리를 업데이트하려면 로컬 변경 사항을 숨기고 다음을 수행하면됩니다.

git stash
git pull
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.