sourcecode

"git commit"과 "git push"의 차이점은 무엇입니까?

codebag 2023. 5. 18. 21:00
반응형

"git commit"과 "git push"의 차이점은 무엇입니까?

제가 수강하고 있는 Git 튜토리얼에서git commit변경 내용을 저장하는 데 사용됩니다.

란?git push그 때 사용되었습니까?

기적으로본,git commit"리포지토리에 대한 변경 사항 추가" 중git push"연결된 개체와 함께 원격 참조를 제공합니다."따라서 첫 번째는 로컬 리포지토리와 연결하여 사용되고, 후자는 원격 리포지토리와 상호 작용하는 데 사용됩니다.

여기 올리버 스틸의 멋진 사진이 있습니다. Git 모델과 명령어를 설명합니다.

Git data transport commands

에 대해 자세히 알아보기git push그리고.git pull밀고 당기기(내가 먼저 언급한 기사)에 대해.

커밋: 로컬 리포지토리에 변경 사항 추가

푸시: 원격 서버로 마지막 커밋 전송

기본적으로 Git commit은 변경사항을 로컬 저장소에 저장하고 Git push는 변경사항을 원격 위치로 보냅니다.

git push로컬 리포지토리에서 수행한 커밋을 원격 리포지토리에 추가하는 데 사용됩니다. git pull사람들이 협업할 수 있게 해줍니다.

커밋: 저장소의 스냅샷 | Changeset | 버전 | 기록 레코드 | '다른 이름으로 저장'.Git 저장소 = 일련의 커밋(트리).

로컬 리포지토리: 컴퓨터의 리포지토리입니다.

원격 리포지토리: 서버(GitHub)의 리포지토리입니다.

git commit 커밋(마지막 커밋 + 단계별 수정)을 로컬 리포지토리에 추가합니다. (커밋은 폴더에 저장됩니다.)/.git.)

git push,git pull로컬 리포지토리를 연결된 원격 리포지토리와 동기화합니다. push로컬에서 원격으로 변경 사항을 적용합니다.pull원격에서 로컬로 변경 사항을 적용합니다.

Git는 분산 버전 제어 시스템이기 때문에 커밋은 로컬 저장소에 변경 사항을 커밋하는 반면 푸시는 변경 사항을 원격 저장소에 푸시합니다.

git commit로컬 리포지토리에 변경 사항을 기록합니다.

git push 로컬 변경사항으로 원격 리포지토리를 업데이트합니다.

주의해야 할 세 가지 사항:

  1. 작업 디렉터리 - 코드 파일이 있는 폴더

  2. 로컬 리포지토리 - 시스템 내부에 있습니다.commit 명령을 처음 수행할 때 이 로컬 리포지토리작업 디렉토리가 있는 동일한 위치에 만들어집니다.(.git) 파일이 생성되었는지 확인합니다.그런 다음 커밋할 때마다 작업 디렉터리 파일에서 변경한 내용을 로컬 리포지토리(.git)에 저장합니다.

  3. 원격 저장소 - GitHub와 같이 세계 어디에나 있는 서버처럼 시스템 외부에 위치합니다.푸시 명령을 실행하면 로컬 리포지토리의 코드가 이 원격 리포지토리에 저장됩니다.

다음 사항을 추가하고 싶습니다.

우리가 사용하는 것처럼 커밋하기 전에는 푸시할 수 없습니다.git push로컬 분기에서 수행한 커밋을 원격 리포지토리로 푸시합니다.

git push명령에는 두 가지 인수가 사용됩니다.

예를 들어, 원격 이름은 다음과 같습니다.origin이름: " " "):master

예:

git push  <REMOTENAME> <BRANCHNAME> 
git push  origin       master

비유입니다. 가 우매조비유: 가비다면한교우리한잡면.git commit파일을 과 같이 .git push파일을 다른 위치에 복사하는 것일 수 있습니다.

이러한 맥락에서 유추하지 마십시오. 커밋하고 푸시하는 것은 편집된 파일을 저장하고 복사하는 것과 전혀 다릅니다.그렇긴 하지만, 그것은 비교를 위해 유지되어야 합니다.

