2015-01-05 11 views
0

git remote repo로 여러 개의 커밋을 푸시하고 싶습니다.git : 단일 커밋하기, 리베이스를 사용하여 재정렬하기, 커밋 커밋하기

How can I pushing specific commit to a remote, and not the previous commits?

을 내가 밀어 원하는 커밋 머리에 있지, 그래서 내가 먼저 리베이스를 사용하여 커밋 순서를하고 난 그렇게하려면 다음 지침을 사용 : 나는 제프의 대답은 그렇게 여기에서 찾을 다음 :

http://gitready.com/advanced/2009/03/20/reorder-commits-with-rebase.html

는 기본적으로 나는 짓을했는지 :

git clone 
git commit 
git commit 
... 
git pull 
git rebase -i HEAD~3 
git push origin <SHA>:master 

나는 오류가이 일을 얻었다. 그래서 나는 그 문제를 더 깊이 들여다보기 시작했다.

git: Duplicate Commits After Local Rebase Followed by Pull

로저의 응답이 나를 인도 :

git clone 
git commit 
git commit 
... 
git pull 
git log --pretty=format:"%h - %an : %s" // log before rebasing 
git rebase -i HEAD~3 
git pull 
git log --pretty=format:"%h - %an : %s" // log after rebasing 
git pull 
git log --pretty=format:"%h - %an : %s" // log after rebasing after pulling 

그래서 나는이 질문을 게시 : 내가 예를 들어, 리베이스 한 후 두 번째 자식 풀을 할 경우 내 로그에 중복 커밋이 있다는 것을 발견 이 질문에 : rebasing과 pulling 후에 중복 된 커밋을 보는 이유는 무엇입니까?

위에서, 리베이스 전에 로그 보이는 같은 :

84e4015 - Me : Local Commit 3 
0dbe86a - Me : Local Commit 2 
d57ba2a - Me : Merge branch 'master' of remote repository 
a86ea35 - Me : Local Commit 1 before reordering 
2fc4fe7 - Remote User 2 : Remote Commit 2 
b7a8656 - Remote User 1 : Remote Commit 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

그리고 리베이스 후 로그는 다음과 같습니다

cf1ff7b - Me : Local Commit 3 
cd14463 - Me : Local Commit 2 
b9d44fb - Me : Local Commit 1 after reordering 
9777c56 - Remote User 2 : Remote Commit 2 
a2d7d8b - Remote User 1 : Remote Commit 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

공지 사항 원래 2 2fc4fe7 커밋 b7a8656이 새의 SHA을 가지고; 9777c56 및 a2d7d8b. 나는 이것이 이것이 문제의 시작이라고 믿는다. 나는 또 다른 자식이 로그는 다음과 같습니다 당겨 할 후

은 이제 : 원격 커밋 지금 중복되는

e8e1a85 - Me : Merge branch 'master' of remote repository 
cf1ff7b - Me : Local Commit 3 
cd14463 - Me : Local Commit 2 
b9d44fb - Me : Local Commit 1 after reordering 
9777c56 - Remote User 2 : Remote Commit 2 
a2d7d8b - Remote User 1 : Remote Commit 1 
2fc4fe7 - Remote User 2 : Remote Commit 2 // duplicate 2 
b7a8656 - Remote User 1 : Remote Commit 1 // duplicate 1 
8ce80fc - Me : Merge branch 'master' of remote repository 

공지 사항, 원격의 원래의 SHA는 2fc4fe7 및 b7a8656 커밋 돌아왔다.

로저의 반응에 따르면 그는 다른 사람들이 git을 밀고 잘못을 저지른 것처럼 보이고 이미 밀린 커밋을 리베이스하고 있다고 말했다. 하지만 로컬로 푸시 커밋 rebase 내 잘못이라고 생각합니다.

