programing

Git은 왜 제 마스터 지점이 "이미 최신"이 아니라고 합니까?

sourcejob 2023. 10. 1. 19:25
반응형

Git은 왜 제 마스터 지점이 "이미 최신"이 아니라고 합니까?

기본문제

저는 방금 프로젝트의 파일에서 모든 코드를 삭제하고 로컬 깃에 (일부러) 변경을 커밋했습니다.했다

git pull upstream master

업스트림에서 가져오기 및 병합합니다(따라서 이론적으로 삭제된 코드는 반환되어야 함).

깃은 모든 것이 최신 상태라고 말합니다.

모든 것이 확실히 최신이 아닙니다. 삭제된 코드는 모두 여전히 삭제됩니다.

기타 관련 정보

저는 "마스터"라는 지점이 하나밖에 없습니다.

최근에 업스트림을 추적하도록 "마스터"를 설정했습니다.

원격 분기 마스터를 업스트림에서 추적하도록 설정된 분기 마스터입니다.

git branch -vv산출량:

* master 7cfcb29 [upstream/master: ahead 9] deletion test

왜 이런 일이 일어날까요?프로젝트 매니저에게 저희 코드를 변경할 경우 이메일을 보내야 할 상황입니다.

갱신하다

당연하다고 생각했지만 어쨌든 이게 제 목표입니다.

내 시스템의 최신 코드를 가져옵니다.

화가 나는 것은 미안하지만, 그런 간단한 일이 왜 이렇게 힘들어야 합니까?

여기서 당신의 기본적인 문제는 당신이 git이 무엇을 하는지 그리고 왜 하는지에 대해 잘못 해석하거나 오해하고 있다는 것이라고 생각합니다.

다른 저장소를 복제하면 git은 "저쪽"에 있는 것의 복사본을 만듭니다.은 의"합니다와 합니다.master, 트리에 있는 "전체 이름"이 (normally)인 레이블의 복사본을 만듭니다.remotes/origin/master(그러나 당신의 경우에는,remotes/upstream/master입니다. 대부분의 경우 생략합니다.remotes/그으로도,다라고 할 수 .upstream/master.

일부 파일을 변경하고 커밋하는 경우 변경된 파일은 사용자뿐입니다.한편 다른 사용자는 다른 클론을 만들고 이러한 클론을 변경하기 위해 사용자가 클론을 만든 원본 저장소를 사용할 수도 있습니다.물론, 그들만이 그들의 변화를 가지고 있습니다.그러나 결국 누군가는 원래 소유자에게 ("푸시"나 패치 등을 통해) 다시 전송하는 변경 사항이 있을 수도 있습니다.

git pull 명령어입니다의 .git fetch를 이어dgit merge두 것을 이는 두 작업이 실제로 무엇을 하는지 이해해야 한다는 것을 의미하기 때문에 중요합니다.

git fetch명령어는 복제한 곳(또는 가져올 곳으로 설정한 곳)으로 돌아가서 "다른 사람이 추가, 변경, 제거한 새로운 것"을 찾으라고 말합니다.변경 사항은 이전에 받은 내용을 복사한 후 복사한 내용에 적용됩니다.그것들은 당신 자신의 일에는 적용되지 않고, 오직 그들의 일에만 적용됩니다.

git merge명령은 더 복잡하고 당신이 잘못하고 있는 곳입니다.이것이 하는 일은, 좀 지나치게 단순화된 것은, "당신이 당신의 사본에서 무엇을 바꿨는지"를 "다른 사람으로부터 가져온 것이고, 그래서 당신의 사본을 다른 사람의 작품에 추가한 것"과 비교하는 것입니다.와 그 같지 면,merge운영은 이들을 하나로 묶고 개발과 개발을 하나로 묶는 "merge 약속"을 제공합니다(비록 변화가 없고 "빠른 속도"를 얻는 매우 일반적인 "쉬운" 경우가 있습니다).

지금 여러분이 마주하고 있는 상황은 여러분이 변화를 만들고 그것을 실행한 것입니다. 사실상 9번, 즉 "앞으로 9번". 그리고 그들은 변화가 없었습니다.fetch고,서를 .merge 부족을 겁니다

당신이 원하는 것은 코드의 "그들의" 버전을 보거나 심지어 "재설정"하는 것입니다.

