Git/Repo 장면 기술 적용

6471 단어 repogit

1. 코드를 특정 시점으로 되돌리기


배경: 프로젝트 코드가 개발 과정에서 문제가 생겼을 때 어느 시간의 코드에 문제가 발생하지 않았음을 똑똑히 기억한다.그래서 코드를 이 시간 노드 앞으로 되돌려 놓으려고 합니다.
다음 명령을 사용할 수 있습니다.
repo forall -c 'commitID=`git log --before "yyyy-mm-dd hh:mm" -1 --pretty=format:"%H"`; git reset --hard $commitID'

2. 패치 시 충돌 해결


배경: 패치 과정에서 충돌이 발생하면 다음과 같은 방법으로 충돌을 해결할 수 있습니다.
git am xxxxx.patch //Error because of conflict
git apply --reject xxxxx.patch //then files not conflict in this commit will merge into local
git status//find which files is modified
//fix the conflicts
git add -u
git am --resolved xxxx.patch

3. 에이전트를 이용하여git창고 다운로드


배경: 외국 코드를 다운로드할 때 다운로드가 움직이지 않을 때, 예를 들어 안드로이드 시스템 원본은 프록시를 통해 다운로드할 수 있다.
git config --global http.proxy 'socks5://127.0.0.1:1080'

4.git 색상 설정


배경:git diff를 사용할 때 코드의 모양이 같아서 구분하기 어려울 때:
git config --global color.ui auto

5.gerrit 코드를 업로드하기


