2010-07-02 5 views
3

git checkout의 동작에 대해 혼동스러워합니다. documentation of git checkout는 말한다 :git checkout에 대한 혼란

--merge

것은, 가지를 전환 할 때 하나의 로컬 수정하거나 전환하는 에 현재의 지점과 지점 사이의 다른 이상의 파일이있는 경우 명령 은 컨텍스트에서 수정 사항을 보존하기 위해 에 분기를 전환하는 것을 거부합니다. 그러나이 옵션을 사용하면 브랜치, 작업 트리 내용, 사이의 3 방향 병합과 새 분기가 완료되고 이 새 분기에 있습니다.

그러나 나는 굵은 글씨로 설명한대로 동작하지 않는 작은 테스트를 수행했습니다. 즉 : 나는

  • 디렉토리와 일부 conent을 가진 파일을 생성하고 마스터 브랜치에 커밋 자식의 repo를 만들

    1. .
    2. "testbranch"다른 분기를 만듭니다.
    3. master의 파일 내용을 변경하십시오. 그러나 저 지르지 않았다.
    4. "testbranch"로 전환되었습니다.
    5. 이제 마스터 브랜치에서 변경된 커밋되지 않은 변경 사항이 testbranch!

    로컬 변경 사항이 있고 지점으로 전환하고 싶다면 실패하지 않았습니까?

    [email protected] e:/test/merge_test 
    $ git init 
    Initialized empty Git repository in E:/test/merge_test/.git/ 
    
    [email protected] e:/test/merge_test (master) 
    $ mkdir src 
    
    [email protected] e:/test/merge_test (master) 
    $ echo "Hello World" > src/a.txt 
    
    [email protected] e:/test/merge_test (master) 
    $ cat src/a.txt 
    Hello World 
    
    [email protected] e:/test/merge_test (master) 
    $ git add src 
    
    [email protected] e:/test/merge_test (master) 
    $ git commit -m "say hello" 
    [master (root-commit) 939f6e0] say hello 
    1 files changed, 1 insertions(+), 0 deletions(-) 
    create mode 100644 src/a.txt 
    
    [email protected] e:/test/merge_test (master) 
    $ git branch testbranch 
    
    [email protected] e:/test/merge_test (master) 
    $ echo "Changed content" > src/a.txt 
    
    [email protected] e:/test/merge_test (master) 
    $ git status 
    # On branch master 
    # Changed but not updated: 
    # (use "git add <file>..." to update what will be committed) 
    # (use "git checkout -- <file>..." to discard changes in working directory) 
    # 
    #  modified: src/a.txt 
    # 
    no changes added to commit (use "git add" and/or "git commit -a") 
    
    [email protected] e:/test/merge_test (master) 
    $ git checkout testbranch 
    M  src/a.txt 
    Switched to branch 'testbranch' 
    
    [email protected] e:/test/merge_test (testbranch) 
    $ cat src/a.txt 
    Changed content 
    

    사람이 설명 할 수 : 아래

    는 명령 목록이이 문제를 재현하는 것입니다? 새 분기를 체크 아웃 할 때 그래서의 새로운 지점에 따라 그것으로 이동 얻을

    [email protected]YA-PC e:/test/merge_test (testbranch) 
    $ git --version 
    git version 1.7.0.2.msysgit.0 
    
  • 답변

    5

    키는 상기 지점에서 파일 변경을 커미트 다른 브랜치를 체크 아웃, 동일한 파일을 수정하기 시작하면

    "현재 지점과 지점 사이 차이는 전환되어있는"인 거기서, checkout 첫 번째 브랜치를 다시 실행하면 파일을 커밋하지 않고 체크 아웃이 실패합니다.

    git init 
    vim file 
    # hack hack hack 
    git add . 
    git commit -m "1" 
    git checkout -b branch 
    vim file 
    # hack hack hack 
    git commit -a -m "2" 
    git checkout master 
    vim file 
    # hack hack hack 
    git checkout branch 
    

    여기에 오류가 있어야합니다.

    3

    당신은 주인에게 변경된 파일을 커밋하지 않은 :

    다음은 내 자식 버전 출력됩니다. 열쇠는이 줄에 있습니다

    [email protected] e:/test/merge_test (master) 
    $ git checkout testbranch 
    M  src/a.txt 
    Switched to branch 'testbranch' 
    

    이 말의 의미는 M src/a.txt입니다. M은 수정 된 파일의 약자입니다.

    다른 분기를 체크 아웃하기 전에 마스터에 변경 사항을 적용하십시오.

    +0

    정확하게'git checkout testbranch'가 다음과 비슷한 오류로 실패 할 것이라고 생각한 이유입니다. testbranch로 전환 할 수 없습니다. 덮어 쓸 로컬 변경 사항이 감지되었습니다. 설명서에서도 그렇습니다. – Sabya

    +2

    @Sabya : 현재 변경된 지점과 전환하려는 지점간에 다른 파일에서 로컬 변경 사항이 감지되는 경우에만 실패합니다. 귀하의 경우'src/a.txt'의 커밋 된 버전은'master' 브랜치와'testbranch' 브랜치에 텍스트 "Hello World"를 포함하고 있습니다. 그것은 동일한 내용이므로, git은 전환에 문제가 없습니다. –

    +0

    @Sabya : 변경 사항이 "준비"되었으므로 git add. 또는 비슷한 것을 의미하는 경우 분기 변경을 허용하지 않습니다. –