Git 작동 방식에 대한 상식적 설명

나는 수년 동안 Git를 사용해 왔지만, 이상하게도 여기 또는 온라인의 그 누구도 Git의 방법을 간단한 용어로 설명할 수 없는 것 같습니다.push,pull,commit또는pull requests진짜 효과가 있습니다.그래서, 아래는 간단한 설명입니다.저는 그것이 상황을 더 명확하게 설명해 주길 바랍니다.도움이 됐어요!

GIT 작동 방식에 대한 간단한 요약

Git에서는 항상 로컬 컴퓨터에 코드를 먼저 만든 다음 컴퓨터의 Git "로컬 저장소"(리포)에 코드를 저장합니다.그런 다음 작업이 끝나면 변경사항을 Git의 공유 "원격 저장소"에 업로드하여 다른 사용자가 사용자의 코드 변경사항에 액세스할 수 있습니다.또한 "원격 리포지토리"에서 "로컬 리포지토리"로 변경사항을 다운로드하여 코드가 다른 개발자의 변경사항과 함께 최신 상태를 유지할 수 있습니다.그런 다음 프로세스를 처음부터 다시 시작합니다.

이러한 방식으로 Git을 사용하면 로컬 프로젝트 코드를 다른 사람과 원격으로 공유하는 동시에 무언가 잘못되어 잘못된 코드를 다시 실행해야 할 경우에 대비하여 코드 변경 버전을 저장할 수 있습니다.이것이 Git의 작동 방식과 사용 방법의 주기에 대한 간단한 설명입니다.

GIT 세부 정보 더 보기

첫 번째 단계는 항상 로컬 컴퓨터에 코드를 작성하는 것이며, 코드를 저장하거나 테스트하는 데 관여하지 않는 Git는 무시합니다.컴퓨터에 로컬 코드를 저장하면 기본적으로 Git에 저장되지 않습니다."commit"이라고 하는 두 번째 단계를 수행해야 합니다. (아직 커밋되지 않은 저장된 코드는 "staged" code, btw.)

A commit로컬 코드 변경 내용을 저장하는 것과 동일하지만 'Git world'있습니다.이것은 사람들을 혼란스럽게 합니다.하지만 "commit"이라는 단어를 보면 "Git Save"라고 생각합니다.코드 변경 사항을 이미 한 번 저장한 후 Git 시스템에 두 번째로 커밋으로 저장해야 하기 때문에 추가 단계입니다. 그렇지 않으면 로컬 Git 저장소 시스템의 일부가 되지 않습니다.저는 "공범"이 일부 사람들이 Git가 잘못 설계되었다고 생각하는 한 가지 이유라고 생각합니다.그것은 단지 직관적이지 않습니다.

A push모든 코드 저장을 완료하고 로컬로 Gitrepo에 코드를 커밋한 후에 수행됩니다.push 명령은 로컬 리포지토리 변경사항(커밋 전용)을 원격 리포지토리로 전송하여 로컬 리포지토리가 업데이트되도록 합니다. 이렇게 하면 변경 내용의 100%가 원격 저장소에 완전히 기록되므로 둘이 동기화되거나 둘 사이에 코드가 100% 일치합니다.이것을 "원격 Git Save"라고 생각합니다.원격 저장소의 코드를 컴퓨터에 로컬로 저장한 것으로 덮어씁니다.이것은 처음에는 말이 안 됩니다.그러면 리모콘의 다른 개발자들의 변경 사항이 지워지지 않을까요?원격이 변경 사항과 충돌하거나 로컬 저장소에 먼저 필요한 원격 변경 사항이 없는 경우에는 어떻게 해야 합니까?이것은 처음에는 아무도 이것이 "합병", "커밋", "풀 요청" 등과 동일한지 온라인에서 설명할 수 없었기 때문에 저를 혼란스럽게 했습니다.한 가지 조건에서만 작동하는 것으로 나타났습니다.그렇지 않으면 밀어내기를 차단하고 실패합니다!