만약 당신이 그것을 보기를 원한다면, 당신은 그 버전을 간단히 확인할 수 있습니다.

git checkout upstream/master

인 로 현재 할 수 .remotes/upstream/master. 당신이 마지막으로 실행한 시점을 기준으로 그들의 코드가 보일 겁니다.git fetch그리고 그들의 최신 코드를 받았습니다.

모든 변화를 포기하고 싶다면, 당신이 해야 할 일은 당신의 라벨을 수정하는 것에 대한 git의 생각을 바꾸는 것입니다.master, 이름을 대야 합니다.현재 가장 최근 커밋의 이름을 지정합니다.과입니다.

git checkout master

다음에 git reset명령을 사용하면 라벨을 원래대로 "이동"할 수 있습니다.유일하게 남은 문제는 (당신이 정말로 당신이 했던 모든 것을 버릴 준비가 되었다고 가정하는 것) 라벨이 가리키는 위치를 찾는 것입니다.

git log는 숫자 :다)을 찾을 수 있습니다.7cfcb29되지 않는)을 지정할 수 있는 이 은 () 입니다.upstream/master.

레이블을 이동하려면 자신의 변경 사항을 삭제해야 합니다.(사용자가 약속한 내용은 실제로 상당 기간 복구할 수 있지만 이후에는 훨씬 더 어려워지므로 주의하십시오.)

git reset --hard upstream/master

--hard사용자가 수행 중인 작업을 삭제하고 현재 분기 레이블을 이동한 다음 지정된 커밋을 확인하라고 git에 말합니다.

정말로 원하는 것은 그리 흔한 일이 아닙니다.git reset --hard많은 일들을 쓸어내리죠 한 방법은 기존 일부가 있다고 할 경우 을 훨씬 할 수 ).보다 안전한 방법은 기존 지점의 이름을 변경하는 것입니다(결국 일부 작업이 가치가 있다고 판단할 경우 해당 작업을 훨씬 쉽게 복구할 수 있습니다).

git branch -m master bunchofhacks

그리고 겁니다master스럽게 하는 것이 :그 "tracks" 이 git이다 :-) origin 림)터 ::

git branch -t master upstream/master

그 다음에 할 수 있는 것은 다음과 같습니다.

git checkout master

마지막 세 개의 명령어(단 두 개의 명령어로 만드는 바로 가기가 있음)는 기존 레이블에 붙여넣은 이름을 변경한 다음 새 레이블을 만든 다음 해당 레이블로 전환하는 것입니다.

어떤 일을 하기 전에:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "master"

git branch -m:

C0 -    "remotes/upstream/master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

git branch -t master upstream/master:

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 --- C8 --- C9    "bunchofhacks"

여기서C0는밋리)다를 할 때 입니다.git clone C1부터 C9까지는 당신의 커밋입니다.

, 하세요.git checkout bunchofhacks그리고 나서.git reset --hard HEAD^^이:,.

C0 -    "remotes/upstream/master", "master"
    \
     \- C1 --- C2 --- C3 --- C4 --- C5 --- C6 --- C7 -    "bunchofhacks"
                                                      \
                                                       \- C8 --- C9

는.HEAD^^로 지정합니다다다)).bunchofhacks및 ).reset --hard그런 다음 레이블을 이동합니다. 및 않습니다및밋 C8및 C9다다)와 할 수 ).git fsck그들을 찾기 위해 하지만 그것은 더 이상 사소한 것이 아닙니다.당신이 원하는 대로 당신의 라벨은 당신의 것입니다.fetch다로 을 처리합니다.remotes/를 ( "" "" 입니다가 경우)remotes/origin/mauve라의 짓습니다.mauve(또한), 하지만 "그들로부터" 받은 커밋의 이름을 짓고 싶을 때마다 "그들의"을 입력할 수 있습니다. ("one commit"은 전체 소스 트리임을 기억하십시오.다를 하여 하나의 할 수 .git show예를 들어, 원하는 경우와 원하는 경우).)

저도 당신과 같은 문제가 있었습니다.

는 했습니다.git status git fetch git pull 제 로컬에서는 파일이 폴더와 파일을 리모트로 푸시하고 웹에서 파일을 보았지만 로컬에서는 파일이 없었습니다.

마지막으로 이 명령어는 로컬의 모든 파일과 폴더를 업데이트했습니다.