배경: 오래된 서버의 코드를gerrit 서버의 코드에 제출하고 새 지점만 만들어서 오래된 서버의 지점과 일치합니다
  • 수정.repo/repo/subcmds/forall.py 파일, 변수REPO_PROJECT에 대응하는 창고 이름이 있습니다. 접두사만 수정하면 됩니다. 여기에 새로운 변수REPO_TEST를 만듭니다. ssh를 사용해야 합니다. 그렇지 않으면 창고마다 비밀번호가 필요합니다
  • .
  • 명령을 사용하여 새로운remote 주소를 만듭니다repo forall -c 'git remote add [ ] $REPO_TEST'
  • 3. repo forall -c 'git push [ ] [ ]:[ ]'

    6. 지정된 commit의 내용 수정

    #!/bin/bash
    
    change-commit-msg(){
    
      commit="$1"
      newmsg="$2"
      branch="master"
    
      git checkout $commit
      git commit --amend -m "$newmsg"
      git cherry-pick $commit..$branch
      git branch -f $branch
      git checkout $branch
    }

    7. Git 여러 제출 병합

    git rebase -i HEAD~2

    프롬프트는 다음과 같습니다.
    pick c6e4557 create second.txt
    pick e1a7dfa add text in second.txt
    
    # Rebase a71eba2..e1a7dfa onto a71eba2
    #
    # Commands:
    #  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
    #
    # These lines can be re-ordered; they are executed from top to bottom.
    #
    # If you remove a line here THAT COMMIT WILL BE LOST.
    #
    # However, if you remove everything, the rebase will be aborted.
    #
    # Note that empty commits are commented out

    첫 번째 열은 rebase에서 수행되는 작업입니다. 여기서 작업을 선택할 수 있습니다. 여기서 의미는 다음과 같습니다.
  • pick작업을 선택하면git는 이 패치를 적용하여 같은 제출 정보(commit 메시지)로 제출을 저장합니다
  • reword 조작을 선택하면git는 이 패치를 적용하지만 제출 정보를 다시 편집해야 합니다
  • edit작업을 선택하면git는 이 패치를 적용하지만amending으로 종료
  • squash작업을 선택하면git는 이 패치를 적용하지만 이전 제출과 통합
  • fixup 동작을 선택하면git는 이 패치를 적용하지만 제출 로그를 잃어버립니다
  • exec작업을 선택하면git는 셸에서 이 명령을 실행합니다
  • 이전의 두 개의 제출 제출과 비교하면 첫 번째 제출은 보류할 수 있고 두 번째 제출은 첫 번째 제출로 합치면 된다고 생각합니다.
    두 번째 pick을 squash 또는 s로 바꾸고 종료를 저장합니다.다음과 같습니다.
    pick c6e4557 create second.txt
    s e1a7dfa add text in second.txt

    이때git는 자동으로 두 번째 제출을 첫 번째 제출에 통합하고 다음과 같은 통합 알림 정보를 팝업합니다.
    # This is a combination of 2 commits.
    # The first commit's message is:
    
    create second.txt
    
    # This is the 2nd commit message:
    
    add text in second.txt
    
    #             。  '#'         ,       
    #         。
    #
    #   :  Mon Nov 28 13:59:43 2016 +0800
    #
    #          ;  a71eba2
    #         'master'     'a71eba2'         。
    #
    #       :
    #      :   second.txt
    #

    정보를 수정하여 제출해야 할 경우 종료를 직접 저장하지 않아도 됩니다.
    제출 순서를 바꿔야 할 때도 상기 방법을 통해 실현할 수 있다.

    8. ssh 원격 주소 스크립트 추가

    str=`git remote -v | head -n 1 | awk -F ' ' '{print $2}'`
    prefix="http://gerrit.xxxxxxx.com:[  ]/" #         
    suffix=${str#$prefix} #      
    gerritprefix="ssh://[email protected]:[  ]/" #     ssh  
    git remote add gerrit $gerritprefix$suffix
    echo "add remote address succeed"
    

    9. 원격 tag 및 분기 만들기

  • step1: 각 창고에 ssh 원격 주소 만들기
  • $ repo forall -c 'git remote add [remote address name] ssh://[username]@xxxx/$REPO_PROJECT' --no-verify
  • step 2: 로컬 Tag 생성
  • $ repo forall -c 'git tag -a "[tag name]" -m "[comment]"'
  • step 3: 원격으로 tag 처리
  • $ repo forall -c 'git push [remote address name] [tag name]'
  • step4: tag명에 따라 로컬 지점 만들기
  • $ repo forall -c 'git branch [new branch name] [tag name]'
    $ repo forall -c git checkout [tag name]

    또는
    $ repo forall -c 'git checkout -b [new branch name] [tag name]'
  • step 5: 원격으로 로컬 브랜치
  • $ repo forall -c 'git push [remote address name] [new branch name]'

    10 코드 업로드 시 "expected old/new/ref" 프롬프트


    배경: 서버에 코드를 업로드할 때 다음과 같은 프롬프트가 표시됩니다.
     protocol error: expected old/new/ref

    다음 명령을 사용하여 해결할 수 있습니다.
    $ git fetch [remote address] --unshallow

    11. 창고 지점 이름 수정


    11.1 비현재 브랜치 이름 수정

    git branch -m [old name] [new name]

    11.2 현재 분기 이름 수정

    git branch -m [new name]

    12. 원격 서버를 강력하게 확장


    때때로 서버에 코드를 밀어붙일 때fast-forward에 대한 질문을 할 수 있으며 서버 코드를 수정하여 강제로 밀어붙일 수 있습니다.창고 수정 xx.git/config 파일, 다음 필드를false로 수정
    [receive]
        denyNonFastforwards = false

    이때git push-f를 통해 코드를 강제로 전송할 수 있습니다.로컬 분기를 원격 서버의 분기로 강제로 밀어야 하는 경우 다음 명령을 사용할 수 있습니다.
    $ git push -f [remote] [      ]:[    ]

    13. dst refspec matches more than one


    원격 서버 spoke를 수정해야 할 때 다음과 같은 프롬프트가 표시되는 경우가 있습니다.
    dst refspec matches more than one

    이러한 힌트는 태그 이름과 브랜치 이름이 같아 목적 주소가 모호해질 가능성이 높다.
    이때 원격 지점을 먼저 삭제한 다음에 로컬 지점을 다시 끌어올릴 수 있다.다음과 같이 원격 분기를 삭제합니다.
    $ git push [remote] :refs/heads/[remote branch]

    'refs/heads'를 추가하지 않으면 matches more than one의 프롬프트가 나타납니다.
    $ git push [remote] :[remote branch]

    나중에 지점을 원격 지점에 업로드할 때도 다음과 같은 방법이 필요합니다.
    $ git push -f origin [remote]:refs/heads/[remote branch]

    좋은 웹페이지 즐겨찾기