사용자만 원격 레포를 변경하고 두 코드 기반이 로컬로 추가한 커밋 이외에 동일한 경우에만 "푸시"가 작동합니다.그렇지 않으면 해당 리모컨에서 다른 사용자가 변경한 내용은 푸시를 취소합니다.생각해 보세요push로컬 담당자와 동일한 복사본의 "개인 원격 쓰기"로 사용할 수 있습니다.하지만 많은 개발자들이 당신과 마찬가지로 원격 복사에 대한 변경사항을 푸시할 것이라는 것을 알고 있습니다.따라서 푸시가 실패하고 모든 사용자가 로컬 복사본과 이 설계의 원격 복사본과 동기화되지 않습니다.

앞서 언급했듯이, 이 푸시는 변경하기 전에 원격 저장소가 로컬 저장소와 동일한 상태에 있는 경우에만 허용됩니다(원격 저장소에서는 차단되지 않습니다).즉, 원격 프로젝트에 로컬 변경사항을 적용하고 다음을 사용하여 완전히 덮어쓸 수 있습니다.push로컬 변경사항을 적용할 때 원격 보고서가 다른 개발자에 의해 수정되지 않은 경우.그것은 사람들을 혼란스럽게 하는 Git의 이상한 측면 중 하나입니다.로 repo를 .pull또는 "rebase"는 "원격 복사본으로 먼저 로컬 레포 업데이트"를 뜻하는 고급 단어입니다.푸시가 차단된 경우 다음 작업을 수행합니다.pull원격 코드를 복사하고 코드 변경 사항을 로컬 복사본으로 "수정"합니다.다시 동기화되면 풀 또는 병합 후에도 커밋이 남아 있어야 하므로 푸시와 함께 커밋을 밀어 올릴 수 있습니다.

코드 변경이 커밋과 충돌하거나 다른 개발자가 동일한 코드 영역에서 수행한 코드 변경을 제외하고는 대부분의 경우 완벽하게 작동합니다.드문 경우이지만 로컬에서 충돌을 해결해야 다른 작업을 진행할 수 있습니다. 실수로 다른 개발자 변경 사항을 지울 수 있기 때문입니다.거기서pull requests(아래 참조)는 푸시 대신 유용합니다. 전자는 코드 소유자 또는 관리자가 원격 저장소 변경을 허용하기 전에 원격 복사에서 주요 코드 변경을 수동으로 해결하도록 강제하기 때문입니다.

흥미롭게도, "풀"은 "푸시"와 동일한 기능을 수행하지만, 이 경우에는 최신 원격 프로젝트의 복사본을 로컬 깃 시스템으로 끌어다 놓고 "푸시"처럼 변경사항을 덮어쓰지 않고 자신의 복사본으로 "통합"합니다.물론 이렇게 하면 원격 복사본과 로컬 복사본을 다시 동기화할 수 있지만, "푸시"를 다시 사용하여 원격 복제에서 업데이트하도록 설정된 새 커밋은 제외됩니다.

로컬 복사본을 원격으로 동기화한 후에는pull이제 할 수 있습니다.push그리고 당신의 것을 보냅니다.commits또는 변경 내용을 다시 원격 복사본으로 되돌리고 다른 모든 개발자가 변경한 내용과 병합했음을 알고 안전하게 덮어씁니다.

그 후에push로컬 복사본의 커밋 또는 변경 사항을 사용하여 원격 복사본에 기록합니다. 원격은 사용자의 로컬 복사본과 정확히 일치합니다.둘 다 일치하기 때문에 로컬에서 수행한 추가 커밋이나 저장은 사용자처럼 리모컨을 변경한 개발자가 없는 한 풀 없이 원격으로 다시 푸시할 수 있습니다.이 경우 Git는 푸시 시 항상 경고를 표시합니다.당신은 그것을 망칠 수 없습니다.당신은 "강제" 푸시, "기본" 및 기타 트릭을 할 수 있지만 그것은 중요하지 않습니다.그러나 다른 개발자가 변경 사항을 푸시하는 즉시 다시 동기화되지 않고 푸시하기 전에 다시 풀을 수행해야 합니다.

커밋-풀-푸쉬는 Git 개발의 진정한 리듬입니다. 아무도 당신이 이해하고 있다고 생각하지 않고 아무도 하지 않습니다.대부분은 그렇지 않습니다.그것은 단지 직관적이거나 논리적이지 않습니다.

