ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • git 사용하기(3)
    Practical_skills/git 2019. 7. 16. 11:06

    오늘은 이어서 commit --amend 명령의 사용과 하나의 remote repository를 공유하면서 여러개의 local repository에서 작업을 할 때 발생할 수 있는 문제에 대해서 다루어 보겠다.
    아래의 링크를 참고하면서 보자.

    우선 reset 과 revert의 명확한 차이를 짚고 넘어가자.
    짧게 말한다면 이전에 했던 rebase와 cherry-pick의 차이와 비슷하게
    이력을 남기고 돌아가느냐 지우고 돌아가느냐 이다.

    reset과 revert의 차이1
    reset과 revert의 차이2
    reset
    revert


    Problem 4. patch set (amend or paste change-id) my patchset and other patch set.by Daejin

    • switch back to master branch

    • made some changes and commit it.

    • Push it to the remote repository

      • Q1) If you want to modify your last commit which you just pushed and upload it as a patch set in remote repository, how to do that?
      • Q2) Suppose another user uploaded a commit in remote repository and you want to modify and upload it as patch set before merged. How to do that?
      • Q3) Suppose another user uploaded a commit in remote repository and you don’t like it at all. You don’t want to use any of that changes but want to upload a completely new patch set in that commit. How to do that?

    solution

    • Q1
      파일 수정을 한다.
      $ git add ${file name}
      $ git commit --amend
      $ git push origin +master

      ammend를 하면 커밋이력이 삭제되어서 remote 와 local repository간의 log 싱크가 맞지 않아서 push가 되지 않는다.
      +옵션을 주어 강제로 push 해주어야 한다.
      이것에 따라 발생할 수 있는 문제점은 ammend하기 이전의 log가 remote ropository에 없어지기 때문에 유의하자

      amend 이후 log

      push를 했을 때 오류

      강제 push후

    • Q2
      두가지 선택사항이 있다.
      이력을 남기느냐 강제로 바꾸느냐 강제로한다면 위에 처럼 +옵션을 주면 되지만
      후자의 문제점은 다른 모든 user들의 remote 이력과 싱크에 차이가 생겨 충돌을 야기시키게 된다.
      그래서 안전한 방법은 전자의 reset과 revert를 잘 사용하여 remote의 log이력과 충돌이 발생하지 않게
      another user upload하기 전의 이력으로 reset을 사용해 돌아가서 pull을 한다.
      파일을 수정한 뒤 commit하고 다시 remote repository에 push한다.

      $ git branch -b ${new_branch}
      $ git checkout master
      $ git reset --hard ${another user의 upload 이전 시점}
      $ git pull
      $ git checkout ${new_branch}
      $ git merge ${mater}
      충돌부분 수정
      $ git checkout master
      $ git merge ${new_branch}
      $ git push origin master

    • Q3
      이것도 마찬가지로 두가지 선택사항이 있다.
      강제로 하는 것은 Q2와 같고
      이력을 남기는 방법을 설명하겠다.

      $ git branch -b ${new_branch}
      $ git checkout master
      $ git reset --hard ${another user의 upload 이전 시점}
      $ git pull
      $ git reset --hard ${another user의 upload 이전 시점}
      $ git merge ${new_branch}
      $ git push origin master


    **Problem 5.** already merged commit in previous commit logby \[Daejin\](mailto:[daejin.hyeon@thordrive.ai](mailto:daejin.hyeon@thordrive.ai))
    • : Suppose you cherry-picked a commit ‘a’ from remote repository and create other commits ‘b’ and ‘c’ on top of it. If you try to push commits ‘b’ and ‘c’ to remote repository after commit ‘a’ is already merged, the following error might occur.

    • ! [remote rejected] HEAD -> refs/for/master (change ***closed)

      error: failed to push some refs to 'https://***@***

      Q1) What should have done to prevent such errors?

    • solution

      • Q1
        문제 4와 5의 차이는 another user가 remote repository commit 한 것을 아직 merge하지 않았는지 이미 되었는지 이다.
        이미 merge가 되었다면 merge를 취소 해주면 된다.
        git reset의 경우 --merge 옵션으로 merge를 취소할 수 있고,
        git revert의 경우는 --mainline 숫자 ${취소할 병합 commit ID}

    'Practical_skills > git' 카테고리의 다른 글

    git log visualizer  (0) 2019.07.13
    git 사용하기 (2)  (0) 2019.07.13
    git 사용하기 (1)  (0) 2019.07.13

    댓글

Designed by Tistory.