git fetch --all
git reset --hard origin/master 

아니면 가지를 원한다면.

git checkout your_branch_name_here
git reset --hard origin/your_branch_name_here

이 중 어떤 답변도 제게 도움이 되지 않았지만, 다음 명령을 사용하여 문제를 해결할 수 있었습니다.

git fetch origin

이것은 저에게 효과가 있었습니다.

프로젝트 파일을 모두 삭제하는 것과 같이 커밋하는 모든 변경사항은 풀 후에도 그대로 유지됩니다.다른 곳에서 변경한 최신 내용을 자신의 분기에 병합하는 것이 전부이며, 분기에서 모든 내용을 삭제한 경우에는 기껏해야 업스트림 변경 내용이 삭제된 파일에 영향을 미칠 때 병합 충돌이 발생할 수 있습니다.그래서 간단히 말해서, 네, 모든 것이 최신입니다.

"모든 파일을 삭제"하는 대신 어떤 결과를 얻을 것인지 설명하는 경우, 적절한 작업 과정을 제안할 수 있습니다.

업데이트:

내 시스템에 대한 최신 코드 가져오기

당신이 이해하지 못하는 것은 당신이 이미 최신 코드를 가지고 있다는 것입니다. 그것은 당신의 것입니다.마스터 브랜치에 있는 다른 사용자의 최신 작업을 보고 싶다면 다음 작업을 수행하십시오.

git fetch upstream
git checkout upstream/master

이렇게 해서 바로 (재)업무를 시작할 수 있는 위치에 머무르지는 점에 유의하시기 바랍니다.수행한 작업을 취소하거나 다른 사용자가 변경한 내용을 되돌리는 방법을 알아야 하는 경우 세부 정보를 제공하십시오.또한 버전 제어의 기본적인 목적을 잘못 알고 있는 것 같으니 버전 제어가 무엇을 위한 것인지 읽어보는 것도 고려해보세요.

다른 포스터에 나와 있듯이 pull은 업스트림에서 저장소로 변경 내용을 병합합니다.저장소에 있는 것을 업스트림에 있는 것으로 바꾸려면 몇 가지 옵션이 있습니다.저라면 지금 당장은

git checkout HEAD^1  # Get off your repo's master.. doesn't matter where you go, so just go back one commit
git branch -d master  # Delete your repo's master branch
git checkout -t upstream/master  # Check out upstream's master into a local tracking branch of the same name

가장 중요한 답은 정보의 폭과 깊이 면에서 훨씬 낫지만, 문제를 거의 즉시 해결하고 버전 제어의 기본 원칙 몇 가지를 언급하는 것에 개의치 않는다면...

  1. 마스터로 전환

    $ git checkout upstream master
    
  2. 원하지 않는 분기를 삭제합니다. (참고: 분기가 마스터보다 많은 커밋을 수행하므로 일반 -d 플래그 대신 -D 플래그가 있어야 합니다.

    $ git branch -d <branch_name>
    
  3. 새 분기 만들기

    $ git checkout -b <new_branch_name>
    

github 시켜 드립니다.git status말한다

지점이 'origin/master'로 최신 상태입니다.약속할 것이 없고, 트리를 깨끗하게 작동합니다.

파일이 저장되어 있는 경우에 발생할 수 있습니다..gitignore

달리기 해보기

cat .gitignore 

이 파일들이 저 위에 나타나는지 확인해 보는 겁니다.그게 왜 깃이 그들을 원격지로 옮기고 싶어하지 않는지 설명해 줄 겁니다.

저도 이런 문제가 있었습니다.깃 페치와 깃 풀은 둘 다 "이미 최신"이라고 말하지만 다른 컴퓨터와 웹 브라우저(비트버킷)에서도 내 코드에 없는 더 많은 푸시된 커밋을 볼 수 있었고 풀 수 없었습니다.

여기 쓰여 있는 것은 아무것도 저에게 통하지 않았습니다.

제가 해결할 수 있는 유일한 방법은 새 분기(웹 툴 또는 다른 머신에 있는)를 생성한 다음 해당 분기를 확인한 후 모든 것이 복원되는 것이었습니다.

언급URL : https://stackoverflow.com/questions/15376241/why-does-git-say-my-master-branch-is-already-up-to-date-even-though-it-is-not

반응형