물론 당신은 밀어넣기를 "강제"하고 모든 것을 덮어쓸 수 있습니다.하지만 이 시스템은 당신이 그것을 시도하기 전에 당신에게 경고할 것입니다.이 풀 앤 푸시 시스템은 한 개발자가 소유한 원격 저장소에서 한 지점을 업데이트할 때 항상 더 잘 작동합니다.원격에서 새 사용자가 추가하거나 변경하는 즉시 실패합니다.이로 인해 모든 사용자가 원격으로 다시 동기화될 때까지 밀고 당기기 경고와 실패가 발생합니다.이 작업이 완료되면 개발자는 코드가 원격과 다시 일치할 때 변경사항을 푸시할 수 있습니다.하지만 깃을 사용하는 것이 더 좋습니다.pull request원격 저장소로 이동하는 분기 및 코드의 변경 또는 병합이 많은 경우 명령을 실행합니다.

마지막으로, Git에서 개발 중인 사람들은 거의 항상 소프트웨어를 변경하기 전에 먼저 새로운 로컬 및 원격 repo 지점을 만드는 것이 좋습니다.그런 경우에,push그리고.pull코드 변경은 다른 개발자 변경과 충돌하지 않는 단일 개발자에 의해 소프트웨어의 격리된 분기에서 거의 항상 수행되기 때문에 완벽합니다.그러면 한 개발자가 자신의 지점에서 작업하는 것이 일반적인 이유를 설명합니다. 그 경우,push그리고.pull완벽하게 작동하고, 변경사항을 빠르게 푸시/수정할 수 있으며, 코드 충돌을 일으키지 않으며, 한 개발자가 나중에 를 사용하여 주요 지점으로 병합하도록 푸시하는 원격 repo 분기에 최종 로컬 변경사항의 복사본을 저장할 수 있습니다.pull request시스템이 아래에 설명되어 있습니다.

이상한 당기기 요청

Git 퍼즐의 마지막 부분.apull request로컬 저장소 코드를 끌어 올리는 원격 저장소의 관점에서 볼 때는 "문제"입니다.그러나 이는 요청이며 처음에는 물리적으로 아무것도 당기지 않거나 변경하지 않으며 코드를 푸시하거나 병합하지 않습니다.로컬 레포에서 원격 레포로 코드를 검토하고 승인된 경우 코드를 원격 레포로 가져오라는 요청입니다.

pull request원격 저장소 관리자 또는 소유자에게 코드 변경 사항 또는 커밋을 업로드하고 로컬 저장소 변경 사항을 검토한 다음 승인 시 코드 변경 사항을 원격 저장소에 병합하도록 요청하는 것입니다.검토한 로컬 리포 커밋 또는 변경 사항을 승인하면 로컬 리포 코드 또는 브랜치를 가져와 원격 리포 브랜치에 병합합니다.

원격 저장소에는 운영을 위해 준비 중인 원격 저장소의 중요한 코드 최상위 분기를 제어하는 관리자 또는 소유자가 있습니다.그들은 코드의 품질을 어느 정도 제어하지 않고 코드의 변경 사항을 이러한 더 큰 분기로 병합하는 것을 좋아하지 않습니다. 할 때.pull request로컬 개발자로서 일부 코드 분기가 완료되었으며 로컬 리포 코드를 원격 리포 코드로 수동으로 끌어올리길 원한다는 것을 관리자 또는 원격 리포 소유자에게 알립니다.은 이는다같다니습과와 .push로컬에서 원격 저장소로 이동하지만, 이 경우에는 최고 원격 저장소 소유자가 반대 방향으로 작업을 완료해야 합니다.또한 먼저 원격 저장소 소유자의 수동 코드 검토 및 변경 승인이 필요합니다.

참고: 가 두 원격 repo 분기 간에 코드를 병합하는 이 더 일반적이며, 일반적으로 로컬 커밋 변경뿐만 아니라 주 원격 분기에 병합되어야 하는 원격 서버 또는 장치의 완료된 코드 분기에 영향을 미칩니다.다시 말하지만, 직관적이지는 않지만, 여기 있습니다!