이미 리모컨에 푸시 된 커밋을 리베이스했기 때문에 이렇게 할 수 있습니까? 그렇다면 이것을 피하기 위해 무엇을해야합니까? 나는 하나의 커밋을 푸시 할 수 있도록 커밋을 리베이스해야한다. 이 작업을 위해 분기 시스템을 사용해야합니까? 그렇다면이 문제를 해결하기 위해 지점을 어떻게 사용합니까?

+0

가능한 [Git 커밋은 중복 된 후에 같은 분기에서 리베이스를 반복합니다] (http://stackoverflow.com/questions/9264314/git-commits-are-duplicated-in-the-same-branch-after -doing-a-rebase) – Whymarrh

답변

1

짧은 대답은 변경은 으로 커밋하지 않고 복사한다는 것입니다. Git은 일반적으로 원본을 숨기지 만, 원본에 다른 사용자가 공유 한 것을 포함하면 (물론) 원본을 볼 수 있습니다.

일반적으로 비공개 미발표 커밋 만 리베이스해야합니다.어느 누구도 그 외의 경우에 정의 된 사본이 없으므로 자신의 사본을 만든 다음 (rebase를 통해) 원본을 숨기는 사실은 문제가되지 않습니다. 원본 대신 사본을 볼 수 있습니다. 그렇지 않으면 둘 중 하나가 표시되며 필요할 경우 rebase를 계속할 수 있습니다. 하지만 (push 또는 유사한 방법을 통해) 커밋을 게시하자마자 다른 사용자가 이제 SHA-1 ID를 포함하여 원본 사본을 가지고 있기 때문에 더 이상 변경할 수 없으며 나중에도 그대로 유지됩니다.

이 경우 수행 한 작업은 자신의 커밋과 마찬가지로 커밋을 리베이스 (즉, 복사)하는 것입니다. 문제의 일부는 "fetch then merge"를 의미하는 git pull을 사용하는 데서 비롯됩니다. 원하는 것은 "rebase"를 가져 왔을 때입니다. 당신은 별도로 단계를 수행 할 수 있습니다 :

git fetch 
git rebase 

또는 git pull --rebase를 사용하십시오 인출하기 후에, 그것은 병합 대신 REBASE을해야한다는 pull 스크립트를 알려줍니다

git pull --rebase 

합니다. --rebase 인수없이 git이 자동으로이 작업을 수행하도록 설정할 수도 있습니다.

현재 주된 문제는 아마도 원하지 않는 병합이 있다는 것입니다. 그렇다면 병합을 "실행 취소"해야합니다 (git reset; 다른 stackoverflow 게시 참조). 그렇지 않을 수


1 : 자식 객체 커밋 포함은 그 내용의 crypographic 체크섬의 오브젝트 ID에 의해 지명된다. 커밋은 부모 ID, 트리의 ID, 커밋의 작성자와 커미터 (이름, 전자 메일 및 타임 스탬프) 및 커밋 메시지로 구성됩니다. 이 중 하나를 변경하면 다른 ID로 새로운 커밋을 얻게됩니다.

git pull --rebase=preserve을 사용하도록 구성 할 수도 있습니다. 그러나 rebase 작업 전체에서 병합을 유지하는 것은 별도의 주제입니다 (이전에 stackoverflow 게시에서 다루었습니다).

+0

당신의 대답을 읽은 후에 나는이 게시물을 발견했다 : [언제 git pull --rebase를 사용해야합니까?] (http://stackoverflow.com/questions/2472254/when-should- i-use-git-pull-rebase). 이 답변을 보완하고 git pull --rebase가 실제로하는 일을 설명하는 몇 가지 대답이 있습니다. git pull --rebase를 사용하여 시도해보고 응답이 작동하는 경우 응답으로 표시합니다. 감사! – Samuel

+0

이것은 그것을 얻었다. 'git pull --rebase' 명령은 원격 repo의 커밋보다 상위, 즉 가장 최근의 커밋이되도록 로컬 커밋을 리베이스합니다. 그래서 커밋을 재배치하여 재정렬 할 때 원격 리포에 푸시 된 커밋을 리베이스하지 않습니다. 감사! – Samuel