만약 당신이 가지고 있다면 당신은 왜 당기기 요청이 필요합니까?push그리고.pullGit 명령이 코드를 동기화 및 병합합니까? pull requests수많은 사용자가 주요 원격 저장소 지점에 병합하여 완료된 지점에 큰 변경 사항을 적용하고 밀어넣는 시나리오에서 푸시보다 더 효과적으로 작동합니다. 그리고 주요 릴리스 또는 코드 기반 업데이트로 이동하기 전에 먼저 테스트하거나 코드를 검토해야 하는 많은 코드가 충돌하거나 추가될 수 있습니다. Push그리고 'Pull'은 한두 명의 개발자가 작업하고 공유하는 고립된 소규모 지사에서 더 잘 작동합니다.하는 것이 훨씬 쉽습니다.pull그리고.push복잡한 원격 저장소 변경 사항의 대규모 분기를 원격 저장소의 마스터 분기로 병합하는 것보다 로컬 저장소와 원격 저장소 간의 코드를 생성할 수 있습니다.

그러니까 기억해 둬...

로컬 및 원격으로 제어하는 작은 분기를 업데이트하려면 'Push'를 사용합니다.

'Pull Request'를 사용하여 원격 리포지토리 사용자가 사용자의 작은 분기를 원격 서버의 큰 분기로 병합하도록 합니다.

그래서 저는 생각하는 것을 좋아합니다.pull requests마스터 푸시 및 마스터 푸시로서push로컬 푸시로.Git 사람들이 이러한 프로세스의 이름을 더 논리적이고 이해하기 쉽게 만들었으면 좋았을 것입니다.그것은 전혀 직관적이지 않습니다!

알고 보니pull request또한 대용량 코드 스택을 중요한 최상위 원격 분기에 병합하거나 프로젝트의 분기를 병합할 때 관리자 또는 팀원의 권한을 먼저 요청하는 코드 보안 계층을 추가하는 방법입니다.따라서 팀원들에게 대량의 로컬 레포코드 변경 사항을 승인하고 중요한 원격 레포 지점으로 이동하기 전에 먼저 커밋하도록 요청합니다.

이는 코드 검토 및 승인을 통해 중요 분기에 대한 코드 업데이트를 먼저 보호하는 역할을 합니다.그러나 많은 팀에서 업데이트 중인 원격 저장소를 사용하여 더 중요한 분기 및 병합의 코드 변경을 테스트 및 승인하기 전에 일시 중지할 수도 있습니다.이 때문에 개발자 전용 코드의 작은 분기는 단순히 풀 앤 푸시 변경이지만 이러한 분기의 큰 병합은 일반적으로 풀 요청에 의해 푸시가 차단됩니다.이것은 푸시를 사용하여 완료된 분기에서 Git 트리 위로 더 큰 분기로 병합되는 경우에 더 일반적입니다.

온라인에는 이 차이를 설명하는 문서가 없기 때문에, 제가 Git를 수년간 사용한 후에도, 이것을 알아내는 데는 몇 시간과 몇 시간이 걸렸습니다.

따라서... 자신의 코드 변경이나 프로젝트 섹션을 할당할 때는 항상 커밋-풀-푸시 루틴을 사용합니다.먼저 repos를 풀다운하여 다른 개발자가 변경한 로컬 repos가 있는지 확인합니다.풀 전과 풀 후의 모든 로컬 변경 내용을 커밋하거나 저장합니다. 원한다면... 상관 없습니다.충돌이 있는 경우 로컬에서 해결해 보십시오.그런 다음 로컬 코드로 원격 복사본을 덮어쓰십시오.그러면 로컬 원격 저장소가 Git World에서 100% 동기화됩니다!

마지막으로 로컬 및 원격 분기가 완료되면 git 관리자에게 pull 요청을 보내고 완료된 원격 저장소 분기의 병합을 처리하도록 합니다.

Git 명령의 사용을 이해하는 것이 더 쉽습니다.add그리고.commitGitHub의 저장소에 로그 파일이 유지 관리되고 있다고 상상할 수 있습니다.

일반적인 프로젝트의 로그 파일은 다음과 같습니다.

---------------- Day 1 --------------------
Message: Completed Task A
Index of files changed: File1, File2

Message: Completed Task B
Index of files changed: File2, File3
-------------------------------------------

---------------- Day 2 --------------------
Message: Corrected typos
Index of files changed: File3, File1
-------------------------------------------
...
...
...and so on

나는 보통 하루를 시작합니다.git pull요청하고 a로 종료합니다.git push부탁한다.그래서 하루의 기록 안에 있는 모든 것들은 그들 사이에서 일어나는 것과 일치합니다.매일 몇 개의 파일을 변경해야 하는 하나 이상의 논리적 작업이 있습니다.이 작업 중에 편집된 파일이 인덱스에 나열됩니다.

이러한 각 하위 태스크(여기서는 태스크 A 및 태스크 B)는 개별 커밋입니다.git add명령은 '변경된 파일의 색인' 목록에 파일을 추가합니다.이 프로세스를 스테이징이라고도 하며 실제로는 변경된 파일과 수행된 변경 사항을 기록합니다.git commit명령은 나중에 참조하기 위해 사용할 수 있는 사용자 지정 메시지와 함께 변경사항 및 해당 인덱스 목록을 기록/최종화합니다.

저장소의 로컬 복사본만 변경하고 GitHub의 복사본은 변경하지 않습니다.이 후에, 당신이 할 때만.git push각 커밋에 대한 인덱스 파일과 함께 이러한 모든 기록된 변경을 수행하면 기본 저장소(GitHub)에 기록됩니다.

예를 들어, 가상 로그 파일의 두 번째 항목을 얻으려면 다음 작업을 수행해야 합니다.

git pull

# Make changes to File3 and File4
git add File3 File4

# Verify changes, run tests etc..
git commit -m 'Corrected typos'
git push

간단히 말해서,git add그리고.git commit기본 저장소에 대한 변경 사항을 체계적인 논리적 하위 변경 사항으로 분류할 수 있습니다.다른 답변과 의견이 지적했듯이, 물론 더 많은 용도가 있습니다.그러나 이것은 SVN과 같은 다른 인기 있는 시스템과 달리 Git이 다단계 수정 제어 시스템이 되는 가장 일반적인 용도 중 하나이며 구동 원리입니다.

Git commit은 공식적으로 변경 사항을 저장하는 것에 불과합니다.모든 커밋 메시지에 대해 커밋 메시지를 표시하고 커밋을 마치면 원격으로 푸시하여 전체적으로 변경 내용을 확인할 수 있습니다.

즉, 원격으로 푸시하기 전에 수많은 커밋을 수행할 수 있습니다(커밋 목록과 메시지도 확인할 수 있습니다).Git는 40자리 코드인 커밋 ID로 각 커밋을 저장합니다.

그리고 원격에서 내 변화를 보고 싶을 때만 Git push를 사용했습니다(그 후에 Jenkins에서 내 코드가 작동하는지 확인하겠습니다).

변경 내용을 커밋하면 로컬 저장소에 변경 내용을 단일 논리 집합으로 저장합니다.누르지 않고 여러 번 수행할 수 있습니다.푸시될 때까지 로컬 리포지토리에서 나가지 않으므로 다른 사용자가 원격 리포지토리에서 꺼낼 때 커밋이 꺼지지 않습니다.

를 누르면 로컬 리포지토리에서 수행한 모든 커밋이 원격 리포지토리로 전송되므로 이 원격 리포지토리를 공유하는 다른 개발자가 풀할 때 변경 내용이 로컬 리포지토리로 전송됩니다.여기서 Git 명령과 치트 시트를 확인하십시오.

git commit로컬 리포지토리에 준비된 파일을 커밋합니다. git push로컬 측의 마스터 분기를 원격 마스터 분기와 빨리 병합하는 것입니다.하지만 합병이 항상 성공하는 것은 아닙니다.거절이 나타나면, 당신은 해야 합니다.pull성공할 수 있도록git push.

언급URL : https://stackoverflow.com/questions/2745076/what-are-the-differences-between-git-commit-and-git-push

반응형